diff --git a/public/css/kalamar-0.40.3.css b/public/css/kalamar-0.40.3.css
new file mode 100644
index 0000000..395398d
--- /dev/null
+++ b/public/css/kalamar-0.40.3.css
@@ -0,0 +1,2 @@
+﻿@font-face{font-family:'FontAwesome';src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media (min-width: 640px){dl.flex>div{width:50%}}@media (min-width: 800px){dl.flex>div{width:33.3333333333333%}}@media (min-width: 1200px){dl.flex>div{width:25%}}@media (min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:'FontAwesome';content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:':';color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:'*'}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:'FontAwesome';white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.pref:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.pref:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}ul.menu>li,ul.menu>span.pref:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu>span.pref.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu>span.pref:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px;border-radius:6px;border-width:2px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:''}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana, tahoma, arial, Helvetica, sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100%}body{position:relative;min-height:100%;font-size:12pt;margin:0;padding:0}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color 0.3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}a[onclick$='return PArok(this,false)']{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$='return PArok(this,false)']>span:nth-child(1n+2){display:none}a[onclick$='return PArok(this,false)']>span:nth-child(1)::after{content:"@"}.clear{clear:both}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}.hljs{display:block;padding:0.5em}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}#search{position:relative;margin-bottom:30px;overflow:visible}#search div.matchinfo{display:none}#search>ol{overflow-x:hidden;overflow-y:visible;width:auto;text-indent:0;list-style-type:none;margin:0;padding:0;border:1px solid #87888a;font-size:10pt}#search>ol>li{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;align-content:stretch;border-style:solid;border-color:#f6a800;border-width:0}#search>ol>li .button-group.button-view{display:none}#search>ol>li:nth-of-type(even) div.match-main div.match-wrap{background-color:#fefefe}#search>ol>li p.ref{display:none}#search>ol>li div.meta,#search>ol>li div.match-main{position:relative;cursor:pointer}#search>ol>li div.match-main{display:block;flex:7 0;z-index:4;overflow:hidden}#search>ol>li div.match-main>div.match-wrap{width:99999%;margin-left:-49999.5%;background-color:#d9dadb;overflow-x:hidden;overflow-y:visible;white-space:normal}#search>ol>li div.meta{flex:1 0;min-width:12em;max-width:15em;text-align:left;width:2px;z-index:5;overflow-y:hidden;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#949597;color:#fefefe;font-size:75%;padding:0 5pt;border-color:#616263;border-style:solid;border-width:2px 1px 0 0}#search>ol>li div.meta:before{content:" ";display:inline-block;height:100%;vertical-align:middle}#search>ol>li div.meta:empty{border-width:0 1px 0 0}#search>ol>li div.meta.flip{background-color:#b3b4b5}#search>ol>li:first-of-type div.meta{border-top-width:0}#search>ol>li:last-of-type div.meta{border-bottom-width:0}div.snippet{text-overflow:ellipsis;text-indent:0;text-shadow:1px 1px rgba(255,255,255,0.5);font-size:0;white-space:nowrap !important}div.snippet>span,div.snippet mark{padding:5pt 0 6pt 0;font-size:10pt}div.snippet>mark,div.snippet>span.match{font-weight:bold;color:#333;text-shadow:none;padding-left:4pt;padding-right:2pt}div.snippet>span.match>span.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.snippet.startMore:before,div.snippet.endMore:after{content:"…";padding-left:2pt;padding-right:2pt}div.snippet div.flag{position:absolute;height:100%;top:0;left:0;width:11px;background-color:#f6a800;border-right:1px solid #e55d00}body.no-js #search>ol>li:active,#search>ol>li.active,#search>ol>li:target{position:relative;display:block;background-color:#f6a800;text-align:left;border-width:2px;white-space:normal;height:auto;width:auto;overflow:hidden}body.no-js #search>ol>li:active div.matchinfo,#search>ol>li.active div.matchinfo,#search>ol>li:target div.matchinfo{display:block}body.no-js #search>ol>li:active+li.active,#search>ol>li.active+li.active,#search>ol>li:target+li.active{border-top:2px solid #d9dadb;padding-top:6px}body.no-js #search>ol>li:active+li.active .button-group.button-view,#search>ol>li.active+li.active .button-group.button-view,#search>ol>li:target+li.active .button-group.button-view{padding-top:6px}body.no-js #search>ol>li:active .snippet,#search>ol>li.active .snippet,#search>ol>li:target .snippet{white-space:normal !important;padding:2pt 0 5pt 5pt;background-color:#f4eebb;margin-top:0;margin-right:20px;margin-bottom:0;margin-left:0}body.no-js #search>ol>li:active .snippet span,#search>ol>li.active .snippet span,#search>ol>li:target .snippet span{display:inline !important}body.no-js #search>ol>li:active .snippet>*,#search>ol>li.active .snippet>*,#search>ol>li:target .snippet>*{background-color:transparent}body.no-js #search>ol>li:active .snippet div.flag,#search>ol>li.active .snippet div.flag,#search>ol>li:target .snippet div.flag{display:none}body.no-js #search>ol>li:active .snippet>span,#search>ol>li.active .snippet>span,#search>ol>li:target .snippet>span{line-height:1.4em;width:auto}body.no-js #search>ol>li:active .snippet>span.context-left,#search>ol>li.active .snippet>span.context-left,#search>ol>li:target .snippet>span.context-left{margin-left:0;display:inline;overflow:visible;text-align:left;width:auto}body.no-js #search>ol>li:active .button-group.button-view,#search>ol>li.active .button-group.button-view,#search>ol>li:target .button-group.button-view{display:block}body.no-js #search>ol>li:active div.match-main,#search>ol>li.active div.match-main,#search>ol>li:target div.match-main{display:block;width:100%}body.no-js #search>ol>li:active div.match-main div.match-wrap,#search>ol>li.active div.match-main div.match-wrap,#search>ol>li:target div.match-main div.match-wrap{cursor:default;min-height:20pt;background-color:#f6a800;width:100%;margin-left:0;overflow-x:visible;white-space:normal}body.no-js #search>ol>li:active div.meta,#search>ol>li.active div.meta,#search>ol>li:target div.meta{display:none}body.no-js #search>ol>li:active p.ref,#search>ol>li.active p.ref,#search>ol>li:target p.ref{display:block;color:#fefefe;padding:3pt 10pt 3pt 3pt;padding-right:20px;margin:0pt;width:100%;bottom:0;z-index:30}body.no-js #search>ol>li:active p.ref>span.sigle,#search>ol>li.active p.ref>span.sigle,#search>ol>li:target p.ref>span.sigle{font-size:75%;vertical-align:top;color:#f4eebb;float:right}#search ol span.context-left{display:inline-block;width:50.01%;text-align:right}#search ol.align-right{text-align:right}#search ol.align-right div.match-main span.context-right{display:inline-block;width:49.915%;text-align:left}#search ol.align-center div.match-main{width:100% !important}#search ol.align-center div.match-main>.match-wrap{position:relative;margin-left:0}#search ol.align-center li:not(.active) div.snippet{white-space:normal;text-align:center;width:100000pt;margin-left:-50000pt}#search ol.align-center li:not(.active) div.snippet span.context-left{display:inline-block;text-align:right;width:40000pt;margin-left:70vw}#search ol.align-center li:not(.active) div.snippet span.context-right{display:inline-block;text-align:left;width:40000pt}#search ol span.context-left:empty::after,#search ol span.context-right:empty::after{content:" ";display:inline-block}mark{background-color:inherit;color:inherit}mark>mark,em,.level-0{border-bottom-width:2px;border-bottom-style:solid;padding-bottom:0px !important;font-style:normal}mark>mark>mark,em>em,.level-1{padding-bottom:3px !important}mark>mark>mark>mark,em>em>em,.level-2{padding-bottom:6px !important}#search>ol>li:not(.active) mark>mark>mark>mark,#search>ol>li:not(.active) em>em>em{line-height:180%}#search>ol>li.active mark>mark>mark>mark,#search>ol>li.active em>em>em{line-height:250%}.class-1{border-color:#c1002b}.class-2{border-color:#009ee0}.class-3{border-color:#f6a800}.class-4{border-color:#9bad0b}.logo::after{content:"" !important}.logo>*{background-repeat:no-repeat;background-size:90%;background-position:50% 50%}.logo>*>span{position:absolute;margin-left:-3000px}#kalamar-bg{position:fixed;height:110%;width:175%;top:0;z-index:-5000;opacity:.1;background-image:url("../img/korap-bg-kalamar.svg");background-size:50%;background-repeat:no-repeat;background-position:50% 50%}#logos{position:relative;text-align:right;font-size:85%;right:0;width:100%;margin-left:20px;padding-left:60%}#logos>div{border-top:26px solid #f6a800;padding-right:2em}#logos p{text-align:left;display:inline-block}#ids-logo{display:block;width:21.0333333333em;height:6.6666666667em;background-image:url("../img/ids-leibniz-institute-for-the-german-language.svg")}h1{position:absolute;margin:0;margin-left:15px;left:0;top:0;width:7.8em;height:2.4em;z-index:105;background-size:72%;background-image:url("../img/korap-logo-kalamar.svg")}#overview{text-align:center;width:100%}div.matchtable>div{z-index:20;margin-left:179px;margin-right:20px;padding:0;overflow-x:auto;overflow-y:visible;width:auto}div.matchtable table{display:table;border-collapse:separate;border-spacing:0px}div.matchtable th{color:#fefefe}div.matchtable td,div.matchtable tbody th,div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted){cursor:pointer}div.matchtable td:empty{cursor:default}div.matchtable td:empty::after{content:" ";white-space:pre}div.matchtable td.matchkeyvalues{padding:0}div.matchtable td.matchkeyvalues>div{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}div.matchtable td.matchkeyvalues>div>span{color:#e55d00;text-align:right;padding-right:.5em}div.matchtable td.matchkeyvalues>div>span::after{content:":"}div.matchtable tr{outline:none}div.matchtable tr td.chosen,div.matchtable tr th.chosen,div.matchtable tr div.chosen{background-color:#9bad0b !important;color:#fefefe}div.matchtable tr>th:nth-of-type(1),div.matchtable tr>th:nth-of-type(2){border-top:2px solid #ff8000;width:88px;position:absolute;z-index:80;vertical-align:middle;left:0px}div.matchtable tr>th:nth-of-type(2){left:90px}div.matchtable tr>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;border:1px solid #f6a800}div.matchtable tr>td{background-color:#ffd080;white-space:nowrap;vertical-align:top;text-align:center}div.matchtable tr>td.mark{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td.mark{background-color:#ffd080}div.matchtable thead th{background-color:#ff8000;border-top-width:0px !important;text-align:center}div.matchtable thead th:nth-of-type(1),div.matchtable thead th:nth-of-type(2){text-align:left}div.matchtable thead th.mark{background-color:#e55d00}div.matchtable thead th.cutted{background-color:#f4eebb}div.matchtable thead th.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.matchtable tbody>tr:nth-of-type(1)>th{border-top-color:transparent}path.edge{stroke:#ff8000;stroke-width:2px;fill:none}g.arc.infocus>path.edge{stroke:#636f07}marker#arr{overflow:visible}marker#arr path{stroke:#e55d00;fill:#e55d00;fill-opacity:1;stroke-width:2}path.anchor{stroke:#e55d00;stroke-width:3;stroke-linecap:round;z-index:20}g.root rect.empty{stroke:#ff8000;fill:#ff8000;stroke-width:2px}g.middle rect,g.label rect{stroke:#ff8000;stroke-width:2px;fill:#ffd080}g.label.infocus rect{stroke:#636f07;fill:#dce883}g.middle.mark rect{fill:#ff8000}g.middle.mark>text{fill:#f4eebb}g.middle.mark>text>tspan{stroke:#f4eebb}g.leaf.mark text>tspan{font-weight:bold}g.leaf>rect{display:none}g>text>tspan{text-anchor:middle;font-size:9pt}g.leaf>text>tspan,text.leaf>tspan{font-size:10pt;overflow:visible}div.matchtree{overflow-x:hidden;overflow-y:visible;padding:0;margin-top:1pt}div.matchtree h6{display:inline;font-size:inherit;color:#fefefe;margin:0;padding:0 !important;float:left}div.matchtree h6>span{border-top:2px solid #ff8000;width:88px;text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;display:inline-block !important;margin:0}div.matchtree h6>span:nth-of-type(2){margin-left:2px}div.matchtree>div{position:unset;z-index:4;overflow-x:auto;margin:2px;margin-left:180px;margin-right:20px;background-color:#f4eebb}div.metatable>dl{margin-right:20px;margin-top:2px}div.metatable>dl>div{border-color:#f6a800}div.metatable>dl>div>*{padding:.2em}div.metatable>dl>div>dt{background:#ff8000;color:#fefefe;width:12.5em}div.metatable>dl>div>dd{background-color:#f4eebb;cursor:pointer}div.metatable>dl>div>dd.metakeyvalues{padding:0}div.metatable>dl>div>dd.metakeyvalues>div{padding:.2em}div.metatable>dl>div>dd.metakeyvalues>div::before{content:"\2022\00A0";color:#f6a800}div.metatable>dl>div>dd.chosen,div.metatable>dl>div>dd>div.chosen{background-color:#9bad0b !important;color:#fefefe}div.metatable>dl>div>dd[data-type="type:store"],div.metatable>dl>div>dd[data-type="type:attachement"]{background-color:#ffd080;cursor:default}div.metatable>dl>div>dd[data-type="type:store"] a,div.metatable>dl>div>dd[data-type="type:attachement"] a{color:inherit}div.metatable>dl.cbm-disabled>div>dd{cursor:default !important}div.matchinfo{position:relative;width:100%;padding-top:2px;height:auto;font-size:10pt;text-align:left}div.matchinfo:empty{display:none !important}div.matchinfo .view+.view{margin-top:8px !important}div.metatable,div.matchtable,div.matchtree{position:relative;background-color:#f6a800}div.button-group.button-panel.button-matchinfo{display:inline-block;margin-right:.5em}div.button-group.button-panel.button-matchinfo>span{position:relative;box-shadow:none}#pagination{position:fixed;font-size:0;right:10px;bottom:20px;z-index:35;padding:0;height:auto;line-height:0}#pagination>a{margin:0;font-size:10pt;padding:0}#pagination>a>span{padding-left:.4em;padding-right:.4em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);display:inline-block;line-height:2em;text-align:center;border-top-width:2px;border-bottom-width:2px;border-top-style:solid;border-bottom-style:solid}#pagination>a:not(:link):not([rel=self]) span{color:#87888a}#pagination>a.ellipsis>span>span{position:absolute;margin-left:-3000px}#pagination>a.ellipsis>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=self]>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;border-left-width:2px;border-right-width:2px;border-left-style:solid;border-right-style:solid}#pagination>a[rel=prev]>span{border-top-left-radius:6px;border-bottom-left-radius:6px;border-left-width:2px;border-left-style:solid}#pagination>a[rel=prev]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=prev]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=next]>span{border-top-right-radius:6px;border-bottom-right-radius:6px;border-right-width:2px;border-right-style:solid}#pagination>a[rel=next]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=next]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a:link:hover,#pagination>a:link:focus{outline:none}#pagination>a:link:hover span,#pagination>a:link:focus span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query{overflow-x:hidden;padding:.5em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;border-width:2px;border-style:solid;border-radius:6px;box-shadow:2px 2px 2px rgba(0,0,0,0.2)}pre.query:not(.unsupported){cursor:pointer}pre.query:not(.unsupported):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query:not(.unsupported):active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}pre.query.unsupported span{vertical-align:super;color:#009ee0;font-size:90%;font-weight:bold;cursor:help}#resultinfo{clear:both;text-align:right;line-height:1.5em;min-height:1.5em;margin-top:.4em;font-size:10pt}#resultinfo p.found{display:inline;padding:0;margin:0;text-align:right}#resultinfo.found{position:relative;margin-bottom:0px}#resultinfo.found .button-group>span{margin-bottom:0;border-bottom-width:0;box-shadow:none}#resultinfo.found .button-group>span:first-child{border-bottom-left-radius:0}#resultinfo.found .button-group>span:last-child{border-bottom-right-radius:0}div.result.panel .view{border:1px solid #87888a;background-color:#f6a800}.result.button-group.button-panel{display:inline-block;width:auto;vertical-align:bottom;line-height:1.5em}.result.button-group.button-panel>span{line-height:1.5em;border-width:1px 0}.result.button-group.button-panel>span:first-child{border-left-width:1px}.result.button-group.button-panel>span:last-child{border-right-width:1px}#total-results{color:#9bad0b;font-weight:bold}.no-results{margin:0 auto;text-align:center}.no-results code{font-weight:bold}.button-icon.align.left::after{content:""}.button-icon.align.right::after{content:""}.button-icon.align.center::after{content:""}.button-icon.show-kq::after{content:""}#tutorial{position:fixed;z-index:9999;top:5%;bottom:5%;left:2%;right:2%;padding-right:20px;background-color:#fefefe;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:4px;border-color:#616263;border-style:solid;border-radius:6px}#tutorial .button-group.button-view{background-color:#87888a;display:block;height:100%}#tutorial iframe{border-width:0;width:100%;min-height:100.1%;background-image:url("../img/korap-bg-kalamar.svg");background-repeat:no-repeat;background-position:center center;background-size:20%}body.embedded{background-color:#fefefe}body.embedded aside{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-top:0;background-color:#87888a}body.embedded aside>div{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}main.tutorial a.embedded-link::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}#koralquery{white-space:pre}#koralquery>div{background-color:#fefefe;overflow-x:auto;font-size:85%;margin-top:2pt;margin-right:20px;margin-bottom:2pt;margin-left:2pt}.alertify,.alertify-show,.alertify-log{-webkit-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-ms-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)}.alertify-hide{-webkit-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-log-hide{-webkit-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-cover{position:fixed;z-index:99999;top:0;right:0;bottom:0;left:0;background-color:white;filter:opacity(0);opacity:0}.alertify-cover-hidden{display:none}.alertify{position:fixed;z-index:99999;top:50px;left:50%;width:550px;margin-left:-275px;opacity:1}.alertify-hidden{-webkit-transform:translate(0, -150px);-moz-transform:translate(0, -150px);-ms-transform:translate(0, -150px);-o-transform:translate(0, -150px);transform:translate(0, -150px);opacity:0;display:none}:root *>.alertify-hidden{display:block;visibility:hidden}.alertify-logs{position:fixed;z-index:5000;bottom:10px;right:10px;width:300px}.alertify-logs-hidden{display:none}.alertify-log{display:block;margin-top:10px;position:relative;right:-300px;opacity:0}.alertify-log-show{right:0;opacity:1}.alertify-log-hide{-webkit-transform:translate(300px, 0);-moz-transform:translate(300px, 0);-ms-transform:translate(300px, 0);-o-transform:translate(300px, 0);transform:translate(300px, 0);opacity:0}.alertify-dialog{padding:25px}.alertify-resetFocus{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.alertify-inner{text-align:center}.alertify-text{margin-bottom:15px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:100%}.alertify-button,.alertify-button:hover,.alertify-button:active,.alertify-button:visited{background:none;text-decoration:none;border:none;line-height:1.5;font-size:100%;display:inline-block;cursor:pointer;margin-left:5px}@media only screen and (max-width: 680px){.alertify,.alertify-logs{width:90%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.alertify{left:5%;margin:0}}.alertify,.alertify-log{font-family:sans-serif}.alertify{background:#FFF;border:10px solid #333;border:10px solid rgba(0,0,0,0.7);border-radius:8px;box-shadow:0 3px 3px rgba(0,0,0,0.3);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box}.alertify-text{border:1px solid #CCC;padding:10px;border-radius:4px}.alertify-button{border-radius:4px;color:#FFF;font-weight:bold;padding:6px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.5);box-shadow:inset 0 1px 0 0 rgba(255,255,255,0.5);background-image:-webkit-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-moz-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-ms-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-o-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0))}.alertify-button:hover,.alertify-button:focus{outline:none;background-image:-webkit-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-moz-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-ms-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-o-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:linear-gradient(top, rgba(0,0,0,0.1), transparent)}.alertify-button:focus{box-shadow:0 0 15px #2B72D5}.alertify-button:active{position:relative;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.alertify-button-cancel,.alertify-button-cancel:hover,.alertify-button-cancel:focus{background-color:#FE1A00;border:1px solid #D83526}.alertify-button-ok,.alertify-button-ok:hover,.alertify-button-ok:focus{background-color:#5CB811;border:1px solid #3B7808}.alertify-log{background:#1F1F1F;background:#000;padding:15px;border-radius:4px;color:#FFF}.alertify-log-success{background:#5CB811;background:#5cb811}article.alertify-log-warn{background-color:#f6a800}article.alertify-log-warn code.src{color:#e55d00}article.alertify-log code.src{display:block;color:#000;font-size:70%}.alertify-log-error{background-color:#fe1a00}div.intro a:visited{color:#e55d00}div.intro div.announcement{background-color:#f4eebb;padding:8px;border:5px dashed #f6a800;border-radius:1em;width:90%;margin:auto}aside.active ~ main div.intro{margin-left:198px}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel a,.button-group.operators>span,.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:hover,.button-group.button-panel a:hover,.button-group.operators>span:hover,.button-group.operators a:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.button-group.button-panel>span:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span>span.check,.button-group.button-panel a>span.check{font-family:'FontAwesome';white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:'FontAwesome';white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}div.panel{position:relative;width:100%;display:block}div.view{position:relative;padding-top:2px;display:block;width:100%}div.view:not(.show){display:none}.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0,0,0,0.4)), color-stop(100%, rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-fixParent{z-index:auto !important;opacity:1.0 !important;-webkit-transform:none !important;-moz-transform:none !important;-ms-transform:none !important;-o-transform:none !important;transform:none !important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999 !important}.introjs-disableInteraction{z-index:99999999 !important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,0.9);border:1px solid #777;border:1px solid rgba(0,0,0,0.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,0.4);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999 !important;padding:2px;font-family:Arial, verdana, tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background:#ff3019;background:-webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));background:-moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-o-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,0.4)}.introjs-arrow{border:5px solid transparent;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:white}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:white}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:white}.introjs-arrow.right{right:-10px;top:10px;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:white}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:white}.introjs-arrow.left{left:-10px;top:10px;border-right-color:white}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:white}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,0.4);-webkit-transition:opacity 0.1s ease-out;-moz-transition:opacity 0.1s ease-out;-ms-transition:opacity 0.1s ease-out;-o-transition:opacity 0.1s ease-out;transition:opacity 0.1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:0.3em 0.8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:none;background-color:#ececec;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));background-image:-moz-linear-gradient(#f4f4f4, #ececec);background-image:-o-linear-gradient(#f4f4f4, #ececec);background-image:linear-gradient(#f4f4f4, #ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0px 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));background-image:-moz-linear-gradient(#ececec, #f4f4f4);background-image:-o-linear-gradient(#ececec, #f4f4f4);background-image:linear-gradient(#ececec, #f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:0.2em 0 0 0.2em;-moz-border-radius:0.2em 0 0 0.2em;border-radius:0.2em 0 0 0.2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-nextbutton{-webkit-border-radius:0 0.2em 0.2em 0;-moz-border-radius:0 0.2em 0.2em 0;border-radius:0 0.2em 0.2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0.0}25%{-webkit-transform:scale(0);opacity:0.1}50%{-webkit-transform:scale(0.1);opacity:0.3}75%{-webkit-transform:scale(0.5);opacity:0.5}100%{-webkit-transform:scale(1);opacity:0.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0.0}25%{-moz-transform:scale(0);opacity:0.1}50%{-moz-transform:scale(0.1);opacity:0.3}75%{-moz-transform:scale(0.5);opacity:0.5}100%{-moz-transform:scale(1);opacity:0.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0.0}25%{transform:scale(0);opacity:0.1}50%{transform:scale(0.1);opacity:0.3}75%{transform:scale(0.5);opacity:0.5}100%{transform:scale(1);opacity:0.0}}.introjs-helperLayer{background-color:transparent}.introjs-tooltip.gTstartSearch{max-width:500px}.tgreeting{font-weight:bold;color:#e55d00}.pfirstStep{width:500px}.introjs-donebutton{float:right;margin-left:5px}.introjs-skipbutton{color:#333}ul.client-list{padding-left:1.5em}ul.client-list li.client{list-style-type:none}ul.client-list li.client span.client-name::before{margin-left:-1.5em}ul.client-list li.client span.client-desc{font-size:70%;display:block}span.client-name{font-weight:bold}span.client-name::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;width:1.5em;content:"";color:#009ee0;font-size:100%}section#news{background-color:#e3e8a3;mix-blend-mode:soft-light;padding:1em;padding-right:2em;border-radius:6px;border-left:5px solid #636f07}section#news dt{float:left;clear:left;width:15ex;text-align:right;font-weight:bold}section#news dd.maintenance>h4::after{font-family:'FontAwesome';white-space:nowrap;color:#c1002b;content:" "}section#news dd{margin:0 1ex 0 16ex;padding:0 0 0.5em 1em}section#news dd>p{max-width:80ex;margin-block-start:0ex}section#news dd>h4{margin-block-start:0ex;margin-block-end:0.33ex}@media all and (max-width: 42.5em){section#news dt{text-align:left;float:none;width:auto;padding-bottom:.2em}section#news dd{margin-left:1em}}div.view.widget{padding-right:20px}div.view.widget>iframe{margin:0;box-sizing:border-box;padding:0;width:100%;overflow-x:auto}div.panel.result>div>div.widget>iframe{background-color:#fefefe}main{padding-bottom:20pt;margin-left:40px;margin-right:20px}main.embedded{margin-left:14px;margin-right:14px}main p{text-align:justify;hyphens:auto}main h2#page-top{margin-top:0;padding-top:1em}main.page{margin-left:245px}main.page p code,main.page li code,main.page dd code,main.page dt code{background-color:#d9dadb;color:#87888a;padding:0 .5em;border-radius:6px}main p.hint{margin:0 auto;text-align:center}ul.menu.hint{display:inline-block;white-space:normal;text-align:left;max-width:23em !important;top:0}ul.menu.hint>li:first-of-type{border-top-width:1px;border-top-left-radius:0;border-top-right-radius:0}div.alert.hint{position:absolute;background-color:#fe1a00;color:#fefefe;padding:3pt 6pt;margin-top:8px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);width:auto;min-width:10em;max-width:23em !important;transition:opacity 0.2s ease 0s;border-radius:6px;border-top-left-radius:0}div.alert.hint::before{position:absolute;content:"";display:block;top:-12px;left:0;width:0;white-space:normal;border-width:0 8px 12px 0;border-style:solid;border-color:#fe1a00 transparent}.hint.mirror{position:absolute;display:block;left:0;top:0;z-index:90;white-space:pre-wrap;height:0}.hint.mirror>span{opacity:0;white-space:pre-wrap;overflow:hidden}.hint.mirror>div{position:absolute;display:block;cursor:pointer;transition:left 0.2s ease 0s;top:0;left:0;text-align:left;padding:0;border-top:5px solid #f6a800;height:10px;width:1.2em}.hint.mirror>div:hover:not(.active){border-top:10px solid #f6a800}.hint.mirror>div.active{border-top-width:0;height:0;width:23em}#q-field{display:block;margin-bottom:3px;width:100%;margin:0}#q-field::-webkit-search-cancel-button{display:none}#q-field.loading{background-color:#f4eebb;background-image:none}#searchbar{position:relative;width:100%;padding:0;padding-right:70px}#searchbar button[type=submit]{position:absolute;padding:0;right:40px}#searchbar button[type=submit]:not(.loading)::after{content:""}.query.panel{padding-right:70px}.query.button-group.button-panel{display:block;width:auto;text-align:right;vertical-align:top;line-height:1.3em}.query.button-group.button-panel>span{box-shadow:none}.vc{margin-top:4pt}.vc .builder{position:initial}.vc .docGroup{position:relative;display:inline-block;margin-left:4em;padding:4pt 2pt 4pt 0pt;border-radius:12px;border-style:solid;border-width:0 .4em}.vc .docGroup .docGroup{display:block}.vc .docGroup[data-operation]>.doc:first-child::before,.vc .docGroup[data-operation]>.docGroup:first-child::before{content:none}.vc .docGroup[data-operation]>.doc::before,.vc .docGroup[data-operation]>.docGroup::before{position:absolute;display:inline-block;text-align:right;width:4em;margin-left:-4.5em;line-height:1.5em;border-top:2px solid transparent}.vc .docGroup[data-operation]>.docGroup::before{margin-left:-4.9em}.vc .docGroup[data-operation=or]>.doc::before,.vc .docGroup[data-operation=or]>.docGroup::before{content:"or"}.vc .docGroup[data-operation=and]>.doc::before,.vc .docGroup[data-operation=and]>.docGroup::before{content:"and"}.vc .docGroup>.operators{position:absolute;display:block;vertical-align:middle;top:10px;left:3px;margin-left:100%;padding:0}.vc .docGroup>.operators>span:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.vc .doc{line-height:170%;padding-left:4em}.vc .doc>span+span,.vc .doc>span+div+span,.vc .doc>span+ul+span{margin-left:5pt}.vc .doc>span.key,.vc .doc>span.value{font-weight:bold}.vc .doc>span.value[data-type=regex]{font-style:italic}.vc .doc>span.value[data-type=regex]::after,.vc .doc>span.value[data-type=regex]::before{content:'/'}.vc .doc>span.key{position:relative}.vc .doc>span.key>ul{margin:0;margin-left:3.3em}.vc .doc>span.key.fixed{color:#9bad0b}.vc .doc.unspecified>span,.vc .doc span.unspecified{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding:0 4px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-style:solid;border-width:2px;border-radius:6px}.vc .doc>.operators{display:inline-block;margin-left:10px}.vc .rewritten .rewrite{display:inline-block;margin-left:4pt;color:#f6a800}.vc .rewritten .rewrite::after{font-family:'FontAwesome';white-space:nowrap;font-style:normal;font-weight:normal;content:"";text-decoration:underline}.vc .rewritten .rewrite>span{display:none}.vc .operators{opacity:0;white-space:nowrap;padding:0;font-size:0;line-height:0;text-align:center}.vc>.docGroup{margin-left:0}.vc .menu{display:inline-block}.vc .menu li[data-type=ref]::before,.vc span.key.ref::before{font-family:'FontAwesome';white-space:nowrap;content:"";padding-right:4pt;font-style:normal;font-weight:normal}.vc div.value{position:absolute;display:inline-block;min-width:max-content;z-index:8000;padding:4pt;margin-top:-6pt;border-radius:6px;border-width:2px;border-style:solid}.vc div.value input{border-width:0;outline-width:0}.vc div.value>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:inline-block;padding:0 4pt;margin-left:4pt;font-size:80%;font-style:italic;border-width:2px;border-style:solid;border-radius:6px}.vc div.value.regex>input{font-style:italic}.vc div.value.regex>div{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}.vc:not(.fragment) .docGroup,.vc:not(.fragment) .doc{color:#616263}.vc:not(.fragment) .docGroup:hover{background-color:rgba(255,255,255,0.3)}.vc:not(.fragment) .doc>span:not(.fixed){cursor:pointer}.vc:not(.fragment) .doc>span:not(.fixed):hover{color:#f6a800}.vc:not(.fragment) .doc.unspecified>span:hover,.vc:not(.fragment) span.unspecified:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.vc:not(.fragment) .doc:hover>.operators,.vc:not(.fragment) .docGroup:hover>.operators{opacity:1}.vc:not(.fragment) .docGroup[data-operation]>.doc::before,.vc:not(.fragment) .docGroup[data-operation]>.docGroup::before{color:#f6a800}.vc:not(.fragment) .docGroup[data-operation=or]{border-color:#f6a800}.vc:not(.fragment) div.value{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2)}.vc:not(.fragment) div.value>div{cursor:pointer}.vc:not(.fragment) div.value>div:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.docGroup>.operators{z-index:30}.docGroup .docGroup>.operators{z-index:31}.docGroup .docGroup .docGroup>.operators{z-index:32}.docGroup .docGroup .docGroup .docGroup>.operators{z-index:33}.docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:34}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:35}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:36}.vc.fragment>div>div.docGroup{margin-left:0}.vc.fragment .doc{margin-right:2em}#collection{line-height:1em;border-radius:6px}#vc-choose>span.rewritten::after{font-family:'FontAwesome';white-space:nowrap;color:#f6a800;padding:0;padding-left:4px;content:"";text-decoration:underline;font-style:normal;font-weight:normal}div#vc-view{position:relative}div#vc-view>div.vc{display:none;margin:1.3em 0 .5em 0;border:2px solid #636f07;background-color:#fefefe}div#vc-view>div.vc.active{display:block}div#vc-view>div.vc>div:first-child{padding:1.3em}div.panel.vcinfo{padding:3pt 0pt 3pt 3pt;background-color:#636f07}div.panel.vcinfo div.button-group>span{box-shadow:none}div.stattable{display:flex;flex-direction:row;margin-right:20px}div.stattable>dl{margin-bottom:4px}div.stattable>dl>div{border-color:#636f07}div.stattable>dl>div>dt{background-color:#8a9a0a;width:15em;margin:0}div.stattable>dl>div>dt::after{content:":"}div.stattable>dl>div>dd{background-color:#dce883;color:#616263}div.stattable.stdisabled dt,div.stattable.stdisabled dd{background-color:#b9c46a;color:#636f07;text-shadow:none}div.reloadStatB>span.refresh{margin-left:2pt}span.refresh::after{vertical-align:sub;content:""}@media (min-width: 1680px){div.stattable dl.flex>div{width:inherit}}div.datepicker{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:absolute;display:inline-block;z-index:90;font-size:80%;padding:4pt;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:2px;border-style:solid;border-radius:6px}div.datepicker>div{font-size:120%;width:45%}div.datepicker>div.month{float:right}div.datepicker>div>span{display:inline-block;overflow:hidden;white-space:nowrap}div.datepicker>div>span:first-child,div.datepicker>div>span:last-child{width:15%}div.datepicker>div>span:first-child::before,div.datepicker>div>span:last-child::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;text-align:center;cursor:pointer;min-width:14px}div.datepicker>div>span:first-child::before{content:""}div.datepicker>div>span:last-child::before{content:""}div.datepicker>div>span:nth-child(2){display:inline-block;cursor:pointer;width:70%;text-align:center;text-overflow:ellipsis;border-radius:6px;border-style:solid;border-width:2px;border-color:transparent}div.datepicker>div>span:nth-child(2):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker>div>span:nth-child(2).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker table{border-collapse:separate;border-spacing:1px}div.datepicker input{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-left:.4em;padding-right:.4em;background-color:#fefefe;width:100%;border-style:solid;border-width:1px}div.datepicker td{padding-left:.4em;padding-right:.4em;text-align:center;border-style:solid;border-width:1px}div.datepicker td:not(.out){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);cursor:pointer;background-color:#fefefe}div.datepicker td:not(.out).today{background-color:#bce4f7;color:#009ee0;text-shadow:none}div.datepicker td:not(.out).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker td:not(.out):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker td.out{border-color:transparent}#ql-field{position:relative;background-color:#9bad0b;cursor:pointer;margin:0;outline:none;border:none;display:inline-block;color:white;border-width:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#ql-field:checked{outline:none}#ql-field>option{padding:0pt 2pt;outline:none}#ql-field:-moz-focusring{color:transparent;text-shadow:0 0 0 white}input.pipe{display:none}header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;background-color:#9bad0b;padding:8px 0 0 8px;font-size:10pt;color:#fefefe}header span.select{display:inline-block;cursor:pointer;line-height:1.8em;border-width:0;border-bottom-width:3px;border-style:solid;border-color:transparent}header span.select>span{font-weight:bold}header span.select:hover{color:#636f07;border-color:#636f07}header span.select::after{font-family:'FontAwesome';white-space:nowrap;pointer-events:none;text-align:center;content:"";padding-left:4pt;padding-right:4pt}header span.select.active{border-color:#f6a800}header span.select.active::after{content:""}header form{position:relative;display:block;padding-left:230px;min-height:2.7em;margin:0px}header input{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0}header .button{color:#fefefe;line-height:2em;margin-right:40px}header .button.right{float:right;display:inline-block}header .button.top{position:absolute;display:block;top:0;right:0;margin-right:0;width:20px;background-color:#636f07;text-align:center;height:100%;z-index:20}header .button.top>a:hover{color:#fefefe}header .button>a{color:#fefefe;cursor:pointer;position:relative;font-size:120%}header .button>a>span{position:absolute;margin-left:-3000px}header .button>a::after{font-family:'FontAwesome';white-space:nowrap}header .button>a.tutorial::after{content:""}header .button>a.question::after{content:""}header .button>a.login::after{content:""}header .button>a.logout::after{content:""}.query.button-group>span{border-top-width:0;border-color:white}.query.button-group>span:first-child{border-top-left-radius:0}.query.button-group>span:last-child{border-top-right-radius:0}footer{background-color:#616263;position:absolute;bottom:0;padding-bottom:2px;font-size:70%;width:100%;text-align:right}footer a:link{margin:0 .5em;color:#d9dadb}footer a:visited{color:#d9dadb}footer a:hover{color:#fefefe}footer a[href^="http://"]::after,footer a[href^="https://"]::after{content:none}footer span.separator:after{content:"-";color:#d9dadb}aside{background-color:#636f07;color:#fefefe;width:230px;position:fixed;display:block;transition:all .3s ease-in-out;outline:none;font-size:10pt;z-index:100;top:0;left:0;height:100%;padding-top:65px}aside>div{overflow-y:auto;overflow-x:visible;max-height:100%}aside>*{opacity:1}aside::after{font-family:'FontAwesome';white-space:nowrap;position:absolute;display:block;opacity:0;cursor:pointer;right:0;bottom:0;content:"";font-size:16pt;width:16pt;height:17pt;padding:6pt;background-color:#636f07;border-top-right-radius:6px;margin-right:-20px}aside h2,aside legend{line-height:2em;text-align:center;padding:0;margin:0;font-size:100%;font-weight:bold}aside ul.nav{list-style-type:none;margin:0;font-size:10pt;text-indent:0;padding:0}aside ul.nav li{padding:0}aside ul.nav li>a{padding:3pt 6pt}aside ul.nav li>a:visited{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}aside ul.nav li.folded.active ul{display:block}aside ul.nav li.folded ul{display:none}aside ul.nav li.active>a:link{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}aside ul.nav li>a:link{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:block;border-right-width:2px;border-right-style:solid}aside ul.nav li>a:link:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}aside ul.nav li h3{padding:0;margin:0;font-weight:bold;font-size:100%}aside ul.nav li>a{padding-left:6pt}aside ul.nav li li>a{padding-left:18pt}aside ul.nav li li li>a{padding-left:36pt}aside nav>ul>li>a{font-weight:bold}aside fieldset{position:relative;border-width:0}aside fieldset legend{display:none}aside fieldset input[type=text],aside fieldset input[type=password]{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0;width:100%}aside fieldset>form>div{position:relative;width:100%;margin-top:4px;padding-right:30px}aside fieldset>p{color:#9bad0b}aside fieldset>p.announcement{color:#fefefe}aside fieldset>p.announcement>time{display:block;font-size:70%}aside fieldset hr{border:none;border-top:2px solid #d9dadb}aside fieldset ul{display:block;font-size:80%;text-align:right;padding:0;margin-top:0}aside fieldset ul>li{display:inline}aside fieldset ul>li:first-child::after{content:' | '}aside fieldset button{position:absolute;top:0;right:0}aside fieldset button::after{content:""}aside.off,aside:not(:focus):not(.active){margin-left:-210px}aside.off::after,aside:not(:focus):not(.active)::after{opacity:1}aside.off>*,aside:not(:focus):not(.active)>*{opacity:0;transition-property:opacity;transition-duration:.3s}aside.off::after{display:none}body.no-js aside{position:relative;display:block;transition:none;margin-left:0 !important;padding-top:0;width:100%;top:0}body.no-js aside>*{opacity:1 !important;transition:none}body.no-js aside form.login>input,body.no-js aside form.login>div{width:auto;margin-top:0}body.no-js aside form.login>input:first-of-type,body.no-js aside form.login>div:first-of-type{float:left;margin-right:1em}body.no-js aside form.login button{height:100%}body.no-js aside p,body.no-js aside::after{display:none}body.no-js main div.intro{margin-left:8px !important}#activate{text-align:right;background-color:#f6a800;margin-top:0;padding:8px;padding-right:40px;color:#fefefe;font-size:80%}@media all and (max-width: 42.5em){body,#search>ol,#search div.snippet>span,header,header input,div#resultinfo,#pagination>a{font-size:9pt}header{padding-right:8px}header form{padding-left:0;padding-top:33px}.vc{font-size:9pt}.vc .builder .doc{padding-left:3em}.vc .builder * .docGroup{margin-left:3em}.vc .builder>.doc{padding-left:.5em}.vc .builder>.docGroup{margin-left:.5em}h1{margin-left:10px;width:130px;height:40px;background-size:100%;background-position:50% 0;z-index:110}#searchbar{padding-right:30px}#searchbar input{font-size:9pt}#searchbar button[type=submit]{right:0}.level-1{padding-bottom:2px}.level-2{padding-bottom:4px}main{margin-left:4px;margin-right:4px}header .button{margin-right:4px}header .button.top{height:auto}#search ol>li:target>div>div.snippet,#search ol>li.active>div>div.snippet{margin:2px 2em 2px 4px}#search ol>li div.meta{display:none}div.matchinfo{font-size:9pt}div.matchtable tr>*{padding:1pt 3pt}div.matchtree h6{display:block;float:none}div.matchtree>div{margin-left:2px}#kalamar-bg{overflow:hidden}#logos{margin-left:0;margin-right:0}#logos>div{border-top-width:14px;padding-right:0}#logos>div .logo>*{background-size:60%;background-position:0 0}div.intro{width:100%}body.embedded aside>div{top:0;transform:translateY(0)}aside:not(:focus):not(.active){margin-left:-230px}aside:not(:focus):not(.active)::after{font-size:12pt;height:11pt;text-align:right;padding-right:3pt;padding-top:2pt}aside ul{font-size:9pt;line-height:1em}aside.active ~ main div.intro,aside.active ~ main.page{margin-left:4px !important}aside.active{position:relative;display:block;padding-top:0;width:100%;top:0;border-width:0}aside.active fieldset input{font-size:9pt}aside.active::after{display:none}aside.active p,aside.active hr{display:none}#tutorial{border-radius:0;border-width:0;right:0;left:0;bottom:0;top:0;padding:0}#tutorial iframe{border-radius:0}#tutorial>ul.action.right{height:1.5em;right:20px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}main.page{margin-right:20px}}@media print{body,html,select,g>text{color:black}header,aside{display:none}main.page{margin:1em}#kalamar-bg{display:none}a.embedded-link{color:black;text-decoration:underline}pre.query.tutorial{background-color:white;color:black;margin-left:1em;margin-right:1em}blockquote.warning{background-color:grey;color:white;border-left-color:black;border-left-width:1em}}
+/*# sourceMappingURL=kalamar-0.40.3.css.map */
diff --git a/public/css/kalamar-0.40.3.css.map b/public/css/kalamar-0.40.3.css.map
new file mode 100644
index 0000000..cf66c51
--- /dev/null
+++ b/public/css/kalamar-0.40.3.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../../dev/scss/base/fonts.scss","../../dev/scss/base/flextable.scss","../../dev/scss/base/mixins.scss","../../dev/scss/base/lengths.scss","../../dev/scss/base/fragment.scss","../../dev/scss/base/choose.scss","../../dev/scss/base/colors.scss","../../dev/scss/base/icons.scss","../../dev/scss/base/load.scss","../../dev/scss/base/form.scss","../../dev/scss/base/view.scss","../../dev/scss/base/menu.scss","../../dev/scss/base/banner.scss","../../dev/scss/base/base.scss","../../dev/scss/main/highlight.scss","../../dev/scss/main/kwic.scss","../../dev/scss/main/logos.scss","../../dev/scss/main/view/matchtable.scss","../../dev/scss/main/view/tree.scss","../../dev/scss/main/view/matchtree.scss","../../dev/scss/main/view/metatable.scss","../../dev/scss/main/matchinfo.scss","../../dev/scss/main/pagination.scss","../../dev/scss/main/query.scss","../../dev/scss/main/resultinfo.scss","../../dev/scss/main/tutorial.scss","../../dev/scss/main/koralquery.scss","../../dev/scss/main/alertify/alertify-core.scss","../../dev/scss/main/alertify/alertify-default.scss","../../dev/scss/main/alertify.scss","../../dev/scss/main/intro.scss","../../dev/scss/main/buttongroup.scss","../../dev/scss/main/panel.scss","../../dev/scss/main/introjs.scss","../../dev/scss/main/introjs-ids.scss","../../dev/scss/main/oauth.scss","../../dev/scss/main/news.scss","../../dev/scss/main/plugin.scss","../../dev/scss/main/main.scss","../../dev/scss/header/hint.scss","../../dev/scss/header/searchbar.scss","../../dev/scss/header/vc.scss","../../dev/scss/header/statistics.scss","../../dev/scss/header/datepicker.scss","../../dev/scss/header/querylanguage.scss","../../dev/scss/header/pipe.scss","../../dev/scss/header/header.scss","../../dev/scss/footer/footer.scss","../../dev/scss/sidebar/sidebar.scss","../../dev/scss/no-js.scss","../../dev/scss/media.scss"],
+"names": [],
+"file": "kalamar-0.40.3.css"
+}
diff --git a/public/css/kalamar-0.41.0.css b/public/css/kalamar-0.41.0.css
new file mode 100644
index 0000000..069ce5b
--- /dev/null
+++ b/public/css/kalamar-0.41.0.css
@@ -0,0 +1,2 @@
+﻿@font-face{font-family:'FontAwesome';src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media (min-width: 640px){dl.flex>div{width:50%}}@media (min-width: 800px){dl.flex>div{width:33.3333333333333%}}@media (min-width: 1200px){dl.flex>div{width:25%}}@media (min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:'FontAwesome';content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:':';color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:'*'}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:'FontAwesome';white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.pref:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.pref:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}ul.menu>li,ul.menu>span.pref:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu>span.pref.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu>span.pref:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px;border-radius:6px;border-width:2px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:''}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana, tahoma, arial, Helvetica, sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100%}body{position:relative;min-height:100%;font-size:12pt;margin:0;padding:0}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color 0.3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}a[onclick$='return PArok(this,false)']{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$='return PArok(this,false)']>span:nth-child(1n+2){display:none}a[onclick$='return PArok(this,false)']>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}.hljs{display:block;padding:0.5em}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}#search{position:relative;margin-bottom:30px;overflow:visible}#search div.matchinfo{display:none}#search>ol{overflow-x:hidden;overflow-y:visible;width:auto;text-indent:0;list-style-type:none;margin:0;padding:0;border:1px solid #87888a;font-size:10pt}#search>ol>li{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;align-content:stretch;border-style:solid;border-color:#f6a800;border-width:0}#search>ol>li .button-group.button-view{display:none}#search>ol>li:nth-of-type(even) div.match-main div.match-wrap{background-color:#fefefe}#search>ol>li p.ref{display:none}#search>ol>li div.meta,#search>ol>li div.match-main{position:relative;cursor:pointer}#search>ol>li div.match-main{display:block;flex:7 0;z-index:4;overflow:hidden}#search>ol>li div.match-main>div.match-wrap{width:99999%;margin-left:-49999.5%;background-color:#d9dadb;overflow-x:hidden;overflow-y:visible;white-space:normal}#search>ol>li div.meta{flex:1 0;min-width:12em;max-width:15em;text-align:left;width:2px;z-index:5;overflow-y:hidden;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#949597;color:#fefefe;font-size:75%;padding:0 5pt;border-color:#616263;border-style:solid;border-width:2px 1px 0 0}#search>ol>li div.meta:before{content:" ";display:inline-block;height:100%;vertical-align:middle}#search>ol>li div.meta:empty{border-width:0 1px 0 0}#search>ol>li div.meta.flip{background-color:#b3b4b5}#search>ol>li:first-of-type div.meta{border-top-width:0}#search>ol>li:last-of-type div.meta{border-bottom-width:0}div.snippet{text-overflow:ellipsis;text-indent:0;text-shadow:1px 1px rgba(255,255,255,0.5);font-size:0;white-space:nowrap !important}div.snippet>span,div.snippet mark{padding:5pt 0 6pt 0;font-size:10pt}div.snippet>mark,div.snippet>span.match{font-weight:bold;color:#333;text-shadow:none;padding-left:4pt;padding-right:2pt}div.snippet>span.match>span.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.snippet.startMore:before,div.snippet.endMore:after{content:"…";padding-left:2pt;padding-right:2pt}div.snippet div.flag{position:absolute;height:100%;top:0;left:0;width:11px;background-color:#f6a800;border-right:1px solid #e55d00}body.no-js #search>ol>li:active,#search>ol>li.active,#search>ol>li:target{position:relative;display:block;background-color:#f6a800;text-align:left;border-width:2px;white-space:normal;height:auto;width:auto;overflow:hidden}body.no-js #search>ol>li:active div.matchinfo,#search>ol>li.active div.matchinfo,#search>ol>li:target div.matchinfo{display:block}body.no-js #search>ol>li:active+li.active,#search>ol>li.active+li.active,#search>ol>li:target+li.active{border-top:2px solid #d9dadb;padding-top:6px}body.no-js #search>ol>li:active+li.active .button-group.button-view,#search>ol>li.active+li.active .button-group.button-view,#search>ol>li:target+li.active .button-group.button-view{padding-top:6px}body.no-js #search>ol>li:active .snippet,#search>ol>li.active .snippet,#search>ol>li:target .snippet{white-space:normal !important;padding:2pt 0 5pt 5pt;background-color:#f4eebb;margin-top:0;margin-right:20px;margin-bottom:0;margin-left:0}body.no-js #search>ol>li:active .snippet span,#search>ol>li.active .snippet span,#search>ol>li:target .snippet span{display:inline !important}body.no-js #search>ol>li:active .snippet>*,#search>ol>li.active .snippet>*,#search>ol>li:target .snippet>*{background-color:transparent}body.no-js #search>ol>li:active .snippet div.flag,#search>ol>li.active .snippet div.flag,#search>ol>li:target .snippet div.flag{display:none}body.no-js #search>ol>li:active .snippet>span,#search>ol>li.active .snippet>span,#search>ol>li:target .snippet>span{line-height:1.4em;width:auto}body.no-js #search>ol>li:active .snippet>span.context-left,#search>ol>li.active .snippet>span.context-left,#search>ol>li:target .snippet>span.context-left{margin-left:0;display:inline;overflow:visible;text-align:left;width:auto}body.no-js #search>ol>li:active .button-group.button-view,#search>ol>li.active .button-group.button-view,#search>ol>li:target .button-group.button-view{display:block}body.no-js #search>ol>li:active div.match-main,#search>ol>li.active div.match-main,#search>ol>li:target div.match-main{display:block;width:100%}body.no-js #search>ol>li:active div.match-main div.match-wrap,#search>ol>li.active div.match-main div.match-wrap,#search>ol>li:target div.match-main div.match-wrap{cursor:default;min-height:20pt;background-color:#f6a800;width:100%;margin-left:0;overflow-x:visible;white-space:normal}body.no-js #search>ol>li:active div.meta,#search>ol>li.active div.meta,#search>ol>li:target div.meta{display:none}body.no-js #search>ol>li:active p.ref,#search>ol>li.active p.ref,#search>ol>li:target p.ref{display:block;color:#fefefe;padding:3pt 10pt 3pt 3pt;padding-right:20px;margin:0pt;width:100%;bottom:0;z-index:30}body.no-js #search>ol>li:active p.ref>span.sigle,#search>ol>li.active p.ref>span.sigle,#search>ol>li:target p.ref>span.sigle{font-size:75%;vertical-align:top;color:#f4eebb;float:right}#search ol span.context-left{display:inline-block;width:50.01%;text-align:right}#search ol.align-right{text-align:right}#search ol.align-right div.match-main span.context-right{display:inline-block;width:49.915%;text-align:left}#search ol.align-center div.match-main{width:100% !important}#search ol.align-center div.match-main>.match-wrap{position:relative;margin-left:0}#search ol.align-center li:not(.active) div.snippet{white-space:normal;text-align:center;width:100000pt;margin-left:-50000pt}#search ol.align-center li:not(.active) div.snippet span.context-left{display:inline-block;text-align:right;width:40000pt;margin-left:70vw}#search ol.align-center li:not(.active) div.snippet span.context-right{display:inline-block;text-align:left;width:40000pt}#search ol span.context-left:empty::after,#search ol span.context-right:empty::after{content:" ";display:inline-block}mark{background-color:inherit;color:inherit}mark>mark,em,.level-0{border-bottom-width:2px;border-bottom-style:solid;padding-bottom:0px !important;font-style:normal}mark>mark>mark,em>em,.level-1{padding-bottom:3px !important}mark>mark>mark>mark,em>em>em,.level-2{padding-bottom:6px !important}#search>ol>li:not(.active) mark>mark>mark>mark,#search>ol>li:not(.active) em>em>em{line-height:180%}#search>ol>li.active mark>mark>mark>mark,#search>ol>li.active em>em>em{line-height:250%}.class-1{border-color:#c1002b}.class-2{border-color:#009ee0}.class-3{border-color:#f6a800}.class-4{border-color:#9bad0b}.logo::after{content:"" !important}.logo>*{background-repeat:no-repeat;background-size:90%;background-position:50% 50%}.logo>*>span{position:absolute;margin-left:-3000px}#kalamar-bg{position:fixed;height:110%;width:175%;top:0;z-index:-5000;opacity:.1;background-image:url("../img/korap-bg-kalamar.svg");background-size:50%;background-repeat:no-repeat;background-position:50% 50%}#logos{position:relative;text-align:right;font-size:85%;right:0;width:100%;margin-left:20px;padding-left:60%}#logos>div{border-top:26px solid #f6a800;padding-right:2em}#logos p{text-align:left;display:inline-block}#ids-logo{display:block;width:21.0333333333em;height:6.6666666667em;background-image:url("../img/ids-leibniz-institute-for-the-german-language.svg")}h1{position:absolute;margin:0;margin-left:15px;left:0;top:0;width:7.8em;height:2.4em;z-index:105;background-size:72%;background-image:url("../img/korap-logo-kalamar.svg")}#overview{text-align:center;width:100%}div.matchtable>div{z-index:20;margin-left:179px;margin-right:20px;padding:0;overflow-x:auto;overflow-y:visible;width:auto}div.matchtable table{display:table;border-collapse:separate;border-spacing:0px}div.matchtable th{color:#fefefe}div.matchtable td,div.matchtable tbody th,div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted){cursor:pointer}div.matchtable td:empty{cursor:default}div.matchtable td:empty::after{content:" ";white-space:pre}div.matchtable td.matchkeyvalues{padding:0}div.matchtable td.matchkeyvalues>div{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}div.matchtable td.matchkeyvalues>div>span{color:#e55d00;text-align:right;padding-right:.5em}div.matchtable td.matchkeyvalues>div>span::after{content:":"}div.matchtable tr{outline:none}div.matchtable tr td.chosen,div.matchtable tr th.chosen,div.matchtable tr div.chosen{background-color:#9bad0b !important;color:#fefefe}div.matchtable tr>th:nth-of-type(1),div.matchtable tr>th:nth-of-type(2){border-top:2px solid #ff8000;width:88px;position:absolute;z-index:80;vertical-align:middle;left:0px}div.matchtable tr>th:nth-of-type(2){left:90px}div.matchtable tr>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;border:1px solid #f6a800}div.matchtable tr>td{background-color:#ffd080;white-space:nowrap;vertical-align:top;text-align:center}div.matchtable tr>td.mark{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td.mark{background-color:#ffd080}div.matchtable thead th{background-color:#ff8000;border-top-width:0px !important;text-align:center}div.matchtable thead th:nth-of-type(1),div.matchtable thead th:nth-of-type(2){text-align:left}div.matchtable thead th.mark{background-color:#e55d00}div.matchtable thead th.cutted{background-color:#f4eebb}div.matchtable thead th.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.matchtable tbody>tr:nth-of-type(1)>th{border-top-color:transparent}path.edge{stroke:#ff8000;stroke-width:2px;fill:none}g.arc.infocus>path.edge{stroke:#636f07}marker#arr{overflow:visible}marker#arr path{stroke:#e55d00;fill:#e55d00;fill-opacity:1;stroke-width:2}path.anchor{stroke:#e55d00;stroke-width:3;stroke-linecap:round;z-index:20}g.root rect.empty{stroke:#ff8000;fill:#ff8000;stroke-width:2px}g.middle rect,g.label rect{stroke:#ff8000;stroke-width:2px;fill:#ffd080}g.label.infocus rect{stroke:#636f07;fill:#dce883}g.middle.mark rect{fill:#ff8000}g.middle.mark>text{fill:#f4eebb}g.middle.mark>text>tspan{stroke:#f4eebb}g.leaf.mark text>tspan{font-weight:bold}g.leaf>rect{display:none}g>text>tspan{text-anchor:middle;font-size:9pt}g.leaf>text>tspan,text.leaf>tspan{font-size:10pt;overflow:visible}div.matchtree{overflow-x:hidden;overflow-y:visible;padding:0;margin-top:1pt}div.matchtree h6{display:inline;font-size:inherit;color:#fefefe;margin:0;padding:0 !important;float:left}div.matchtree h6>span{border-top:2px solid #ff8000;width:88px;text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;display:inline-block !important;margin:0}div.matchtree h6>span:nth-of-type(2){margin-left:2px}div.matchtree>div{position:unset;z-index:4;overflow-x:auto;margin:2px;margin-left:180px;margin-right:20px;background-color:#f4eebb}div.metatable>dl{margin-right:20px;margin-top:2px}div.metatable>dl>div{border-color:#f6a800}div.metatable>dl>div>*{padding:.2em}div.metatable>dl>div>dt{background:#ff8000;color:#fefefe;width:12.5em}div.metatable>dl>div>dd{background-color:#f4eebb;cursor:pointer}div.metatable>dl>div>dd.metakeyvalues{padding:0}div.metatable>dl>div>dd.metakeyvalues>div{padding:.2em}div.metatable>dl>div>dd.metakeyvalues>div::before{content:"\2022\00A0";color:#f6a800}div.metatable>dl>div>dd.chosen,div.metatable>dl>div>dd>div.chosen{background-color:#9bad0b !important;color:#fefefe}div.metatable>dl>div>dd[data-type="type:store"],div.metatable>dl>div>dd[data-type="type:attachement"]{background-color:#ffd080;cursor:default}div.metatable>dl>div>dd[data-type="type:store"] a,div.metatable>dl>div>dd[data-type="type:attachement"] a{color:inherit}div.metatable>dl.cbm-disabled>div>dd{cursor:default !important}div.matchinfo{position:relative;width:100%;padding-top:2px;height:auto;font-size:10pt;text-align:left}div.matchinfo:empty{display:none !important}div.matchinfo .view+.view{margin-top:8px !important}div.metatable,div.matchtable,div.matchtree{position:relative;background-color:#f6a800}div.button-group.button-panel.button-matchinfo{display:inline-block;margin-right:.5em}div.button-group.button-panel.button-matchinfo>span{position:relative;box-shadow:none}#pagination{position:fixed;font-size:0;right:10px;bottom:20px;z-index:35;padding:0;height:auto;line-height:0}#pagination>a{margin:0;font-size:10pt;padding:0}#pagination>a>span{padding-left:.4em;padding-right:.4em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);display:inline-block;line-height:2em;text-align:center;border-top-width:2px;border-bottom-width:2px;border-top-style:solid;border-bottom-style:solid}#pagination>a:not(:link):not([rel=self]) span{color:#87888a}#pagination>a.ellipsis>span>span{position:absolute;margin-left:-3000px}#pagination>a.ellipsis>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=self]>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;border-left-width:2px;border-right-width:2px;border-left-style:solid;border-right-style:solid}#pagination>a[rel=prev]>span{border-top-left-radius:6px;border-bottom-left-radius:6px;border-left-width:2px;border-left-style:solid}#pagination>a[rel=prev]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=prev]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=next]>span{border-top-right-radius:6px;border-bottom-right-radius:6px;border-right-width:2px;border-right-style:solid}#pagination>a[rel=next]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=next]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a:link:hover,#pagination>a:link:focus{outline:none}#pagination>a:link:hover span,#pagination>a:link:focus span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query{overflow-x:hidden;padding:.5em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;border-width:2px;border-style:solid;border-radius:6px;box-shadow:2px 2px 2px rgba(0,0,0,0.2)}pre.query:not(.unsupported){cursor:pointer}pre.query:not(.unsupported):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query:not(.unsupported):active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}pre.query.unsupported span{vertical-align:super;color:#009ee0;font-size:90%;font-weight:bold;cursor:help}#resultinfo{clear:both;text-align:right;line-height:1.5em;min-height:1.5em;margin-top:.4em;font-size:10pt}#resultinfo p.found{display:inline;padding:0;margin:0;text-align:right}#resultinfo.found{position:relative;margin-bottom:0px}#resultinfo.found .button-group>span{margin-bottom:0;border-bottom-width:0;box-shadow:none}#resultinfo.found .button-group>span:first-child{border-bottom-left-radius:0}#resultinfo.found .button-group>span:last-child{border-bottom-right-radius:0}div.result.panel .view{border:1px solid #87888a;background-color:#f6a800}.result.button-group.button-panel{display:inline-block;width:auto;vertical-align:bottom;line-height:1.5em}.result.button-group.button-panel>span{line-height:1.5em;border-width:1px 0}.result.button-group.button-panel>span:first-child{border-left-width:1px}.result.button-group.button-panel>span:last-child{border-right-width:1px}#total-results{color:#9bad0b;font-weight:bold}.no-results{margin:0 auto;text-align:center}.no-results code{font-weight:bold}.button-icon.align.left::after{content:""}.button-icon.align.right::after{content:""}.button-icon.align.center::after{content:""}.button-icon.show-kq::after{content:""}#tutorial{position:fixed;z-index:9999;top:5%;bottom:5%;left:2%;right:2%;padding-right:20px;background-color:#fefefe;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:4px;border-color:#616263;border-style:solid;border-radius:6px}#tutorial .button-group.button-view{background-color:#87888a;display:block;height:100%}#tutorial iframe{border-width:0;width:100%;min-height:100.1%;background-image:url("../img/korap-bg-kalamar.svg");background-repeat:no-repeat;background-position:center center;background-size:20%}body.embedded{background-color:#fefefe}body.embedded aside{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-top:0;background-color:#87888a}body.embedded aside>div{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}main.tutorial a.embedded-link::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}#koralquery{white-space:pre}#koralquery>div{background-color:#fefefe;overflow-x:auto;font-size:85%;margin-top:2pt;margin-right:20px;margin-bottom:2pt;margin-left:2pt}.alertify,.alertify-show,.alertify-log{-webkit-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-ms-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)}.alertify-hide{-webkit-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-log-hide{-webkit-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-cover{position:fixed;z-index:99999;top:0;right:0;bottom:0;left:0;background-color:white;filter:opacity(0);opacity:0}.alertify-cover-hidden{display:none}.alertify{position:fixed;z-index:99999;top:50px;left:50%;width:550px;margin-left:-275px;opacity:1}.alertify-hidden{-webkit-transform:translate(0, -150px);-moz-transform:translate(0, -150px);-ms-transform:translate(0, -150px);-o-transform:translate(0, -150px);transform:translate(0, -150px);opacity:0;display:none}:root *>.alertify-hidden{display:block;visibility:hidden}.alertify-logs{position:fixed;z-index:5000;bottom:10px;right:10px;width:300px}.alertify-logs-hidden{display:none}.alertify-log{display:block;margin-top:10px;position:relative;right:-300px;opacity:0}.alertify-log-show{right:0;opacity:1}.alertify-log-hide{-webkit-transform:translate(300px, 0);-moz-transform:translate(300px, 0);-ms-transform:translate(300px, 0);-o-transform:translate(300px, 0);transform:translate(300px, 0);opacity:0}.alertify-dialog{padding:25px}.alertify-resetFocus{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.alertify-inner{text-align:center}.alertify-text{margin-bottom:15px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:100%}.alertify-button,.alertify-button:hover,.alertify-button:active,.alertify-button:visited{background:none;text-decoration:none;border:none;line-height:1.5;font-size:100%;display:inline-block;cursor:pointer;margin-left:5px}@media only screen and (max-width: 680px){.alertify,.alertify-logs{width:90%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.alertify{left:5%;margin:0}}.alertify,.alertify-log{font-family:sans-serif}.alertify{background:#FFF;border:10px solid #333;border:10px solid rgba(0,0,0,0.7);border-radius:8px;box-shadow:0 3px 3px rgba(0,0,0,0.3);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box}.alertify-text{border:1px solid #CCC;padding:10px;border-radius:4px}.alertify-button{border-radius:4px;color:#FFF;font-weight:bold;padding:6px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.5);box-shadow:inset 0 1px 0 0 rgba(255,255,255,0.5);background-image:-webkit-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-moz-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-ms-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-o-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0))}.alertify-button:hover,.alertify-button:focus{outline:none;background-image:-webkit-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-moz-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-ms-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-o-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:linear-gradient(top, rgba(0,0,0,0.1), transparent)}.alertify-button:focus{box-shadow:0 0 15px #2B72D5}.alertify-button:active{position:relative;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.alertify-button-cancel,.alertify-button-cancel:hover,.alertify-button-cancel:focus{background-color:#FE1A00;border:1px solid #D83526}.alertify-button-ok,.alertify-button-ok:hover,.alertify-button-ok:focus{background-color:#5CB811;border:1px solid #3B7808}.alertify-log{background:#1F1F1F;background:#000;padding:15px;border-radius:4px;color:#FFF}.alertify-log-success{background:#5CB811;background:#5cb811}article.alertify-log-warn{background-color:#f6a800}article.alertify-log-warn code.src{color:#e55d00}article.alertify-log code.src{display:block;color:#000;font-size:70%}.alertify-log-error{background-color:#fe1a00}div.intro a:visited{color:#e55d00}div.intro div.announcement{background-color:#f4eebb;padding:8px;border:5px dashed #f6a800;border-radius:1em;width:90%;margin:auto}aside.active ~ main div.intro{margin-left:198px}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel a,.button-group.operators>span,.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:hover,.button-group.button-panel a:hover,.button-group.operators>span:hover,.button-group.operators a:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.button-group.button-panel>span:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span>span.check,.button-group.button-panel a>span.check{font-family:'FontAwesome';white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:'FontAwesome';white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}div.panel{position:relative;width:100%;display:block}div.view{position:relative;padding-top:2px;display:block;width:100%}div.view:not(.show){display:none}.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0,0,0,0.4)), color-stop(100%, rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-fixParent{z-index:auto !important;opacity:1.0 !important;-webkit-transform:none !important;-moz-transform:none !important;-ms-transform:none !important;-o-transform:none !important;transform:none !important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999 !important}.introjs-disableInteraction{z-index:99999999 !important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,0.9);border:1px solid #777;border:1px solid rgba(0,0,0,0.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,0.4);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999 !important;padding:2px;font-family:Arial, verdana, tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background:#ff3019;background:-webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));background:-moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-o-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,0.4)}.introjs-arrow{border:5px solid transparent;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:white}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:white}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:white}.introjs-arrow.right{right:-10px;top:10px;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:white}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:white}.introjs-arrow.left{left:-10px;top:10px;border-right-color:white}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:white}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,0.4);-webkit-transition:opacity 0.1s ease-out;-moz-transition:opacity 0.1s ease-out;-ms-transition:opacity 0.1s ease-out;-o-transition:opacity 0.1s ease-out;transition:opacity 0.1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:0.3em 0.8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:none;background-color:#ececec;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));background-image:-moz-linear-gradient(#f4f4f4, #ececec);background-image:-o-linear-gradient(#f4f4f4, #ececec);background-image:linear-gradient(#f4f4f4, #ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0px 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));background-image:-moz-linear-gradient(#ececec, #f4f4f4);background-image:-o-linear-gradient(#ececec, #f4f4f4);background-image:linear-gradient(#ececec, #f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:0.2em 0 0 0.2em;-moz-border-radius:0.2em 0 0 0.2em;border-radius:0.2em 0 0 0.2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-nextbutton{-webkit-border-radius:0 0.2em 0.2em 0;-moz-border-radius:0 0.2em 0.2em 0;border-radius:0 0.2em 0.2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0.0}25%{-webkit-transform:scale(0);opacity:0.1}50%{-webkit-transform:scale(0.1);opacity:0.3}75%{-webkit-transform:scale(0.5);opacity:0.5}100%{-webkit-transform:scale(1);opacity:0.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0.0}25%{-moz-transform:scale(0);opacity:0.1}50%{-moz-transform:scale(0.1);opacity:0.3}75%{-moz-transform:scale(0.5);opacity:0.5}100%{-moz-transform:scale(1);opacity:0.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0.0}25%{transform:scale(0);opacity:0.1}50%{transform:scale(0.1);opacity:0.3}75%{transform:scale(0.5);opacity:0.5}100%{transform:scale(1);opacity:0.0}}.introjs-helperLayer{background-color:transparent}.introjs-tooltip.gTstartSearch{max-width:500px}.tgreeting{font-weight:bold;color:#e55d00}.pfirstStep{width:500px}.introjs-donebutton{float:right;margin-left:5px}.introjs-skipbutton{color:#333}ul.client-list{padding-left:1.5em}ul.client-list li.client{list-style-type:none}ul.client-list li.client span.client-name::before{margin-left:-1.5em}ul.client-list li.client span.client-desc{font-size:70%;display:block}span.client-name{font-weight:bold}span.client-name::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;width:1.5em;content:"";color:#009ee0;font-size:100%}section#news{background-color:#e3e8a3;mix-blend-mode:soft-light;padding:1em;padding-right:2em;border-radius:6px;border-left:5px solid #636f07}section#news dt{float:left;clear:left;width:15ex;text-align:right;font-weight:bold}section#news dd.maintenance>h4::after{font-family:'FontAwesome';white-space:nowrap;color:#c1002b;content:" "}section#news dd{margin:0 1ex 0 16ex;padding:0 0 0.5em 1em}section#news dd>p{max-width:80ex;margin-block-start:0ex}section#news dd>h4{margin-block-start:0ex;margin-block-end:0.33ex}@media all and (max-width: 42.5em){section#news dt{text-align:left;float:none;width:auto;padding-bottom:.2em}section#news dd{margin-left:1em}}div.view.widget{padding-right:20px}div.view.widget>iframe{margin:0;box-sizing:border-box;padding:0;width:100%;overflow-x:auto}div.panel.result>div>div.widget>iframe{background-color:#fefefe}main{padding-bottom:20pt;margin-left:40px;margin-right:20px}main.embedded{margin-left:14px;margin-right:14px}main p{text-align:justify;hyphens:auto}main h2#page-top{margin-top:0;padding-top:1em}main.page{margin-left:245px}main.page p code,main.page li code,main.page dd code,main.page dt code{background-color:#d9dadb;color:#87888a;padding:0 .5em;border-radius:6px}main p.hint{margin:0 auto;text-align:center}ul.menu.hint{display:inline-block;white-space:normal;text-align:left;max-width:23em !important;top:0}ul.menu.hint>li:first-of-type{border-top-width:1px;border-top-left-radius:0;border-top-right-radius:0}div.alert.hint{position:absolute;background-color:#fe1a00;color:#fefefe;padding:3pt 6pt;margin-top:8px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);width:auto;min-width:10em;max-width:23em !important;transition:opacity 0.2s ease 0s;border-radius:6px;border-top-left-radius:0}div.alert.hint::before{position:absolute;content:"";display:block;top:-12px;left:0;width:0;white-space:normal;border-width:0 8px 12px 0;border-style:solid;border-color:#fe1a00 transparent}.hint.mirror{position:absolute;display:block;left:0;top:0;z-index:90;white-space:pre-wrap;height:0}.hint.mirror>span{opacity:0;white-space:pre-wrap;overflow:hidden}.hint.mirror>div{position:absolute;display:block;cursor:pointer;transition:left 0.2s ease 0s;top:0;left:0;text-align:left;padding:0;border-top:5px solid #f6a800;height:10px;width:1.2em}.hint.mirror>div:hover:not(.active){border-top:10px solid #f6a800}.hint.mirror>div.active{border-top-width:0;height:0;width:23em}#q-field{display:block;margin-bottom:3px;width:100%;margin:0}#q-field::-webkit-search-cancel-button{display:none}#q-field.loading{background-color:#f4eebb;background-image:none}#searchbar{position:relative;width:100%;padding:0;padding-right:70px}#searchbar button[type=submit]{position:absolute;padding:0;right:40px}#searchbar button[type=submit]:not(.loading)::after{content:""}.query.panel{padding-right:70px}.query.button-group.button-panel{display:block;width:auto;text-align:right;vertical-align:top;line-height:1.3em}.query.button-group.button-panel>span{box-shadow:none}.vc{margin-top:4pt}.vc .builder{position:initial}.vc .docGroup{position:relative;display:inline-block;margin-left:4em;padding:4pt 2pt 4pt 0pt;border-radius:12px;border-style:solid;border-width:0 .4em}.vc .docGroup .docGroup{display:block}.vc .docGroup[data-operation]>.doc:first-child::before,.vc .docGroup[data-operation]>.docGroup:first-child::before{content:none}.vc .docGroup[data-operation]>.doc::before,.vc .docGroup[data-operation]>.docGroup::before{position:absolute;display:inline-block;text-align:right;width:4em;margin-left:-4.5em;line-height:1.5em;border-top:2px solid transparent}.vc .docGroup[data-operation]>.docGroup::before{margin-left:-4.9em}.vc .docGroup[data-operation=or]>.doc::before,.vc .docGroup[data-operation=or]>.docGroup::before{content:"or"}.vc .docGroup[data-operation=and]>.doc::before,.vc .docGroup[data-operation=and]>.docGroup::before{content:"and"}.vc .docGroup>.operators{position:absolute;display:block;vertical-align:middle;top:10px;left:3px;margin-left:100%;padding:0}.vc .docGroup>.operators>span:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.vc .doc{line-height:170%;padding-left:4em}.vc .doc>span+span,.vc .doc>span+div+span,.vc .doc>span+ul+span{margin-left:5pt}.vc .doc>span.key,.vc .doc>span.value{font-weight:bold}.vc .doc>span.value[data-type=regex]{font-style:italic}.vc .doc>span.value[data-type=regex]::after,.vc .doc>span.value[data-type=regex]::before{content:'/'}.vc .doc>span.key{position:relative}.vc .doc>span.key>ul{margin:0;margin-left:3.3em}.vc .doc>span.key.fixed{color:#9bad0b}.vc .doc.unspecified>span,.vc .doc span.unspecified{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding:0 4px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-style:solid;border-width:2px;border-radius:6px}.vc .doc>.operators{display:inline-block;margin-left:10px}.vc .rewritten .rewrite{display:inline-block;margin-left:4pt;color:#f6a800}.vc .rewritten .rewrite::after{font-family:'FontAwesome';white-space:nowrap;font-style:normal;font-weight:normal;content:"";text-decoration:underline}.vc .rewritten .rewrite>span{display:none}.vc .operators{opacity:0;white-space:nowrap;padding:0;font-size:0;line-height:0;text-align:center}.vc>.docGroup{margin-left:0}.vc .menu{display:inline-block}.vc .menu li[data-type=ref]::before,.vc span.key.ref::before{font-family:'FontAwesome';white-space:nowrap;content:"";padding-right:4pt;font-style:normal;font-weight:normal}.vc div.value{position:absolute;display:inline-block;min-width:max-content;z-index:8000;padding:4pt;margin-top:-6pt;border-radius:6px;border-width:2px;border-style:solid}.vc div.value input{border-width:0;outline-width:0}.vc div.value>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:inline-block;padding:0 4pt;margin-left:4pt;font-size:80%;font-style:italic;border-width:2px;border-style:solid;border-radius:6px}.vc div.value.regex>input{font-style:italic}.vc div.value.regex>div{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}.vc:not(.fragment) .docGroup,.vc:not(.fragment) .doc{color:#616263}.vc:not(.fragment) .docGroup:hover{background-color:rgba(255,255,255,0.3)}.vc:not(.fragment) .doc>span:not(.fixed){cursor:pointer}.vc:not(.fragment) .doc>span:not(.fixed):hover{color:#f6a800}.vc:not(.fragment) .doc.unspecified>span:hover,.vc:not(.fragment) span.unspecified:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.vc:not(.fragment) .doc:hover>.operators,.vc:not(.fragment) .docGroup:hover>.operators{opacity:1}.vc:not(.fragment) .docGroup[data-operation]>.doc::before,.vc:not(.fragment) .docGroup[data-operation]>.docGroup::before{color:#f6a800}.vc:not(.fragment) .docGroup[data-operation=or]{border-color:#f6a800}.vc:not(.fragment) div.value{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2)}.vc:not(.fragment) div.value>div{cursor:pointer}.vc:not(.fragment) div.value>div:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.docGroup>.operators{z-index:30}.docGroup .docGroup>.operators{z-index:31}.docGroup .docGroup .docGroup>.operators{z-index:32}.docGroup .docGroup .docGroup .docGroup>.operators{z-index:33}.docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:34}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:35}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:36}.vc.fragment>div>div.docGroup{margin-left:0}.vc.fragment .doc{margin-right:2em}#collection{line-height:1em;border-radius:6px}#vc-choose>span.rewritten::after{font-family:'FontAwesome';white-space:nowrap;color:#f6a800;padding:0;padding-left:4px;content:"";text-decoration:underline;font-style:normal;font-weight:normal}div#vc-view{position:relative}div#vc-view>div.vc{display:none;margin:1.3em 0 .5em 0;border:2px solid #636f07;background-color:#fefefe}div#vc-view>div.vc.active{display:block}div#vc-view>div.vc>div:first-child{padding:1.3em}div.panel.vcinfo{padding:3pt 0pt 3pt 3pt;background-color:#636f07}div.panel.vcinfo div.button-group>span{box-shadow:none}div.stattable{display:flex;flex-direction:row;margin-right:20px}div.stattable>dl{margin-bottom:4px}div.stattable>dl>div{border-color:#636f07}div.stattable>dl>div>dt{background-color:#8a9a0a;width:15em;margin:0}div.stattable>dl>div>dt::after{content:":"}div.stattable>dl>div>dd{background-color:#dce883;color:#616263}div.stattable.stdisabled dt,div.stattable.stdisabled dd{background-color:#b9c46a;color:#636f07;text-shadow:none}div.reloadStatB>span.refresh{margin-left:2pt}span.refresh::after{vertical-align:sub;content:""}@media (min-width: 1680px){div.stattable dl.flex>div{width:inherit}}div.datepicker{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:absolute;display:inline-block;z-index:90;font-size:80%;padding:4pt;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:2px;border-style:solid;border-radius:6px}div.datepicker>div{font-size:120%;width:45%}div.datepicker>div.month{float:right}div.datepicker>div>span{display:inline-block;overflow:hidden;white-space:nowrap}div.datepicker>div>span:first-child,div.datepicker>div>span:last-child{width:15%}div.datepicker>div>span:first-child::before,div.datepicker>div>span:last-child::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;text-align:center;cursor:pointer;min-width:14px}div.datepicker>div>span:first-child::before{content:""}div.datepicker>div>span:last-child::before{content:""}div.datepicker>div>span:nth-child(2){display:inline-block;cursor:pointer;width:70%;text-align:center;text-overflow:ellipsis;border-radius:6px;border-style:solid;border-width:2px;border-color:transparent}div.datepicker>div>span:nth-child(2):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker>div>span:nth-child(2).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker table{border-collapse:separate;border-spacing:1px}div.datepicker input{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-left:.4em;padding-right:.4em;background-color:#fefefe;width:100%;border-style:solid;border-width:1px}div.datepicker td{padding-left:.4em;padding-right:.4em;text-align:center;border-style:solid;border-width:1px}div.datepicker td:not(.out){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);cursor:pointer;background-color:#fefefe}div.datepicker td:not(.out).today{background-color:#bce4f7;color:#009ee0;text-shadow:none}div.datepicker td:not(.out).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker td:not(.out):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker td.out{border-color:transparent}#ql-field{position:relative;background-color:#9bad0b;cursor:pointer;margin:0;outline:none;border:none;display:inline-block;color:white;border-width:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#ql-field:checked{outline:none}#ql-field>option{padding:0pt 2pt;outline:none}#ql-field:-moz-focusring{color:transparent;text-shadow:0 0 0 white}input.pipe{display:none}header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;background-color:#9bad0b;padding:8px 0 0 8px;font-size:10pt;color:#fefefe}header span.select{display:inline-block;cursor:pointer;line-height:1.8em;border-width:0;border-bottom-width:3px;border-style:solid;border-color:transparent}header span.select>span{font-weight:bold}header span.select:hover{color:#636f07;border-color:#636f07}header span.select::after{font-family:'FontAwesome';white-space:nowrap;pointer-events:none;text-align:center;content:"";padding-left:4pt;padding-right:4pt}header span.select.active{border-color:#f6a800}header span.select.active::after{content:""}header form{position:relative;display:block;padding-left:230px;min-height:2.7em;margin:0px}header input{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0}header .button{color:#fefefe;line-height:2em;margin-right:40px}header .button.right{float:right;display:inline-block}header .button.top{position:absolute;display:block;top:0;right:0;margin-right:0;width:20px;background-color:#636f07;text-align:center;height:100%;z-index:20}header .button.top>a:hover{color:#fefefe}header .button>a{color:#fefefe;cursor:pointer;position:relative;font-size:120%}header .button>a>span{position:absolute;margin-left:-3000px}header .button>a::after{font-family:'FontAwesome';white-space:nowrap}header .button>a.tutorial::after{content:""}header .button>a.question::after{content:""}header .button>a.login::after{content:""}header .button>a.logout::after{content:""}.query.button-group>span{border-top-width:0;border-color:white}.query.button-group>span:first-child{border-top-left-radius:0}.query.button-group>span:last-child{border-top-right-radius:0}footer{background-color:#616263;position:absolute;bottom:0;padding-bottom:2px;font-size:70%;width:100%;text-align:right}footer a:link{margin:0 .5em;color:#d9dadb}footer a:visited{color:#d9dadb}footer a:hover{color:#fefefe}footer a[href^="http://"]::after,footer a[href^="https://"]::after{content:none}footer span.separator:after{content:"-";color:#d9dadb}aside{background-color:#636f07;color:#fefefe;width:230px;position:fixed;display:block;transition:all .3s ease-in-out;outline:none;font-size:10pt;z-index:100;top:0;left:0;height:100%;padding-top:65px}aside>div{overflow-y:auto;overflow-x:visible;max-height:100%}aside>*{opacity:1}aside::after{font-family:'FontAwesome';white-space:nowrap;position:absolute;display:block;opacity:0;cursor:pointer;right:0;bottom:0;content:"";font-size:16pt;width:16pt;height:17pt;padding:6pt;background-color:#636f07;border-top-right-radius:6px;margin-right:-20px}aside h2,aside legend{line-height:2em;text-align:center;padding:0;margin:0;font-size:100%;font-weight:bold}aside ul.nav{list-style-type:none;margin:0;font-size:10pt;text-indent:0;padding:0}aside ul.nav li{padding:0}aside ul.nav li>a{padding:3pt 6pt}aside ul.nav li>a:visited{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}aside ul.nav li.folded.active ul{display:block}aside ul.nav li.folded ul{display:none}aside ul.nav li.active>a:link{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}aside ul.nav li>a:link{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:block;border-right-width:2px;border-right-style:solid}aside ul.nav li>a:link:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}aside ul.nav li h3{padding:0;margin:0;font-weight:bold;font-size:100%}aside ul.nav li>a{padding-left:6pt}aside ul.nav li li>a{padding-left:18pt}aside ul.nav li li li>a{padding-left:36pt}aside nav>ul>li>a{font-weight:bold}aside fieldset{position:relative;border-width:0}aside fieldset legend{display:none}aside fieldset input[type=text],aside fieldset input[type=password]{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0;width:100%}aside fieldset>form>div{position:relative;width:100%;margin-top:4px;padding-right:30px}aside fieldset>p{color:#9bad0b}aside fieldset>p.announcement{color:#fefefe}aside fieldset>p.announcement>time{display:block;font-size:70%}aside fieldset hr{border:none;border-top:2px solid #d9dadb}aside fieldset ul{display:block;font-size:80%;text-align:right;padding:0;margin-top:0}aside fieldset ul>li{display:inline}aside fieldset ul>li:first-child::after{content:' | '}aside fieldset button{position:absolute;top:0;right:0}aside fieldset button::after{content:""}aside.off,aside:not(:focus):not(.active){margin-left:-210px}aside.off::after,aside:not(:focus):not(.active)::after{opacity:1}aside.off>*,aside:not(:focus):not(.active)>*{opacity:0;transition-property:opacity;transition-duration:.3s}aside.off::after{display:none}body.no-js aside{position:relative;display:block;transition:none;margin-left:0 !important;padding-top:0;width:100%;top:0}body.no-js aside>*{opacity:1 !important;transition:none}body.no-js aside form.login>input,body.no-js aside form.login>div{width:auto;margin-top:0}body.no-js aside form.login>input:first-of-type,body.no-js aside form.login>div:first-of-type{float:left;margin-right:1em}body.no-js aside form.login button{height:100%}body.no-js aside p,body.no-js aside::after{display:none}body.no-js main div.intro{margin-left:8px !important}#activate{text-align:right;background-color:#f6a800;margin-top:0;padding:8px;padding-right:40px;color:#fefefe;font-size:80%}@media all and (max-width: 42.5em){body,#search>ol,#search div.snippet>span,header,header input,div#resultinfo,#pagination>a{font-size:9pt}header{padding-right:8px}header form{padding-left:0;padding-top:33px}.vc{font-size:9pt}.vc .builder .doc{padding-left:3em}.vc .builder * .docGroup{margin-left:3em}.vc .builder>.doc{padding-left:.5em}.vc .builder>.docGroup{margin-left:.5em}h1{margin-left:10px;width:130px;height:40px;background-size:100%;background-position:50% 0;z-index:110}#searchbar{padding-right:30px}#searchbar input{font-size:9pt}#searchbar button[type=submit]{right:0}.level-1{padding-bottom:2px}.level-2{padding-bottom:4px}main{margin-left:4px;margin-right:4px}header .button{margin-right:4px}header .button.top{height:auto}#search ol>li:target>div>div.snippet,#search ol>li.active>div>div.snippet{margin:2px 2em 2px 4px}#search ol>li div.meta{display:none}div.matchinfo{font-size:9pt}div.matchtable tr>*{padding:1pt 3pt}div.matchtree h6{display:block;float:none}div.matchtree>div{margin-left:2px}#kalamar-bg{overflow:hidden}#logos{margin-left:0;margin-right:0}#logos>div{border-top-width:14px;padding-right:0}#logos>div .logo>*{background-size:60%;background-position:0 0}div.intro{width:100%}body.embedded aside>div{top:0;transform:translateY(0)}aside:not(:focus):not(.active){margin-left:-230px}aside:not(:focus):not(.active)::after{font-size:12pt;height:11pt;text-align:right;padding-right:3pt;padding-top:2pt}aside ul{font-size:9pt;line-height:1em}aside.active ~ main div.intro,aside.active ~ main.page{margin-left:4px !important}aside.active{position:relative;display:block;padding-top:0;width:100%;top:0;border-width:0}aside.active fieldset input{font-size:9pt}aside.active::after{display:none}aside.active p,aside.active hr{display:none}#tutorial{border-radius:0;border-width:0;right:0;left:0;bottom:0;top:0;padding:0}#tutorial iframe{border-radius:0}#tutorial>ul.action.right{height:1.5em;right:20px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}main.page{margin-right:20px}}@media print{body,html,select,g>text{color:black}header,aside{display:none}main.page{margin:1em}#kalamar-bg{display:none}a.embedded-link{color:black;text-decoration:underline}pre.query.tutorial{background-color:white;color:black;margin-left:1em;margin-right:1em}blockquote.warning{background-color:grey;color:white;border-left-color:black;border-left-width:1em}}
+/*# sourceMappingURL=kalamar-0.41.0.css.map */
diff --git a/public/css/kalamar-0.41.0.css.map b/public/css/kalamar-0.41.0.css.map
new file mode 100644
index 0000000..eba7b69
--- /dev/null
+++ b/public/css/kalamar-0.41.0.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../../dev/scss/base/fonts.scss","../../dev/scss/base/flextable.scss","../../dev/scss/base/mixins.scss","../../dev/scss/base/lengths.scss","../../dev/scss/base/fragment.scss","../../dev/scss/base/choose.scss","../../dev/scss/base/colors.scss","../../dev/scss/base/icons.scss","../../dev/scss/base/load.scss","../../dev/scss/base/form.scss","../../dev/scss/base/view.scss","../../dev/scss/base/menu.scss","../../dev/scss/base/banner.scss","../../dev/scss/base/base.scss","../../dev/scss/main/highlight.scss","../../dev/scss/main/kwic.scss","../../dev/scss/main/logos.scss","../../dev/scss/main/view/matchtable.scss","../../dev/scss/main/view/tree.scss","../../dev/scss/main/view/matchtree.scss","../../dev/scss/main/view/metatable.scss","../../dev/scss/main/matchinfo.scss","../../dev/scss/main/pagination.scss","../../dev/scss/main/query.scss","../../dev/scss/main/resultinfo.scss","../../dev/scss/main/tutorial.scss","../../dev/scss/main/koralquery.scss","../../dev/scss/main/alertify/alertify-core.scss","../../dev/scss/main/alertify/alertify-default.scss","../../dev/scss/main/alertify.scss","../../dev/scss/main/intro.scss","../../dev/scss/main/buttongroup.scss","../../dev/scss/main/panel.scss","../../dev/scss/main/introjs.scss","../../dev/scss/main/introjs-ids.scss","../../dev/scss/main/oauth.scss","../../dev/scss/main/news.scss","../../dev/scss/main/plugin.scss","../../dev/scss/main/main.scss","../../dev/scss/header/hint.scss","../../dev/scss/header/searchbar.scss","../../dev/scss/header/vc.scss","../../dev/scss/header/statistics.scss","../../dev/scss/header/datepicker.scss","../../dev/scss/header/querylanguage.scss","../../dev/scss/header/pipe.scss","../../dev/scss/header/header.scss","../../dev/scss/footer/footer.scss","../../dev/scss/sidebar/sidebar.scss","../../dev/scss/no-js.scss","../../dev/scss/media.scss"],
+"names": [],
+"file": "kalamar-0.41.0.css"
+}
diff --git a/public/css/kalamar-0.41.1.css b/public/css/kalamar-0.41.1.css
new file mode 100644
index 0000000..6a10ef2
--- /dev/null
+++ b/public/css/kalamar-0.41.1.css
@@ -0,0 +1,2 @@
+﻿@font-face{font-family:'FontAwesome';src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media (min-width: 640px){dl.flex>div{width:50%}}@media (min-width: 800px){dl.flex>div{width:33.3333333333333%}}@media (min-width: 1200px){dl.flex>div{width:25%}}@media (min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:'FontAwesome';content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:':';color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:'*'}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:'FontAwesome';white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.pref:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.pref:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}ul.menu>li,ul.menu>span.pref:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu>span.pref.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu>span.pref:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px;border-radius:6px;border-width:2px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:''}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana, tahoma, arial, Helvetica, sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100%}body{position:relative;min-height:100%;font-size:12pt;margin:0;padding:0}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color 0.3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}a[onclick$='return PArok(this,false)']{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$='return PArok(this,false)']>span:nth-child(1n+2){display:none}a[onclick$='return PArok(this,false)']>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}.hljs{display:block;padding:0.5em}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}#search{position:relative;margin-bottom:30px;overflow:visible}#search div.matchinfo{display:none}#search>ol{overflow-x:hidden;overflow-y:visible;width:auto;text-indent:0;list-style-type:none;margin:0;padding:0;border:1px solid #87888a;font-size:10pt}#search>ol>li{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;align-content:stretch;border-style:solid;border-color:#f6a800;border-width:0}#search>ol>li .button-group.button-view{display:none}#search>ol>li:nth-of-type(even) div.match-main div.match-wrap{background-color:#fefefe}#search>ol>li p.ref{display:none}#search>ol>li div.meta,#search>ol>li div.match-main{position:relative;cursor:pointer}#search>ol>li div.match-main{display:block;flex:7 0;z-index:4;overflow:hidden}#search>ol>li div.match-main>div.match-wrap{width:99999%;margin-left:-49999.5%;background-color:#d9dadb;overflow-x:hidden;overflow-y:visible;white-space:normal}#search>ol>li div.meta{flex:1 0;min-width:12em;max-width:15em;text-align:left;width:2px;z-index:5;overflow-y:hidden;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#949597;color:#fefefe;font-size:75%;padding:0 5pt;border-color:#616263;border-style:solid;border-width:2px 1px 0 0}#search>ol>li div.meta:before{content:" ";display:inline-block;height:100%;vertical-align:middle}#search>ol>li div.meta:empty{border-width:0 1px 0 0}#search>ol>li div.meta.flip{background-color:#b3b4b5}#search>ol>li:first-of-type div.meta{border-top-width:0}#search>ol>li:last-of-type div.meta{border-bottom-width:0}div.snippet{text-overflow:ellipsis;text-indent:0;text-shadow:1px 1px rgba(255,255,255,0.5);font-size:0;white-space:nowrap !important}div.snippet>span,div.snippet mark{padding:5pt 0 6pt 0;font-size:10pt}div.snippet>mark,div.snippet>span.match{font-weight:bold;color:#333;text-shadow:none;padding-left:4pt;padding-right:2pt}div.snippet>span.match>span.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.snippet.startMore:before,div.snippet.endMore:after{content:"…";padding-left:2pt;padding-right:2pt}div.snippet div.flag{position:absolute;height:100%;top:0;left:0;width:11px;background-color:#f6a800;border-right:1px solid #e55d00}body.no-js #search>ol>li:active,#search>ol>li.active,#search>ol>li:target{position:relative;display:block;background-color:#f6a800;text-align:left;border-width:2px;white-space:normal;height:auto;width:auto;overflow:hidden}body.no-js #search>ol>li:active div.matchinfo,#search>ol>li.active div.matchinfo,#search>ol>li:target div.matchinfo{display:block}body.no-js #search>ol>li:active+li.active,#search>ol>li.active+li.active,#search>ol>li:target+li.active{border-top:2px solid #d9dadb;padding-top:6px}body.no-js #search>ol>li:active+li.active .button-group.button-view,#search>ol>li.active+li.active .button-group.button-view,#search>ol>li:target+li.active .button-group.button-view{padding-top:6px}body.no-js #search>ol>li:active .snippet,#search>ol>li.active .snippet,#search>ol>li:target .snippet{white-space:normal !important;padding:2pt 0 5pt 5pt;background-color:#f4eebb;margin-top:0;margin-right:20px;margin-bottom:0;margin-left:0}body.no-js #search>ol>li:active .snippet span,#search>ol>li.active .snippet span,#search>ol>li:target .snippet span{display:inline !important}body.no-js #search>ol>li:active .snippet>*,#search>ol>li.active .snippet>*,#search>ol>li:target .snippet>*{background-color:transparent}body.no-js #search>ol>li:active .snippet div.flag,#search>ol>li.active .snippet div.flag,#search>ol>li:target .snippet div.flag{display:none}body.no-js #search>ol>li:active .snippet>span,#search>ol>li.active .snippet>span,#search>ol>li:target .snippet>span{line-height:1.4em;width:auto}body.no-js #search>ol>li:active .snippet>span.context-left,#search>ol>li.active .snippet>span.context-left,#search>ol>li:target .snippet>span.context-left{margin-left:0;display:inline;overflow:visible;text-align:left;width:auto}body.no-js #search>ol>li:active .button-group.button-view,#search>ol>li.active .button-group.button-view,#search>ol>li:target .button-group.button-view{display:block}body.no-js #search>ol>li:active div.match-main,#search>ol>li.active div.match-main,#search>ol>li:target div.match-main{display:block;width:100%}body.no-js #search>ol>li:active div.match-main div.match-wrap,#search>ol>li.active div.match-main div.match-wrap,#search>ol>li:target div.match-main div.match-wrap{cursor:default;min-height:20pt;background-color:#f6a800;width:100%;margin-left:0;overflow-x:visible;white-space:normal}body.no-js #search>ol>li:active div.meta,#search>ol>li.active div.meta,#search>ol>li:target div.meta{display:none}body.no-js #search>ol>li:active p.ref,#search>ol>li.active p.ref,#search>ol>li:target p.ref{display:block;color:#fefefe;padding:3pt 10pt 3pt 3pt;padding-right:20px;margin:0pt;width:100%;bottom:0;z-index:30}body.no-js #search>ol>li:active p.ref>span.sigle,#search>ol>li.active p.ref>span.sigle,#search>ol>li:target p.ref>span.sigle{font-size:75%;vertical-align:top;color:#f4eebb;float:right}#search ol span.context-left{display:inline-block;width:50.01%;text-align:right}#search ol.align-right{text-align:right}#search ol.align-right div.match-main span.context-right{display:inline-block;width:49.915%;text-align:left}#search ol.align-center div.match-main{width:100% !important}#search ol.align-center div.match-main>.match-wrap{position:relative;margin-left:0}#search ol.align-center li:not(.active) div.snippet{white-space:normal;text-align:center;width:100000pt;margin-left:-50000pt}#search ol.align-center li:not(.active) div.snippet span.context-left{display:inline-block;text-align:right;width:40000pt;margin-left:70vw}#search ol.align-center li:not(.active) div.snippet span.context-right{display:inline-block;text-align:left;width:40000pt}#search ol span.context-left:empty::after,#search ol span.context-right:empty::after{content:" ";display:inline-block}mark{background-color:inherit;color:inherit}mark>mark,em,.level-0{border-bottom-width:2px;border-bottom-style:solid;padding-bottom:0px !important;font-style:normal}mark>mark>mark,em>em,.level-1{padding-bottom:3px !important}mark>mark>mark>mark,em>em>em,.level-2{padding-bottom:6px !important}#search>ol>li:not(.active) mark>mark>mark>mark,#search>ol>li:not(.active) em>em>em{line-height:180%}#search>ol>li.active mark>mark>mark>mark,#search>ol>li.active em>em>em{line-height:250%}.class-1{border-color:#c1002b}.class-2{border-color:#009ee0}.class-3{border-color:#f6a800}.class-4{border-color:#9bad0b}.logo::after{content:"" !important}.logo>*{background-repeat:no-repeat;background-size:90%;background-position:50% 50%}.logo>*>span{position:absolute;margin-left:-3000px}#kalamar-bg{position:fixed;height:110%;width:175%;top:0;z-index:-5000;opacity:.1;background-image:url("../img/korap-bg-kalamar.svg");background-size:50%;background-repeat:no-repeat;background-position:50% 50%}#logos{position:relative;text-align:right;font-size:85%;right:0;width:100%;margin-left:20px;padding-left:60%}#logos>div{border-top:26px solid #f6a800;padding-right:2em}#logos p{text-align:left;display:inline-block}#ids-logo{display:block;width:21.0333333333em;height:6.6666666667em;background-image:url("../img/ids-leibniz-institute-for-the-german-language.svg")}h1{position:absolute;margin:0;margin-left:15px;left:0;top:0;width:7.8em;height:2.4em;z-index:105;background-size:72%;background-image:url("../img/korap-logo-kalamar.svg")}#overview{text-align:center;width:100%}div.matchtable>div{z-index:20;margin-left:179px;margin-right:20px;padding:0;overflow-x:auto;overflow-y:visible;width:auto}div.matchtable table{display:table;border-collapse:separate;border-spacing:0px}div.matchtable th{color:#fefefe}div.matchtable td,div.matchtable tbody th,div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted){cursor:pointer}div.matchtable td:empty{cursor:default}div.matchtable td:empty::after{content:" ";white-space:pre}div.matchtable td.matchkeyvalues{padding:0}div.matchtable td.matchkeyvalues>div{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}div.matchtable td.matchkeyvalues>div>span{color:#e55d00;text-align:right;padding-right:.5em}div.matchtable td.matchkeyvalues>div>span::after{content:":"}div.matchtable tr{outline:none}div.matchtable tr td.chosen,div.matchtable tr th.chosen,div.matchtable tr div.chosen{background-color:#9bad0b !important;color:#fefefe}div.matchtable tr>th:nth-of-type(1),div.matchtable tr>th:nth-of-type(2){border-top:2px solid #ff8000;width:88px;position:absolute;z-index:80;vertical-align:middle;left:0px}div.matchtable tr>th:nth-of-type(2){left:90px}div.matchtable tr>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;border:1px solid #f6a800}div.matchtable tr>td{background-color:#ffd080;white-space:nowrap;vertical-align:top;text-align:center}div.matchtable tr>td.mark{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td.mark{background-color:#ffd080}div.matchtable thead th{background-color:#ff8000;border-top-width:0px !important;text-align:center}div.matchtable thead th:nth-of-type(1),div.matchtable thead th:nth-of-type(2){text-align:left}div.matchtable thead th.mark{background-color:#e55d00}div.matchtable thead th.cutted{background-color:#f4eebb}div.matchtable thead th.cutted::after{font-family:'FontAwesome';white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.matchtable tbody>tr:nth-of-type(1)>th{border-top-color:transparent}path.edge{stroke:#ff8000;stroke-width:2px;fill:none}g.arc.infocus>path.edge{stroke:#636f07}marker#arr{overflow:visible}marker#arr path{stroke:#e55d00;fill:#e55d00;fill-opacity:1;stroke-width:2}path.anchor{stroke:#e55d00;stroke-width:3;stroke-linecap:round;z-index:20}g.root rect.empty{stroke:#ff8000;fill:#ff8000;stroke-width:2px}g.middle rect,g.label rect{stroke:#ff8000;stroke-width:2px;fill:#ffd080}g.label.infocus rect{stroke:#636f07;fill:#dce883}g.middle.mark rect{fill:#ff8000}g.middle.mark>text{fill:#f4eebb}g.middle.mark>text>tspan{stroke:#f4eebb}g.leaf.mark text>tspan{font-weight:bold}g.leaf>rect{display:none}g>text>tspan{text-anchor:middle;font-size:9pt}g.leaf>text>tspan,text.leaf>tspan{font-size:10pt;overflow:visible}div.matchtree{overflow-x:hidden;overflow-y:visible;padding:0;margin-top:1pt}div.matchtree h6{display:inline;font-size:inherit;color:#fefefe;margin:0;padding:0 !important;float:left}div.matchtree h6>span{border-top:2px solid #ff8000;width:88px;text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;display:inline-block !important;margin:0}div.matchtree h6>span:nth-of-type(2){margin-left:2px}div.matchtree>div{position:unset;z-index:4;overflow-x:auto;margin:2px;margin-left:180px;margin-right:20px;background-color:#f4eebb}div.metatable>dl{margin-right:20px;margin-top:2px}div.metatable>dl>div{border-color:#f6a800}div.metatable>dl>div>*{padding:.2em}div.metatable>dl>div>dt{background:#ff8000;color:#fefefe;width:12.5em}div.metatable>dl>div>dd{background-color:#f4eebb;cursor:pointer}div.metatable>dl>div>dd.metakeyvalues{padding:0}div.metatable>dl>div>dd.metakeyvalues>div{padding:.2em}div.metatable>dl>div>dd.metakeyvalues>div::before{content:"\2022\00A0";color:#f6a800}div.metatable>dl>div>dd.chosen,div.metatable>dl>div>dd>div.chosen{background-color:#9bad0b !important;color:#fefefe}div.metatable>dl>div>dd[data-type="type:store"],div.metatable>dl>div>dd[data-type="type:attachement"]{background-color:#ffd080;cursor:default}div.metatable>dl>div>dd[data-type="type:store"] a,div.metatable>dl>div>dd[data-type="type:attachement"] a{color:inherit}div.metatable>dl.cbm-disabled>div>dd{cursor:default !important}div.matchinfo{position:relative;width:100%;padding-top:2px;height:auto;font-size:10pt;text-align:left}div.matchinfo:empty{display:none !important}div.matchinfo .view+.view{margin-top:8px !important}div.metatable,div.matchtable,div.matchtree{position:relative;background-color:#f6a800}div.button-group.button-panel.button-matchinfo{display:inline-block;margin-right:.5em}div.button-group.button-panel.button-matchinfo>span{position:relative;box-shadow:none}#pagination{position:fixed;font-size:0;right:10px;bottom:20px;z-index:35;padding:0;height:auto;line-height:0}#pagination>a{margin:0;font-size:10pt;padding:0}#pagination>a>span{padding-left:.4em;padding-right:.4em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);display:inline-block;line-height:2em;text-align:center;border-top-width:2px;border-bottom-width:2px;border-top-style:solid;border-bottom-style:solid}#pagination>a:not(:link):not([rel=self]) span{color:#87888a}#pagination>a.ellipsis>span>span{position:absolute;margin-left:-3000px}#pagination>a.ellipsis>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=self]>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;border-left-width:2px;border-right-width:2px;border-left-style:solid;border-right-style:solid}#pagination>a[rel=prev]>span{border-top-left-radius:6px;border-bottom-left-radius:6px;border-left-width:2px;border-left-style:solid}#pagination>a[rel=prev]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=prev]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a[rel=next]>span{border-top-right-radius:6px;border-bottom-right-radius:6px;border-right-width:2px;border-right-style:solid}#pagination>a[rel=next]>span>span{position:absolute;margin-left:-3000px}#pagination>a[rel=next]>span::after{font-family:'FontAwesome';white-space:nowrap;content:"";line-height:1em}#pagination>a:link:hover,#pagination>a:link:focus{outline:none}#pagination>a:link:hover span,#pagination>a:link:focus span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query{overflow-x:hidden;padding:.5em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:relative;border-width:2px;border-style:solid;border-radius:6px;box-shadow:2px 2px 2px rgba(0,0,0,0.2)}pre.query:not(.unsupported){cursor:pointer}pre.query:not(.unsupported):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query:not(.unsupported):active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}pre.query.unsupported span{vertical-align:super;color:#009ee0;font-size:90%;font-weight:bold;cursor:help}#resultinfo{clear:both;text-align:right;line-height:1.5em;min-height:1.5em;margin-top:.4em;font-size:10pt}#resultinfo p.found{display:inline;padding:0;margin:0;text-align:right}#resultinfo.found{position:relative;margin-bottom:0px}#resultinfo.found .button-group>span{margin-bottom:0;border-bottom-width:0;box-shadow:none}#resultinfo.found .button-group>span:first-child{border-bottom-left-radius:0}#resultinfo.found .button-group>span:last-child{border-bottom-right-radius:0}div.result.panel .view{border:1px solid #87888a;background-color:#f6a800}.result.button-group.button-panel{display:inline-block;width:auto;vertical-align:bottom;line-height:1.5em}.result.button-group.button-panel>span{line-height:1.5em;border-width:1px 0}.result.button-group.button-panel>span:first-child{border-left-width:1px}.result.button-group.button-panel>span:last-child{border-right-width:1px}#total-results{color:#9bad0b;font-weight:bold}.no-results{margin:0 auto;text-align:center}.no-results code{font-weight:bold}.button-icon.align.left::after{content:""}.button-icon.align.right::after{content:""}.button-icon.align.center::after{content:""}.button-icon.show-kq::after{content:""}#tutorial{position:fixed;z-index:9999;top:5%;bottom:5%;left:2%;right:2%;padding-right:20px;background-color:#fefefe;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:4px;border-color:#616263;border-style:solid;border-radius:6px}#tutorial .button-group.button-view{background-color:#87888a;display:block;height:100%}#tutorial iframe{border-width:0;width:100%;min-height:100.1%;background-image:url("../img/korap-bg-kalamar.svg");background-repeat:no-repeat;background-position:center center;background-size:20%}p.bibentry{font-size:80%;margin-left:3em;margin-bottom:3em;text-indent:-1.5em}p.bibentry cite{font-weight:bold}body.embedded{background-color:#fefefe}body.embedded aside{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-top:0;background-color:#87888a}body.embedded aside>div{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}main.tutorial a.embedded-link::after{font-family:'FontAwesome';white-space:nowrap;content:" ";font-size:75%}#koralquery{white-space:pre}#koralquery>div{background-color:#fefefe;overflow-x:auto;font-size:85%;margin-top:2pt;margin-right:20px;margin-bottom:2pt;margin-left:2pt}.alertify,.alertify-show,.alertify-log{-webkit-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-ms-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)}.alertify-hide{-webkit-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-log-hide{-webkit-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-cover{position:fixed;z-index:99999;top:0;right:0;bottom:0;left:0;background-color:white;filter:opacity(0);opacity:0}.alertify-cover-hidden{display:none}.alertify{position:fixed;z-index:99999;top:50px;left:50%;width:550px;margin-left:-275px;opacity:1}.alertify-hidden{-webkit-transform:translate(0, -150px);-moz-transform:translate(0, -150px);-ms-transform:translate(0, -150px);-o-transform:translate(0, -150px);transform:translate(0, -150px);opacity:0;display:none}:root *>.alertify-hidden{display:block;visibility:hidden}.alertify-logs{position:fixed;z-index:5000;bottom:10px;right:10px;width:300px}.alertify-logs-hidden{display:none}.alertify-log{display:block;margin-top:10px;position:relative;right:-300px;opacity:0}.alertify-log-show{right:0;opacity:1}.alertify-log-hide{-webkit-transform:translate(300px, 0);-moz-transform:translate(300px, 0);-ms-transform:translate(300px, 0);-o-transform:translate(300px, 0);transform:translate(300px, 0);opacity:0}.alertify-dialog{padding:25px}.alertify-resetFocus{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.alertify-inner{text-align:center}.alertify-text{margin-bottom:15px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:100%}.alertify-button,.alertify-button:hover,.alertify-button:active,.alertify-button:visited{background:none;text-decoration:none;border:none;line-height:1.5;font-size:100%;display:inline-block;cursor:pointer;margin-left:5px}@media only screen and (max-width: 680px){.alertify,.alertify-logs{width:90%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.alertify{left:5%;margin:0}}.alertify,.alertify-log{font-family:sans-serif}.alertify{background:#FFF;border:10px solid #333;border:10px solid rgba(0,0,0,0.7);border-radius:8px;box-shadow:0 3px 3px rgba(0,0,0,0.3);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box}.alertify-text{border:1px solid #CCC;padding:10px;border-radius:4px}.alertify-button{border-radius:4px;color:#FFF;font-weight:bold;padding:6px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.5);box-shadow:inset 0 1px 0 0 rgba(255,255,255,0.5);background-image:-webkit-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-moz-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-ms-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:-o-linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0));background-image:linear-gradient(top, rgba(255,255,255,0.3), rgba(255,255,255,0))}.alertify-button:hover,.alertify-button:focus{outline:none;background-image:-webkit-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-moz-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-ms-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:-o-linear-gradient(top, rgba(0,0,0,0.1), transparent);background-image:linear-gradient(top, rgba(0,0,0,0.1), transparent)}.alertify-button:focus{box-shadow:0 0 15px #2B72D5}.alertify-button:active{position:relative;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.alertify-button-cancel,.alertify-button-cancel:hover,.alertify-button-cancel:focus{background-color:#FE1A00;border:1px solid #D83526}.alertify-button-ok,.alertify-button-ok:hover,.alertify-button-ok:focus{background-color:#5CB811;border:1px solid #3B7808}.alertify-log{background:#1F1F1F;background:#000;padding:15px;border-radius:4px;color:#FFF}.alertify-log-success{background:#5CB811;background:#5cb811}article.alertify-log-warn{background-color:#f6a800}article.alertify-log-warn code.src{color:#e55d00}article.alertify-log code.src{display:block;color:#000;font-size:70%}.alertify-log-error{background-color:#fe1a00}#notifications{display:none}div.notify{position:relative;margin:.5em auto;display:block;padding:.5em;border-radius:6px;max-width:30em;background-color:#fe1a00;color:#fefefe}div.notify.notify-success{background-color:#636f07}div.notify.notify-warn{background-color:#f29400}div.intro a:visited{color:#e55d00}div.intro div.announcement{background-color:#f4eebb;padding:8px;border:5px dashed #f6a800;border-radius:1em;width:90%;margin:auto}aside.active ~ main div.intro{margin-left:198px}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel a,.button-group.operators>span,.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:hover,.button-group.button-panel a:hover,.button-group.operators>span:hover,.button-group.operators a:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.button-group.button-panel>span:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span>span.check,.button-group.button-panel a>span.check{font-family:'FontAwesome';white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:'FontAwesome';white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}div.panel{position:relative;width:100%;display:block}div.view{position:relative;padding-top:2px;display:block;width:100%}div.view:not(.show){display:none}.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0,0,0,0.4)), color-stop(100%, rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);background:radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.4) 0, rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-fixParent{z-index:auto !important;opacity:1.0 !important;-webkit-transform:none !important;-moz-transform:none !important;-ms-transform:none !important;-o-transform:none !important;transform:none !important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999 !important}.introjs-disableInteraction{z-index:99999999 !important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,0.9);border:1px solid #777;border:1px solid rgba(0,0,0,0.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,0.4);-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;-ms-transition:all 0.3s ease-out;-o-transition:all 0.3s ease-out;transition:all 0.3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999 !important;padding:2px;font-family:Arial, verdana, tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background:#ff3019;background:-webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));background:-moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-o-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,0.4)}.introjs-arrow{border:5px solid transparent;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:white}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:white}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:white}.introjs-arrow.right{right:-10px;top:10px;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:white}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:white}.introjs-arrow.left{left:-10px;top:10px;border-right-color:white}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:white}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,0.4);-webkit-transition:opacity 0.1s ease-out;-moz-transition:opacity 0.1s ease-out;-ms-transition:opacity 0.1s ease-out;-o-transition:opacity 0.1s ease-out;transition:opacity 0.1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:0.3em 0.8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:none;background-color:#ececec;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));background-image:-moz-linear-gradient(#f4f4f4, #ececec);background-image:-o-linear-gradient(#f4f4f4, #ececec);background-image:linear-gradient(#f4f4f4, #ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0px 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));background-image:-moz-linear-gradient(#ececec, #f4f4f4);background-image:-o-linear-gradient(#ececec, #f4f4f4);background-image:linear-gradient(#ececec, #f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:0.2em 0 0 0.2em;-moz-border-radius:0.2em 0 0 0.2em;border-radius:0.2em 0 0 0.2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-nextbutton{-webkit-border-radius:0 0.2em 0.2em 0;-moz-border-radius:0 0.2em 0.2em 0;border-radius:0 0.2em 0.2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:0.2em;-moz-border-radius:0.2em;border-radius:0.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0.0}25%{-webkit-transform:scale(0);opacity:0.1}50%{-webkit-transform:scale(0.1);opacity:0.3}75%{-webkit-transform:scale(0.5);opacity:0.5}100%{-webkit-transform:scale(1);opacity:0.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0.0}25%{-moz-transform:scale(0);opacity:0.1}50%{-moz-transform:scale(0.1);opacity:0.3}75%{-moz-transform:scale(0.5);opacity:0.5}100%{-moz-transform:scale(1);opacity:0.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0.0}25%{transform:scale(0);opacity:0.1}50%{transform:scale(0.1);opacity:0.3}75%{transform:scale(0.5);opacity:0.5}100%{transform:scale(1);opacity:0.0}}.introjs-helperLayer{background-color:transparent}.introjs-tooltip.gTstartSearch{max-width:500px}.tgreeting{font-weight:bold;color:#e55d00}.pfirstStep{width:500px}.introjs-donebutton{float:right;margin-left:5px}.introjs-skipbutton{color:#333}ul.client-list{padding-left:1.5em}ul.client-list li.client{list-style-type:none}ul.client-list li.client span.client-name::before{margin-left:-1.5em}ul.client-list li.client span.client-desc{font-size:70%;display:block}span.client-name{font-weight:bold}span.client-name::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;width:1.5em;content:"";color:#009ee0;font-size:100%}section#news{background-color:#e3e8a3;mix-blend-mode:soft-light;padding:1em;padding-right:2em;border-radius:6px;border-left:5px solid #636f07}section#news dt{float:left;clear:left;width:15ex;text-align:right;font-weight:bold}section#news dd.maintenance>h4::after{font-family:'FontAwesome';white-space:nowrap;color:#c1002b;content:" "}section#news dd{margin:0 1ex 0 16ex;padding:0 0 0.5em 1em}section#news dd>p{max-width:80ex;margin-block-start:0ex}section#news dd>h4{margin-block-start:0ex;margin-block-end:0.33ex}@media all and (max-width: 42.5em){section#news dt{text-align:left;float:none;width:auto;padding-bottom:.2em}section#news dd{margin-left:1em}}div.view.widget{padding-right:20px}div.view.widget>iframe{margin:0;box-sizing:border-box;padding:0;width:100%;overflow-x:auto}div.panel.result>div>div.widget>iframe{background-color:#fefefe}main{padding-bottom:20pt;margin-left:40px;margin-right:20px}main.embedded{margin-left:14px;margin-right:14px}main p{text-align:justify;hyphens:auto}main h2#page-top{margin-top:0;padding-top:1em}main.page{margin-left:245px}main.page p code,main.page li code,main.page dd code,main.page dt code{background-color:#d9dadb;color:#87888a;padding:0 .5em;border-radius:6px}main p.hint{margin:0 auto;text-align:center}ul.menu.hint{display:inline-block;white-space:normal;text-align:left;max-width:23em !important;top:0}ul.menu.hint>li:first-of-type{border-top-width:1px;border-top-left-radius:0;border-top-right-radius:0}div.alert.hint{position:absolute;background-color:#fe1a00;color:#fefefe;padding:3pt 6pt;margin-top:8px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);width:auto;min-width:10em;max-width:23em !important;transition:opacity 0.2s ease 0s;border-radius:6px;border-top-left-radius:0}div.alert.hint::before{position:absolute;content:"";display:block;top:-12px;left:0;width:0;white-space:normal;border-width:0 8px 12px 0;border-style:solid;border-color:#fe1a00 transparent}.hint.mirror{position:absolute;display:block;left:0;top:0;z-index:90;white-space:pre-wrap;height:0}.hint.mirror>span{opacity:0;white-space:pre-wrap;overflow:hidden}.hint.mirror>div{position:absolute;display:block;cursor:pointer;transition:left 0.2s ease 0s;top:0;left:0;text-align:left;padding:0;border-top:5px solid #f6a800;height:10px;width:1.2em}.hint.mirror>div:hover:not(.active){border-top:10px solid #f6a800}.hint.mirror>div.active{border-top-width:0;height:0;width:23em}#q-field{display:block;margin-bottom:3px;width:100%;margin:0}#q-field::-webkit-search-cancel-button{display:none}#q-field.loading{background-color:#f4eebb;background-image:none}#searchbar{position:relative;width:100%;padding:0;padding-right:70px}#searchbar button[type=submit]{position:absolute;padding:0;right:40px}#searchbar button[type=submit]:not(.loading)::after{content:""}.query.panel{padding-right:70px}.query.button-group.button-panel{display:block;width:auto;text-align:right;vertical-align:top;line-height:1.3em}.query.button-group.button-panel>span{box-shadow:none}.vc{margin-top:4pt}.vc .builder{position:initial}.vc .docGroup{position:relative;display:inline-block;margin-left:4em;padding:4pt 2pt 4pt 0pt;border-radius:12px;border-style:solid;border-width:0 .4em}.vc .docGroup .docGroup{display:block}.vc .docGroup[data-operation]>.doc:first-child::before,.vc .docGroup[data-operation]>.docGroup:first-child::before{content:none}.vc .docGroup[data-operation]>.doc::before,.vc .docGroup[data-operation]>.docGroup::before{position:absolute;display:inline-block;text-align:right;width:4em;margin-left:-4.5em;line-height:1.5em;border-top:2px solid transparent}.vc .docGroup[data-operation]>.docGroup::before{margin-left:-4.9em}.vc .docGroup[data-operation=or]>.doc::before,.vc .docGroup[data-operation=or]>.docGroup::before{content:"or"}.vc .docGroup[data-operation=and]>.doc::before,.vc .docGroup[data-operation=and]>.docGroup::before{content:"and"}.vc .docGroup>.operators{position:absolute;display:block;vertical-align:middle;top:10px;left:3px;margin-left:100%;padding:0}.vc .docGroup>.operators>span:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.vc .doc{line-height:170%;padding-left:4em}.vc .doc>span+span,.vc .doc>span+div+span,.vc .doc>span+ul+span{margin-left:5pt}.vc .doc>span.key,.vc .doc>span.value{font-weight:bold}.vc .doc>span.value[data-type=regex]{font-style:italic}.vc .doc>span.value[data-type=regex]::after,.vc .doc>span.value[data-type=regex]::before{content:'/'}.vc .doc>span.key{position:relative}.vc .doc>span.key>ul{margin:0;margin-left:3.3em}.vc .doc>span.key.fixed{color:#9bad0b}.vc .doc.unspecified>span,.vc .doc span.unspecified{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding:0 4px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-style:solid;border-width:2px;border-radius:6px}.vc .doc>.operators{display:inline-block;margin-left:10px}.vc .rewritten .rewrite{display:inline-block;margin-left:4pt;color:#f6a800}.vc .rewritten .rewrite::after{font-family:'FontAwesome';white-space:nowrap;font-style:normal;font-weight:normal;content:"";text-decoration:underline}.vc .rewritten .rewrite>span{display:none}.vc .operators{opacity:0;white-space:nowrap;padding:0;font-size:0;line-height:0;text-align:center}.vc>.docGroup{margin-left:0}.vc .menu{display:inline-block}.vc .menu li[data-type=ref]::before,.vc span.key.ref::before{font-family:'FontAwesome';white-space:nowrap;content:"";padding-right:4pt;font-style:normal;font-weight:normal}.vc div.value{position:absolute;display:inline-block;min-width:max-content;z-index:8000;padding:4pt;margin-top:-6pt;border-radius:6px;border-width:2px;border-style:solid}.vc div.value input{border-width:0;outline-width:0}.vc div.value>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:inline-block;padding:0 4pt;margin-left:4pt;font-size:80%;font-style:italic;border-width:2px;border-style:solid;border-radius:6px}.vc div.value.regex>input{font-style:italic}.vc div.value.regex>div{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}.vc:not(.fragment) .docGroup,.vc:not(.fragment) .doc{color:#616263}.vc:not(.fragment) .docGroup:hover{background-color:rgba(255,255,255,0.3)}.vc:not(.fragment) .doc>span:not(.fixed){cursor:pointer}.vc:not(.fragment) .doc>span:not(.fixed):hover{color:#f6a800}.vc:not(.fragment) .doc.unspecified>span:hover,.vc:not(.fragment) span.unspecified:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.vc:not(.fragment) .doc:hover>.operators,.vc:not(.fragment) .docGroup:hover>.operators{opacity:1}.vc:not(.fragment) .docGroup[data-operation]>.doc::before,.vc:not(.fragment) .docGroup[data-operation]>.docGroup::before{color:#f6a800}.vc:not(.fragment) .docGroup[data-operation=or]{border-color:#f6a800}.vc:not(.fragment) div.value{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);box-shadow:2px 2px 2px rgba(0,0,0,0.2)}.vc:not(.fragment) div.value>div{cursor:pointer}.vc:not(.fragment) div.value>div:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.docGroup>.operators{z-index:30}.docGroup .docGroup>.operators{z-index:31}.docGroup .docGroup .docGroup>.operators{z-index:32}.docGroup .docGroup .docGroup .docGroup>.operators{z-index:33}.docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:34}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:35}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:36}.vc.fragment>div>div.docGroup{margin-left:0}.vc.fragment .doc{margin-right:2em}#collection{line-height:1em;border-radius:6px}#vc-choose>span.rewritten::after{font-family:'FontAwesome';white-space:nowrap;color:#f6a800;padding:0;padding-left:4px;content:"";text-decoration:underline;font-style:normal;font-weight:normal}div#vc-view{position:relative}div#vc-view>div.vc{display:none;margin:1.3em 0 .5em 0;border:2px solid #636f07;background-color:#fefefe}div#vc-view>div.vc.active{display:block}div#vc-view>div.vc>div:first-child{padding:1.3em}div.panel.vcinfo{padding:3pt 0pt 3pt 3pt;background-color:#636f07}div.panel.vcinfo div.button-group>span{box-shadow:none}div.stattable{display:flex;flex-direction:row;margin-right:20px}div.stattable>dl{margin-bottom:4px}div.stattable>dl>div{border-color:#636f07}div.stattable>dl>div>dt{background-color:#8a9a0a;width:15em;margin:0}div.stattable>dl>div>dt::after{content:":"}div.stattable>dl>div>dd{background-color:#dce883;color:#616263}div.stattable.stdisabled dt,div.stattable.stdisabled dd{background-color:#b9c46a;color:#636f07;text-shadow:none}div.reloadStatB>span.refresh{margin-left:2pt}span.refresh::after{vertical-align:sub;content:""}@media (min-width: 1680px){div.stattable dl.flex>div{width:inherit}}div.datepicker{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);position:absolute;display:inline-block;z-index:90;font-size:80%;padding:4pt;box-shadow:2px 2px 2px rgba(0,0,0,0.2);border-width:2px;border-style:solid;border-radius:6px}div.datepicker>div{font-size:120%;width:45%}div.datepicker>div.month{float:right}div.datepicker>div>span{display:inline-block;overflow:hidden;white-space:nowrap}div.datepicker>div>span:first-child,div.datepicker>div>span:last-child{width:15%}div.datepicker>div>span:first-child::before,div.datepicker>div>span:last-child::before{font-family:'FontAwesome';white-space:nowrap;display:inline-block;text-align:center;cursor:pointer;min-width:14px}div.datepicker>div>span:first-child::before{content:""}div.datepicker>div>span:last-child::before{content:""}div.datepicker>div>span:nth-child(2){display:inline-block;cursor:pointer;width:70%;text-align:center;text-overflow:ellipsis;border-radius:6px;border-style:solid;border-width:2px;border-color:transparent}div.datepicker>div>span:nth-child(2):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker>div>span:nth-child(2).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker table{border-collapse:separate;border-spacing:1px}div.datepicker input{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);padding-left:.4em;padding-right:.4em;background-color:#fefefe;width:100%;border-style:solid;border-width:1px}div.datepicker td{padding-left:.4em;padding-right:.4em;text-align:center;border-style:solid;border-width:1px}div.datepicker td:not(.out){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);cursor:pointer;background-color:#fefefe}div.datepicker td:not(.out).today{background-color:#bce4f7;color:#009ee0;text-shadow:none}div.datepicker td:not(.out).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker td:not(.out):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker td.out{border-color:transparent}#ql-field{position:relative;background-color:#9bad0b;cursor:pointer;margin:0;outline:none;border:none;display:inline-block;color:white;border-width:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#ql-field:checked{outline:none}#ql-field>option{padding:0pt 2pt;outline:none}#ql-field:-moz-focusring{color:transparent;text-shadow:0 0 0 white}input.pipe{display:none}header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;background-color:#9bad0b;padding:8px 0 0 8px;font-size:10pt;color:#fefefe}header span.select{display:inline-block;cursor:pointer;line-height:1.8em;border-width:0;border-bottom-width:3px;border-style:solid;border-color:transparent}header span.select>span{font-weight:bold}header span.select:hover{color:#636f07;border-color:#636f07}header span.select::after{font-family:'FontAwesome';white-space:nowrap;pointer-events:none;text-align:center;content:"";padding-left:4pt;padding-right:4pt}header span.select.active{border-color:#f6a800}header span.select.active::after{content:""}header form{position:relative;display:block;padding-left:230px;min-height:2.7em;margin:0px}header input{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0}header .button{color:#fefefe;line-height:2em;margin-right:40px}header .button.right{float:right;display:inline-block}header .button.top{position:absolute;display:block;top:0;right:0;margin-right:0;width:20px;background-color:#636f07;text-align:center;height:100%;z-index:20}header .button.top>a:hover{color:#fefefe}header .button>a{color:#fefefe;cursor:pointer;position:relative;font-size:120%}header .button>a>span{position:absolute;margin-left:-3000px}header .button>a::after{font-family:'FontAwesome';white-space:nowrap}header .button>a.tutorial::after{content:""}header .button>a.question::after{content:""}header .button>a.login::after{content:""}header .button>a.logout::after{content:""}.query.button-group>span{border-top-width:0;border-color:white}.query.button-group>span:first-child{border-top-left-radius:0}.query.button-group>span:last-child{border-top-right-radius:0}footer{background-color:#616263;position:absolute;bottom:0;padding-bottom:2px;font-size:70%;width:100%;text-align:right}footer a:link{margin:0 .5em;color:#d9dadb}footer a:visited{color:#d9dadb}footer a:hover{color:#fefefe}footer a[href^="http://"]::after,footer a[href^="https://"]::after{content:none}footer span.separator:after{content:"-";color:#d9dadb}aside{background-color:#636f07;color:#fefefe;width:230px;position:fixed;display:block;transition:all .3s ease-in-out;outline:none;font-size:10pt;z-index:100;top:0;left:0;height:100%;padding-top:65px}aside>div{overflow-y:auto;overflow-x:visible;max-height:100%}aside>*{opacity:1}aside::after{font-family:'FontAwesome';white-space:nowrap;position:absolute;display:block;opacity:0;cursor:pointer;right:0;bottom:0;content:"";font-size:16pt;width:16pt;height:17pt;padding:6pt;background-color:#636f07;border-top-right-radius:6px;margin-right:-20px}aside h2,aside legend{line-height:2em;text-align:center;padding:0;margin:0;font-size:100%;font-weight:bold}aside ul.nav{list-style-type:none;margin:0;font-size:10pt;text-indent:0;padding:0}aside ul.nav li{padding:0}aside ul.nav li>a{padding:3pt 6pt}aside ul.nav li>a:visited{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5)}aside ul.nav li.folded.active ul{display:block}aside ul.nav li.folded ul{display:none}aside ul.nav li.active>a:link{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}aside ul.nav li>a:link{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,0.5);display:block;border-right-width:2px;border-right-style:solid}aside ul.nav li>a:link:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}aside ul.nav li h3{padding:0;margin:0;font-weight:bold;font-size:100%}aside ul.nav li>a{padding-left:6pt}aside ul.nav li li>a{padding-left:18pt}aside ul.nav li li li>a{padding-left:36pt}aside nav>ul>li>a{font-weight:bold}aside fieldset{position:relative;border-width:0}aside fieldset legend{display:none}aside fieldset input[type=text],aside fieldset input[type=password]{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0;width:100%}aside fieldset>form>div{position:relative;width:100%;margin-top:4px;padding-right:30px}aside fieldset>p{color:#9bad0b}aside fieldset>p.announcement{color:#fefefe}aside fieldset>p.announcement>time{display:block;font-size:70%}aside fieldset hr{border:none;border-top:2px solid #d9dadb}aside fieldset ul{display:block;font-size:80%;text-align:right;padding:0;margin-top:0}aside fieldset ul>li{display:inline}aside fieldset ul>li:first-child::after{content:' | '}aside fieldset button{position:absolute;top:0;right:0}aside fieldset button::after{content:""}aside.off,aside:not(:focus):not(.active){margin-left:-210px}aside.off::after,aside:not(:focus):not(.active)::after{opacity:1}aside.off>*,aside:not(:focus):not(.active)>*{opacity:0;transition-property:opacity;transition-duration:.3s}aside.off::after{display:none}body.no-js #notifications{display:block !important}body.no-js aside{position:relative;display:block;transition:none;margin-left:0 !important;padding-top:0;width:100%;top:0}body.no-js aside>*{opacity:1 !important;transition:none}body.no-js aside form.login>input,body.no-js aside form.login>div{width:auto;margin-top:0}body.no-js aside form.login>input:first-of-type,body.no-js aside form.login>div:first-of-type{float:left;margin-right:1em}body.no-js aside form.login button{height:100%}body.no-js aside p,body.no-js aside::after{display:none}body.no-js main div.intro{margin-left:8px !important}#activate{text-align:right;background-color:#f6a800;margin-top:0;padding:8px;padding-right:40px;color:#fefefe;font-size:80%}@media all and (max-width: 42.5em){body,#search>ol,#search div.snippet>span,header,header input,div#resultinfo,#pagination>a{font-size:9pt}header{padding-right:8px}header form{padding-left:0;padding-top:33px}.vc{font-size:9pt}.vc .builder .doc{padding-left:3em}.vc .builder * .docGroup{margin-left:3em}.vc .builder>.doc{padding-left:.5em}.vc .builder>.docGroup{margin-left:.5em}h1{margin-left:10px;width:130px;height:40px;background-size:100%;background-position:50% 0;z-index:110}#searchbar{padding-right:30px}#searchbar input{font-size:9pt}#searchbar button[type=submit]{right:0}.level-1{padding-bottom:2px}.level-2{padding-bottom:4px}main{margin-left:4px;margin-right:4px}header .button{margin-right:4px}header .button.top{height:auto}#search ol>li:target>div>div.snippet,#search ol>li.active>div>div.snippet{margin:2px 2em 2px 4px}#search ol>li div.meta{display:none}div.matchinfo{font-size:9pt}div.matchtable tr>*{padding:1pt 3pt}div.matchtree h6{display:block;float:none}div.matchtree>div{margin-left:2px}#kalamar-bg{overflow:hidden}#logos{margin-left:0;margin-right:0}#logos>div{border-top-width:14px;padding-right:0}#logos>div .logo>*{background-size:60%;background-position:0 0}div.intro{width:100%}body.embedded aside>div{top:0;transform:translateY(0)}aside:not(:focus):not(.active){margin-left:-230px}aside:not(:focus):not(.active)::after{font-size:12pt;height:11pt;text-align:right;padding-right:3pt;padding-top:2pt}aside ul{font-size:9pt;line-height:1em}aside.active ~ main div.intro,aside.active ~ main.page{margin-left:4px !important}aside.active{position:relative;display:block;padding-top:0;width:100%;top:0;border-width:0}aside.active fieldset input{font-size:9pt}aside.active::after{display:none}aside.active p,aside.active hr{display:none}#tutorial{border-radius:0;border-width:0;right:0;left:0;bottom:0;top:0;padding:0}#tutorial iframe{border-radius:0}#tutorial>ul.action.right{height:1.5em;right:20px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}main.page{margin-right:20px}}@media print{body,html,select,g>text{color:black}header,aside{display:none}main.page{margin:1em}#kalamar-bg{display:none}a.embedded-link{color:black;text-decoration:underline}pre.query.tutorial{background-color:white;color:black;margin-left:1em;margin-right:1em}blockquote.warning{background-color:grey;color:white;border-left-color:black;border-left-width:1em}}
+/*# sourceMappingURL=kalamar-0.41.1.css.map */
diff --git a/public/css/kalamar-0.41.1.css.map b/public/css/kalamar-0.41.1.css.map
new file mode 100644
index 0000000..0ea4a67
--- /dev/null
+++ b/public/css/kalamar-0.41.1.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../../dev/scss/base/fonts.scss","../../dev/scss/base/flextable.scss","../../dev/scss/base/mixins.scss","../../dev/scss/base/lengths.scss","../../dev/scss/base/fragment.scss","../../dev/scss/base/choose.scss","../../dev/scss/base/colors.scss","../../dev/scss/base/icons.scss","../../dev/scss/base/load.scss","../../dev/scss/base/form.scss","../../dev/scss/base/view.scss","../../dev/scss/base/menu.scss","../../dev/scss/base/banner.scss","../../dev/scss/base/base.scss","../../dev/scss/main/highlight.scss","../../dev/scss/main/kwic.scss","../../dev/scss/main/logos.scss","../../dev/scss/main/view/matchtable.scss","../../dev/scss/main/view/tree.scss","../../dev/scss/main/view/matchtree.scss","../../dev/scss/main/view/metatable.scss","../../dev/scss/main/matchinfo.scss","../../dev/scss/main/pagination.scss","../../dev/scss/main/query.scss","../../dev/scss/main/resultinfo.scss","../../dev/scss/main/tutorial.scss","../../dev/scss/main/koralquery.scss","../../dev/scss/main/alertify/alertify-core.scss","../../dev/scss/main/alertify/alertify-default.scss","../../dev/scss/main/alertify.scss","../../dev/scss/main/intro.scss","../../dev/scss/main/buttongroup.scss","../../dev/scss/main/panel.scss","../../dev/scss/main/introjs.scss","../../dev/scss/main/introjs-ids.scss","../../dev/scss/main/oauth.scss","../../dev/scss/main/news.scss","../../dev/scss/main/plugin.scss","../../dev/scss/main/main.scss","../../dev/scss/header/hint.scss","../../dev/scss/header/searchbar.scss","../../dev/scss/header/vc.scss","../../dev/scss/header/statistics.scss","../../dev/scss/header/datepicker.scss","../../dev/scss/header/querylanguage.scss","../../dev/scss/header/pipe.scss","../../dev/scss/header/header.scss","../../dev/scss/footer/footer.scss","../../dev/scss/sidebar/sidebar.scss","../../dev/scss/no-js.scss","../../dev/scss/media.scss"],
+"names": [],
+"file": "kalamar-0.41.1.css"
+}
diff --git a/public/css/kalamar-0.41.3.css b/public/css/kalamar-0.41.3.css
new file mode 100644
index 0000000..5e08f25
--- /dev/null
+++ b/public/css/kalamar-0.41.3.css
@@ -0,0 +1,8854 @@
+@charset "UTF-8";
+/**
+ * Aggregate separated Sass files for Kalamar
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Load web fonts for Kalamar
+ */
+@font-face {
+  font-family: "FontAwesome";
+  src: url("../font/fontawesome-webfont.eot?v=4.3.0");
+  src: url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"), url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"), url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"), url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"), url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");
+  font-weight: normal;
+  font-style: normal;
+}
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * This defines flexible table cells
+ * for views (including media queries).
+ */
+dl.flex {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+  align-items: stretch;
+  width: auto;
+  padding-bottom: 0;
+}
+dl.flex > div {
+  display: flex;
+  flex-direction: row;
+  text-align: center;
+  width: 100%;
+  border-width: 1px;
+  border-style: solid;
+  align-items: stretch;
+}
+dl.flex > div > * {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+}
+dl.flex > div > dt {
+  text-align: left;
+  width: 12.5em;
+  padding: 3pt 6pt;
+  margin: 0;
+}
+dl.flex > div > dd {
+  text-align: left;
+  padding: 3pt 6pt;
+  margin: 0;
+  width: 100%;
+  max-width: none;
+  max-height: 6em;
+  margin-left: 2px;
+  white-space: normal;
+  overflow-y: auto;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+}
+
+@media (min-width: 640px) {
+  dl.flex > div {
+    width: 50%;
+  }
+}
+@media (min-width: 800px) {
+  dl.flex > div {
+    width: 33.3333333333%;
+  }
+}
+@media (min-width: 1200px) {
+  dl.flex > div {
+    width: 25%;
+  }
+}
+@media (min-width: 1680px) {
+  dl.flex > div {
+    width: 20%;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Definitions of fragments for vc and query
+ * builder.
+ */
+.vc.fragment,
+p.query.fragment {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: relative;
+  padding: 4pt 6pt !important;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+  margin-left: 180px;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  margin-right: 20px;
+}
+.vc.fragment:hover,
+p.query.fragment:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+  cursor: pointer;
+}
+.vc.fragment > span:first-of-type,
+p.query.fragment > span:first-of-type {
+  font-weight: bold;
+  padding-right: 4pt;
+}
+.vc.fragment > span:nth-of-type(2),
+p.query.fragment > span:nth-of-type(2) {
+  padding-right: 1.2em;
+}
+.vc.fragment::after,
+p.query.fragment::after {
+  font-family: "FontAwesome";
+  content: "";
+  position: absolute;
+  right: 4pt;
+  top: 2px;
+}
+
+/**
+ * Load indicator.
+ */
+div.loading {
+  background-color: transparent !important;
+  height: 16px !important;
+  width: 16px !important;
+  margin: 0 auto !important;
+}
+
+.loading {
+  background-position: center;
+  background-repeat: no-repeat;
+  background-image: url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==");
+}
+
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Definition of form elements for Kalamar.
+ */
+.form-table {
+  display: block;
+  padding: 0;
+  font-size: 80%;
+}
+.form-table > fieldset {
+  margin-top: 0;
+}
+.form-table fieldset {
+  border-width: 0;
+  padding: 0;
+  margin-top: 1em;
+}
+.form-table fieldset > div {
+  white-space: nowrap;
+}
+.form-table legend {
+  background-color: transparent;
+  margin-left: 0;
+  font-weight: bold;
+  border-radius: 6px;
+}
+.form-table label[for] {
+  display: block;
+  text-align: left;
+}
+.form-table label[for],
+.form-table input[type=submit],
+.form-table a.form-button {
+  margin-top: 2em;
+}
+.form-table fieldset.form-line legend {
+  font-size: 100%;
+  display: inline-block;
+}
+.form-table fieldset.form-line legend::after {
+  content: ":";
+  color: #e3e8a3;
+}
+.form-table fieldset.form-line input, .form-table fieldset.form-line label[for] {
+  display: inline-block;
+  margin: 0;
+}
+.form-table fieldset.form-line input {
+  vertical-align: bottom;
+}
+.form-table fieldset.form-line label[for] {
+  margin-right: 2em;
+}
+.form-table input,
+.form-table textarea,
+.form-table button,
+.form-table a.form-button {
+  border-radius: 6px;
+}
+.form-table input,
+.form-table textarea {
+  border-color: #d9dadb;
+  background-color: #fefefe;
+  border-style: solid;
+}
+.form-table input,
+.form-table textarea,
+.form-table select,
+.form-table a.form-button {
+  border-style: solid;
+  display: inline-block;
+  width: 20%;
+  min-width: 20em;
+  padding: 8px;
+}
+.form-table input[type=radio] {
+  display: inline;
+  text-align: right;
+  background-color: red;
+  width: auto;
+  min-width: auto;
+}
+.form-table input[readonly=readonly],
+.form-table textarea[readonly] {
+  background-color: #f4eebb;
+}
+.form-table .field-with-error {
+  border-color: #c1002b;
+}
+.form-table input[type=submit],
+.form-table button,
+.form-table a.form-button {
+  display: inline-block;
+  cursor: pointer;
+  border-width: thin;
+  text-align: center;
+  background-color: #8a9a0a;
+  border-color: #636f07;
+  color: #636f07;
+}
+.form-table a.form-button:hover {
+  color: inherit !important;
+}
+.form-table label.field-required::after {
+  color: #009ee0;
+  content: "*";
+}
+
+.button-abort {
+  background-color: #ffd080 !important;
+  color: #e55d00 !important;
+  border-color: #e55d00 !important;
+}
+
+button {
+  cursor: pointer;
+}
+button + button {
+  right: 0;
+}
+button[type=submit] {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  font-weight: normal;
+  padding: 0;
+  height: 100%;
+  top: 0;
+  width: 30px;
+  border: 2px solid #fefefe;
+  /*
+   * This is just for styling the last button,
+   * in case there are more than one buttons.
+   */
+}
+button[type=submit] > span:nth-of-type(1) {
+  position: absolute;
+  margin-left: -3000px;
+}
+button[type=submit]::after {
+  font-family: "FontAwesome";
+}
+button[type=submit]:hover, button[type=submit]:focus {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+button[type=submit]::-moz-focus-inner {
+  border: none;
+}
+button[type=submit]:active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+button[type=submit]:last-of-type {
+  border-right-width: 2px;
+  border-right-style: solid;
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+
+/**
+ * Checkbox styling
+ * http://stackoverflow.com/questions/4148499/how-to-style-checkbox-using-css
+ */
+.checkbox {
+  display: none;
+}
+.checkbox + label {
+  cursor: pointer;
+}
+.checkbox + label span {
+  display: inline-block;
+  border-radius: 4px;
+  width: 1em;
+  height: 1em;
+  line-height: 1em;
+  vertical-align: middle;
+  padding: 0;
+  margin-right: 0.2em;
+}
+.checkbox + label span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+}
+.checkbox:checked + label span::after {
+  content: "";
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+.result-view {
+  background-color: #fefefe;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Definitions for menu design.
+ */
+ul.menu {
+  position: absolute;
+  padding: 0;
+  margin: 0;
+  text-indent: 0;
+  opacity: 0;
+  list-style-type: none;
+  list-style-position: outside;
+  /**
+   * Ruler
+   */
+  /**
+   * List items
+   */
+  /**
+   * Default prefix view
+   */
+}
+ul.menu.visible {
+  opacity: 1;
+}
+ul.menu,
+ul.menu > span.pref:not(:empty) {
+  box-sizing: border-box;
+  text-shadow: none;
+  font-weight: normal;
+  z-index: 120;
+}
+ul.menu > li,
+ul.menu > span.pref:not(.active) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+}
+ul.menu > li,
+ul.menu > span.pref:not(:empty) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  cursor: pointer;
+  padding: 3pt 6pt;
+  white-space: normal;
+  border-width: 2px;
+  border-bottom-width: 0px;
+  border-top-width: 0px;
+  border-style: solid;
+}
+ul.menu span.desc {
+  display: block;
+  font-size: 75%;
+}
+ul.menu div.lengthField {
+  border-color: transparent;
+  border-width: 2px;
+  padding: 3pt 6pt;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+ul.menu div.lengthField span {
+  display: block !important;
+  line-height: 0;
+  color: transparent;
+}
+ul.menu > div.ruler {
+  position: absolute;
+  right: 0px;
+  margin-right: -14px;
+  background-color: transparent;
+  width: 14px;
+  height: 100%;
+  opacity: 0;
+  cursor: pointer;
+  transition: opacity 0.5s ease 1s;
+}
+ul.menu > div.ruler > span {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+  position: absolute;
+  display: block;
+  right: 0;
+  width: 10px;
+  z-index: 115;
+  border-radius: 4px;
+  border-width: 2px;
+  border-style: solid;
+}
+ul.menu > div.ruler.active > span {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+ul.menu > div.ruler > div {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  position: absolute;
+  right: 0;
+  width: 10px;
+  height: 100%;
+  border-radius: 4px;
+  border-width: 2px;
+  border-style: solid;
+}
+ul.menu:active > div.ruler, ul.menu:hover > div.ruler,
+ul.menu > div.ruler.active {
+  transition: opacity 0.1s ease;
+  opacity: 1;
+}
+ul.menu > li,
+ul.menu div.lengthField {
+  padding-right: 1.6em;
+}
+ul.menu > li:first-of-type {
+  border-top-width: 2px;
+  border-top-left-radius: 6px;
+  border-top-right-radius: 6px;
+}
+ul.menu > li:last-of-type {
+  border-bottom-width: 2px;
+  border-bottom-left-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+ul.menu > li mark {
+  text-decoration: underline;
+  background-color: transparent;
+  color: inherit;
+  font-weight: bold;
+}
+ul.menu > li.active,
+ul.menu > span.pref.active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+ul.menu > li:hover,
+ul.menu > span.pref:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+ul.menu > span.pref:not(:empty) {
+  position: absolute;
+  min-width: 5px;
+  font-size: 80%;
+  left: 0;
+  bottom: 0;
+  display: block;
+  margin-bottom: -2.1em;
+  padding: 2px 6px;
+  border-radius: 6px;
+  border-width: 2px;
+}
+
+/**
+ * Rolling menu
+ */
+ul.menu.roll > li:first-of-type:not(.no-more):before {
+  position: absolute;
+  font-family: "FontAwesome";
+  content: "";
+  right: 0.5em;
+  top: 0.4em;
+}
+ul.menu.roll > li:last-of-type:not(.no-more):before {
+  position: absolute;
+  font-family: "FontAwesome";
+  content: "";
+  right: 0.5em;
+  bottom: 0.4em;
+}
+ul.menu.roll:not(.visible) {
+  height: 0;
+}
+
+/**
+ * Sorting menu
+ */
+ul.menu.sort {
+  position: relative;
+  display: inline-block;
+}
+ul.menu.sort > li::before {
+  content: "";
+}
+ul.menu.sort > li.active:hover {
+  color: #fefefe;
+  background-color: #c1002b;
+  border-color: black;
+  text-shadow: none;
+}
+
+/**
+ * select menu
+ */
+span.menu.select > span {
+  z-index: 105;
+}
+span.menu.select > ul.menu.roll {
+  display: none;
+  z-index: -100;
+}
+span.menu.select > ul.menu.roll.visible {
+  display: block;
+  z-index: 110;
+}
+
+.banner {
+  position: fixed;
+  width: 10em;
+  height: 10em;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  right: 0px;
+  margin-right: -2.4em;
+  top: 0;
+}
+.banner::after {
+  content: attr(data-note);
+  display: block;
+  overflow: hidden;
+  width: 12em;
+  font-size: 10pt;
+  font-weight: bold;
+  word-spacing: 2px;
+  text-decoration: none;
+  position: relative;
+  left: 2em;
+  top: -1.6em;
+  line-height: 2em;
+  text-align: center;
+  -moz-transform-origin: 0 0;
+  -moz-transform: rotate(45deg);
+  -webkit-transform-origin: 0 0;
+  -webkit-transform: rotate(45deg);
+  -ms-transform-origin: 0 0;
+  -ms-transform: rotate(45deg);
+  transform-origin: 0 0;
+  transform: rotate(45deg);
+  background-color: #f4eebb;
+  color: #f6a800;
+  border: 1px solid #f6a800;
+}
+
+/**
+ * Basic global CSS rules for Kalamar
+ */
+* {
+  -webkit-box-sizing: border-box;
+  /* Safari/Chrome, other WebKit */
+  -moz-box-sizing: border-box;
+  /* Firefox, other Gecko */
+  box-sizing: border-box;
+  /* Opera/IE 8+ */
+}
+
+body,
+html,
+select,
+g > text {
+  font-family: verdana, tahoma, arial, Helvetica, sans-serif;
+  color: #616263;
+  margin: 0;
+}
+
+g > text {
+  fill: #616263;
+}
+
+html {
+  height: 100%;
+}
+
+body {
+  position: relative;
+  min-height: 100%;
+  font-size: 12pt;
+  margin: 0;
+  padding: 0;
+}
+
+a:link {
+  text-decoration: none;
+  color: #f6a800;
+}
+a:link:hover {
+  color: #e55d00;
+  transition: color 0.3s ease 0s;
+}
+a[href^="http://"]::after, a[href^="https://"]::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: " ";
+  font-size: 75%;
+}
+
+a[onclick$="return PArok(this,false)"] {
+  unicode-bidi: bidi-override;
+  direction: rtl;
+  text-align: left;
+}
+a[onclick$="return PArok(this,false)"] > span:nth-child(1n+2) {
+  display: none;
+}
+a[onclick$="return PArok(this,false)"] > span:nth-child(1)::after {
+  content: "@";
+}
+
+.clear {
+  clear: both;
+}
+
+iframe {
+  border-width: 0;
+}
+
+blockquote {
+  border-radius: 6px;
+  padding: 2pt 5pt 2pt 20pt;
+  margin: 0;
+  border-left: 5px solid #009ee0;
+  background-color: #bce4f7;
+  color: #009ee0;
+  mix-blend-mode: soft-light;
+}
+blockquote.bug, blockquote.missing, blockquote.warning {
+  border-left-color: black;
+  background-color: #c1002b;
+  color: #fefefe;
+  mix-blend-mode: multiply;
+}
+
+dl {
+  margin: 0;
+  padding-bottom: 0.5em;
+}
+dl dt {
+  font-weight: bold;
+}
+dl dt abbr {
+  border-width: 0;
+}
+dl dt abbr[data-type=token]::after {
+  color: #009ee0;
+}
+dl dt abbr[data-type=span]::after {
+  color: #c1002b;
+}
+dl dt abbr::after {
+  content: " (" attr(title) ")";
+  vertical-align: bottom;
+  font-style: italic;
+  font-weight: normal;
+  font-size: 80%;
+}
+
+/*
+ * Based on github.com style (c) Vasily Polovnyov <vast@whiteants.net>
+ */
+.hljs {
+  display: block;
+  padding: 0.5em;
+}
+
+.hljs-comment,
+.hljs-template_comment,
+.diff .hljs-header,
+.hljs-javadoc {
+  color: #998;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.css .rule .hljs-keyword,
+.hljs-winutils,
+.javascript .hljs-title,
+.nginx .hljs-title,
+.hljs-subst,
+.hljs-request,
+.hljs-status {
+  color: #333;
+  font-weight: bold;
+}
+
+.hljs-number,
+.hljs-hexcolor,
+.ruby .hljs-constant {
+  color: #099;
+}
+
+.hljs-string,
+.hljs-tag .hljs-value,
+.hljs-phpdoc,
+.tex .hljs-formula {
+  color: #d14;
+}
+
+.hljs-title,
+.hljs-id,
+.coffeescript .hljs-params,
+.scss .hljs-preprocessor {
+  color: #900;
+  font-weight: bold;
+}
+
+.javascript .hljs-title,
+.lisp .hljs-title,
+.clojure .hljs-title,
+.hljs-subst {
+  font-weight: normal;
+}
+
+.hljs-class .hljs-title,
+.haskell .hljs-type,
+.vhdl .hljs-literal,
+.tex .hljs-command {
+  color: #458;
+  font-weight: bold;
+}
+
+.hljs-tag,
+.hljs-tag .hljs-title,
+.hljs-rules .hljs-property,
+.django .hljs-tag .hljs-keyword {
+  color: #000080;
+  font-weight: normal;
+}
+
+.hljs-attribute,
+.hljs-variable,
+.lisp .hljs-body {
+  color: #008080;
+}
+
+.hljs-regexp {
+  color: #009926;
+}
+
+.hljs-symbol,
+.ruby .hljs-symbol .hljs-string,
+.lisp .hljs-keyword,
+.tex .hljs-special,
+.hljs-prompt {
+  color: #990073;
+}
+
+.hljs-built_in,
+.lisp .hljs-title,
+.clojure .hljs-built_in {
+  color: #0086b3;
+}
+
+.hljs-preprocessor,
+.hljs-pragma,
+.hljs-pi,
+.hljs-doctype,
+.hljs-shebang,
+.hljs-cdata {
+  color: #999;
+  font-weight: bold;
+}
+
+.hljs-deletion {
+  background: #fdd;
+}
+
+.hljs-addition {
+  background: #dfd;
+}
+
+.diff .hljs-change {
+  background: #0086b3;
+}
+
+.hljs-chunk {
+  color: #aaa;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the KWIC view.
+ */
+#search {
+  position: relative;
+  margin-bottom: 30px;
+  overflow: visible;
+}
+#search div.matchinfo {
+  display: none;
+}
+#search > ol {
+  overflow-x: hidden;
+  overflow-y: visible;
+  width: auto;
+  text-indent: 0;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  border: 1px solid #87888a;
+  font-size: 10pt;
+}
+#search > ol > li {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: stretch;
+  align-content: stretch;
+  border-style: solid;
+  border-color: #f6a800;
+  border-width: 0;
+}
+#search > ol > li .button-group.button-view {
+  display: none;
+}
+#search > ol > li:nth-of-type(even) div.match-main div.match-wrap {
+  background-color: #fefefe;
+}
+#search > ol > li p.ref {
+  display: none;
+}
+#search > ol > li div.meta,
+#search > ol > li div.match-main {
+  position: relative;
+  cursor: pointer;
+}
+#search > ol > li div.match-main {
+  display: block;
+  flex: 7 0;
+  z-index: 4;
+  overflow: hidden;
+}
+#search > ol > li div.match-main > div.match-wrap {
+  width: 99999%;
+  margin-left: -49999.5%;
+  background-color: #d9dadb;
+  overflow-x: hidden;
+  overflow-y: visible;
+  white-space: normal;
+}
+#search > ol > li div.meta {
+  flex: 1 0;
+  min-width: 12em;
+  max-width: 15em;
+  text-align: left;
+  width: 2px;
+  z-index: 5;
+  overflow-y: hidden;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  background-color: #949597;
+  color: #fefefe;
+  font-size: 75%;
+  padding: 0 5pt;
+  border-color: #616263;
+  border-style: solid;
+  border-width: 2px 1px 0 0;
+}
+#search > ol > li div.meta:before {
+  content: " ";
+  display: inline-block;
+  height: 100%;
+  vertical-align: middle;
+}
+#search > ol > li div.meta:empty {
+  border-width: 0 1px 0 0;
+}
+#search > ol > li div.meta.flip {
+  background-color: #b3b4b5;
+}
+#search > ol > li:first-of-type div.meta {
+  border-top-width: 0;
+}
+#search > ol > li:last-of-type div.meta {
+  border-bottom-width: 0;
+}
+
+/**
+ * Snippet rules
+ */
+div.snippet {
+  text-overflow: ellipsis;
+  text-indent: 0;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  font-size: 0;
+  white-space: nowrap !important;
+}
+div.snippet > span, div.snippet mark {
+  padding: 5pt 0 6pt 0;
+  font-size: 10pt;
+}
+div.snippet > mark,
+div.snippet > span.match {
+  font-weight: bold;
+  color: #333;
+  text-shadow: none;
+  padding-left: 4pt;
+  padding-right: 2pt;
+}
+div.snippet > span.match > span.cutted::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  color: #9bad0b;
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+div.snippet.startMore:before, div.snippet.endMore:after {
+  content: "…";
+  padding-left: 2pt;
+  padding-right: 2pt;
+}
+div.snippet div.flag {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 0;
+  width: 11px;
+  background-color: #f6a800;
+  border-right: 1px solid #e55d00;
+}
+
+/**
+ * Active rules
+ */
+body.no-js #search > ol > li:active,
+#search > ol > li.active,
+#search > ol > li:target {
+  position: relative;
+  display: block;
+  background-color: #f6a800;
+  text-align: left;
+  border-width: 2px;
+  white-space: normal;
+  height: auto;
+  width: auto;
+  overflow: hidden;
+}
+body.no-js #search > ol > li:active div.matchinfo,
+#search > ol > li.active div.matchinfo,
+#search > ol > li:target div.matchinfo {
+  display: block;
+}
+body.no-js #search > ol > li:active + li.active,
+#search > ol > li.active + li.active,
+#search > ol > li:target + li.active {
+  border-top: 2px solid #d9dadb;
+  padding-top: 6px;
+}
+body.no-js #search > ol > li:active + li.active .button-group.button-view,
+#search > ol > li.active + li.active .button-group.button-view,
+#search > ol > li:target + li.active .button-group.button-view {
+  padding-top: 6px;
+}
+body.no-js #search > ol > li:active .snippet,
+#search > ol > li.active .snippet,
+#search > ol > li:target .snippet {
+  white-space: normal !important;
+  padding: 2pt 0 5pt 5pt;
+  background-color: #f4eebb;
+  margin-top: 0;
+  margin-right: 20px;
+  margin-bottom: 0;
+  margin-left: 0;
+}
+body.no-js #search > ol > li:active .snippet span,
+#search > ol > li.active .snippet span,
+#search > ol > li:target .snippet span {
+  display: inline !important;
+}
+body.no-js #search > ol > li:active .snippet > *,
+#search > ol > li.active .snippet > *,
+#search > ol > li:target .snippet > * {
+  background-color: transparent;
+}
+body.no-js #search > ol > li:active .snippet div.flag,
+#search > ol > li.active .snippet div.flag,
+#search > ol > li:target .snippet div.flag {
+  display: none;
+}
+body.no-js #search > ol > li:active .snippet > span,
+#search > ol > li.active .snippet > span,
+#search > ol > li:target .snippet > span {
+  line-height: 1.4em;
+  width: auto;
+}
+body.no-js #search > ol > li:active .snippet > span.context-left,
+#search > ol > li.active .snippet > span.context-left,
+#search > ol > li:target .snippet > span.context-left {
+  margin-left: 0;
+  display: inline;
+  overflow: visible;
+  text-align: left;
+  width: auto;
+}
+body.no-js #search > ol > li:active .button-group.button-view,
+#search > ol > li.active .button-group.button-view,
+#search > ol > li:target .button-group.button-view {
+  display: block;
+}
+body.no-js #search > ol > li:active div.match-main,
+#search > ol > li.active div.match-main,
+#search > ol > li:target div.match-main {
+  display: block;
+  width: 100%;
+}
+body.no-js #search > ol > li:active div.match-main div.match-wrap,
+#search > ol > li.active div.match-main div.match-wrap,
+#search > ol > li:target div.match-main div.match-wrap {
+  cursor: default;
+  min-height: 20pt;
+  background-color: #f6a800;
+  width: 100%;
+  margin-left: 0;
+  overflow-x: visible;
+  white-space: normal;
+}
+body.no-js #search > ol > li:active div.meta,
+#search > ol > li.active div.meta,
+#search > ol > li:target div.meta {
+  display: none;
+}
+body.no-js #search > ol > li:active p.ref,
+#search > ol > li.active p.ref,
+#search > ol > li:target p.ref {
+  display: block;
+  color: #fefefe;
+  padding: 3pt 10pt 3pt 3pt;
+  padding-right: 20px;
+  margin: 0pt;
+  width: 100%;
+  bottom: 0;
+  z-index: 30;
+}
+body.no-js #search > ol > li:active p.ref > span.sigle,
+#search > ol > li.active p.ref > span.sigle,
+#search > ol > li:target p.ref > span.sigle {
+  font-size: 75%;
+  vertical-align: top;
+  color: #f4eebb;
+  float: right;
+}
+
+/**
+ * Alignment rules
+ */
+#search ol span.context-left {
+  display: inline-block;
+  width: 50.01%;
+  text-align: right;
+}
+#search ol.align-right {
+  text-align: right;
+}
+#search ol.align-right div.match-main span.context-right {
+  display: inline-block;
+  width: 49.915%;
+  text-align: left;
+}
+#search ol.align-center div.match-main {
+  width: 100% !important;
+}
+#search ol.align-center div.match-main > .match-wrap {
+  position: relative;
+  margin-left: 0;
+}
+#search ol.align-center li:not(.active) div.snippet {
+  white-space: normal;
+  text-align: center;
+  width: 100000pt;
+  margin-left: -50000pt;
+}
+#search ol.align-center li:not(.active) div.snippet span.context-left {
+  display: inline-block;
+  text-align: right;
+  width: 40000pt;
+  margin-left: 70vw;
+}
+#search ol.align-center li:not(.active) div.snippet span.context-right {
+  display: inline-block;
+  text-align: left;
+  width: 40000pt;
+}
+
+/**
+ * Fix empty contexts
+ */
+#search ol span.context-left:empty::after, #search ol span.context-right:empty::after {
+  content: " ";
+  display: inline-block;
+}
+
+/**
+ * Highlight rules
+ */
+mark {
+  background-color: inherit;
+  color: inherit;
+}
+
+mark > mark,
+em,
+.level-0 {
+  border-bottom-width: 2px;
+  border-bottom-style: solid;
+  padding-bottom: 0px !important;
+  font-style: normal;
+}
+
+mark > mark > mark,
+em > em,
+.level-1 {
+  padding-bottom: 3px !important;
+}
+
+mark > mark > mark > mark,
+em > em > em,
+.level-2 {
+  padding-bottom: 6px !important;
+}
+
+#search > ol > li:not(.active) mark > mark > mark > mark, #search > ol > li:not(.active) em > em > em {
+  line-height: 180%;
+}
+#search > ol > li.active mark > mark > mark > mark, #search > ol > li.active em > em > em {
+  line-height: 250%;
+}
+
+.class-1 {
+  border-color: #c1002b;
+}
+
+.class-2 {
+  border-color: #009ee0;
+}
+
+.class-3 {
+  border-color: #f6a800;
+}
+
+.class-4 {
+  border-color: #9bad0b;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for logos.
+ */
+.logo::after {
+  content: "" !important;
+}
+.logo > * {
+  background-repeat: no-repeat;
+  background-size: 90%;
+  background-position: 50% 50%;
+}
+.logo > * > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+
+/**
+ * Background image for the front page
+ */
+#kalamar-bg {
+  position: fixed;
+  height: 110%;
+  width: 175%;
+  top: 0;
+  z-index: -5000;
+  opacity: 0.1;
+  background-image: url("../img/korap-bg-kalamar.svg");
+  background-size: 50%;
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+
+/**
+ * Logo table of the front page
+ */
+#logos {
+  position: relative;
+  text-align: right;
+  font-size: 85%;
+  right: 0;
+  width: 100%;
+  margin-left: 20px;
+  padding-left: 60%;
+}
+#logos > div {
+  border-top: 26px solid #f6a800;
+  padding-right: 2em;
+}
+#logos p {
+  text-align: left;
+  display: inline-block;
+}
+
+/**
+ * Logo: Institute for German Language
+ */
+#ids-logo {
+  display: block;
+  width: 21.0333333333em;
+  height: 6.6666666667em;
+  background-image: url("../img/ids-leibniz-institute-for-the-german-language.svg");
+}
+
+/**
+ * Logo: KorAP
+ */
+h1 {
+  position: absolute;
+  margin: 0;
+  margin-left: 15px;
+  left: 0;
+  top: 0;
+  width: 7.8em;
+  height: 2.4em;
+  z-index: 105;
+  background-size: 72%;
+  background-image: url("../img/korap-logo-kalamar.svg");
+}
+
+#overview {
+  text-align: center;
+  width: 100%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Table view
+ *
+ * The table view is complicated, as the
+ * first column has to be static.
+ */
+div.matchtable > div {
+  z-index: 20;
+  margin-left: 179px;
+  margin-right: 20px;
+  padding: 0;
+  overflow-x: auto;
+  overflow-y: visible;
+  width: auto;
+}
+div.matchtable table {
+  display: table;
+  border-collapse: separate;
+  border-spacing: 0px;
+}
+div.matchtable th {
+  color: #fefefe;
+}
+div.matchtable td,
+div.matchtable tbody th,
+div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted) {
+  cursor: pointer;
+}
+div.matchtable td:empty {
+  cursor: default;
+}
+div.matchtable td:empty::after {
+  content: " ";
+  white-space: pre;
+}
+div.matchtable td.matchkeyvalues {
+  padding: 0;
+}
+div.matchtable td.matchkeyvalues > div {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+}
+div.matchtable td.matchkeyvalues > div > span {
+  color: #e55d00;
+  text-align: right;
+  padding-right: 0.5em;
+}
+div.matchtable td.matchkeyvalues > div > span::after {
+  content: ":";
+}
+div.matchtable tr {
+  outline: none;
+  /**
+   * The first two columns.
+   */
+}
+div.matchtable tr td.chosen,
+div.matchtable tr th.chosen,
+div.matchtable tr div.chosen {
+  background-color: #9bad0b !important;
+  color: #fefefe;
+}
+div.matchtable tr > th:nth-of-type(1),
+div.matchtable tr > th:nth-of-type(2) {
+  border-top: 2px solid #ff8000;
+  width: 88px;
+  position: absolute;
+  z-index: 80;
+  vertical-align: middle;
+  left: 0px;
+}
+div.matchtable tr > th:nth-of-type(2) {
+  left: 90px;
+}
+div.matchtable tr > * {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+  border: 1px solid #f6a800;
+}
+div.matchtable tr > td {
+  background-color: #ffd080;
+  white-space: nowrap;
+  vertical-align: top;
+  text-align: center;
+}
+div.matchtable tr > td.mark {
+  background-color: #f4eebb;
+}
+div.matchtable tr:nth-child(even) > td {
+  background-color: #f4eebb;
+}
+div.matchtable tr:nth-child(even) > td.mark {
+  background-color: #ffd080;
+}
+div.matchtable thead th {
+  background-color: #ff8000;
+  border-top-width: 0px !important;
+  text-align: center;
+}
+div.matchtable thead th:nth-of-type(1), div.matchtable thead th:nth-of-type(2) {
+  text-align: left;
+}
+div.matchtable thead th.mark {
+  background-color: #e55d00;
+}
+div.matchtable thead th.cutted {
+  background-color: #f4eebb;
+}
+div.matchtable thead th.cutted::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  color: #9bad0b;
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+div.matchtable tbody > tr:nth-of-type(1) > th {
+  border-top-color: transparent;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * SVG tree
+ */
+path.edge {
+  stroke: #ff8000;
+  stroke-width: 2px;
+  fill: none;
+}
+
+g.arc.infocus > path.edge {
+  stroke: #636f07;
+}
+
+marker#arr {
+  overflow: visible;
+}
+marker#arr path {
+  stroke: #e55d00;
+  fill: #e55d00;
+  fill-opacity: 1;
+  stroke-width: 2;
+}
+
+path.anchor {
+  stroke: #e55d00;
+  stroke-width: 3;
+  stroke-linecap: round;
+  z-index: 20;
+}
+
+g.root rect.empty {
+  stroke: #ff8000;
+  fill: #ff8000;
+  stroke-width: 2px;
+}
+
+g.middle rect,
+g.label rect {
+  stroke: #ff8000;
+  stroke-width: 2px;
+  fill: #ffd080;
+}
+
+g.label.infocus rect {
+  stroke: #636f07;
+  fill: #dce883;
+}
+
+g.middle.mark rect {
+  fill: #ff8000;
+}
+g.middle.mark > text {
+  fill: #f4eebb;
+}
+g.middle.mark > text > tspan {
+  stroke: #f4eebb;
+}
+
+g.leaf.mark text > tspan {
+  font-weight: bold;
+}
+
+g.leaf > rect {
+  display: none;
+}
+
+g > text > tspan {
+  text-anchor: middle;
+  font-size: 9pt;
+}
+
+g.leaf > text > tspan,
+text.leaf > tspan {
+  font-size: 10pt;
+  overflow: visible;
+}
+
+/**
+ * Matchtree view
+ */
+div.matchtree {
+  overflow-x: hidden;
+  overflow-y: visible;
+  padding: 0;
+  margin-top: 1pt;
+}
+div.matchtree h6 {
+  display: inline;
+  font-size: inherit;
+  color: #fefefe;
+  margin: 0;
+  padding: 0 !important;
+  float: left;
+}
+div.matchtree h6 > span {
+  border-top: 2px solid #ff8000;
+  width: 88px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+  display: inline-block !important;
+  margin: 0;
+}
+div.matchtree h6 > span:nth-of-type(2) {
+  margin-left: 2px;
+}
+div.matchtree > div {
+  position: unset;
+  z-index: 4;
+  overflow-x: auto;
+  margin: 2px;
+  margin-left: 180px;
+  margin-right: 20px;
+  background-color: #f4eebb;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+div.metatable > dl {
+  margin-right: 20px;
+  margin-top: 2px;
+}
+div.metatable > dl > div {
+  border-color: #f6a800;
+}
+div.metatable > dl > div > * {
+  padding: 0.2em;
+}
+div.metatable > dl > div > dt {
+  background: #ff8000;
+  color: #fefefe;
+  width: 12.5em;
+}
+div.metatable > dl > div > dd {
+  background-color: #f4eebb;
+  cursor: pointer;
+}
+div.metatable > dl > div > dd.metakeyvalues {
+  padding: 0;
+}
+div.metatable > dl > div > dd.metakeyvalues > div {
+  padding: 0.2em;
+}
+div.metatable > dl > div > dd.metakeyvalues > div::before {
+  content: "• ";
+  color: #f6a800;
+}
+div.metatable > dl > div > dd.chosen,
+div.metatable > dl > div > dd > div.chosen {
+  background-color: #9bad0b !important;
+  color: #fefefe;
+}
+div.metatable > dl > div > dd[data-type="type:store"], div.metatable > dl > div > dd[data-type="type:attachement"] {
+  background-color: #ffd080;
+  cursor: default;
+}
+div.metatable > dl > div > dd[data-type="type:store"] a, div.metatable > dl > div > dd[data-type="type:attachement"] a {
+  color: inherit;
+}
+div.metatable > dl.cbm-disabled > div > dd {
+  cursor: default !important;
+}
+
+/**
+ * General matchinfo styles.
+ */
+div.matchinfo {
+  position: relative;
+  width: 100%;
+  padding-top: 2px;
+  height: auto;
+  font-size: 10pt;
+  text-align: left;
+}
+div.matchinfo:empty {
+  display: none !important;
+}
+div.matchinfo .view + .view {
+  margin-top: 8px !important;
+}
+
+div.metatable,
+div.matchtable,
+div.matchtree {
+  position: relative;
+  background-color: #f6a800;
+}
+
+div.button-group.button-panel.button-matchinfo {
+  display: inline-block;
+  margin-right: 0.5em;
+}
+div.button-group.button-panel.button-matchinfo > span {
+  position: relative;
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * The pagination view
+ *
+ * <div id="pagination">
+ *   <a rel="prev"><span><i class="fa fa-caret-left"></i></span></a>
+ *   <a rel="self"><span>1</span></a>
+ *   <a href="#p=2"><span>2</span></a>
+ *   <a href="#3"><span>3</span></a>
+ *   <span><i class="fa fa-ellipsis-h"></i></span>
+ *   <a href="#67"><span>67</span></a>
+ *   <a rel="next" href="#2"><span><i class="fa fa-caret-right"></i></span></a>
+ * </div>
+ */
+#pagination {
+  /*
+   * Always in fixed position.
+   * This may need to be overwritten in case multiple
+   * paginations have to be activated.
+   */
+  position: fixed;
+  font-size: 0;
+  right: 10px;
+  bottom: 20px;
+  z-index: 35;
+  padding: 0;
+  height: auto;
+  line-height: 0;
+}
+#pagination > a {
+  margin: 0;
+  font-size: 10pt;
+  padding: 0;
+}
+#pagination > a > span {
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  display: inline-block;
+  line-height: 2em;
+  text-align: center;
+  border-top-width: 2px;
+  border-bottom-width: 2px;
+  border-top-style: solid;
+  border-bottom-style: solid;
+}
+#pagination > a:not(:link):not([rel=self]) span {
+  color: #87888a;
+}
+#pagination > a.ellipsis > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a.ellipsis > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a[rel=self] > span {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+  border-left-width: 2px;
+  border-right-width: 2px;
+  border-left-style: solid;
+  border-right-style: solid;
+}
+#pagination > a[rel=prev] > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+  border-left-width: 2px;
+  border-left-style: solid;
+}
+#pagination > a[rel=prev] > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a[rel=prev] > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a[rel=next] > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+  border-right-width: 2px;
+  border-right-style: solid;
+}
+#pagination > a[rel=next] > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a[rel=next] > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a:link:hover, #pagination > a:link:focus {
+  outline: none;
+}
+#pagination > a:link:hover span, #pagination > a:link:focus span {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+pre.query {
+  overflow-x: hidden;
+  padding: 0.5em;
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: relative;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+}
+pre.query:not(.unsupported) {
+  cursor: pointer;
+}
+pre.query:not(.unsupported):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+pre.query:not(.unsupported):active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+pre.query.unsupported span {
+  vertical-align: super;
+  color: #009ee0;
+  font-size: 90%;
+  font-weight: bold;
+  cursor: help;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules applicable for the result panel
+ */
+#resultinfo {
+  clear: both;
+  text-align: right;
+  line-height: 1.5em;
+  min-height: 1.5em;
+  margin-top: 0.4em;
+  font-size: 10pt;
+  /*
+   * TODO:
+   *   This rule should not be dependent on
+   *   whether something is found or not,
+   *   but whether #search contains a result,
+   *   e.g. when a result view is open in the
+   *   result panel. This should probably be
+   *   indicated by a class on the button group
+   *   rather than a class on the resultinfo.
+   */
+}
+#resultinfo p.found {
+  display: inline;
+  padding: 0;
+  margin: 0;
+  text-align: right;
+}
+#resultinfo.found {
+  position: relative;
+  margin-bottom: 0px;
+}
+#resultinfo.found .button-group > span {
+  margin-bottom: 0;
+  border-bottom-width: 0;
+  box-shadow: none;
+}
+#resultinfo.found .button-group > span:first-child {
+  border-bottom-left-radius: 0;
+}
+#resultinfo.found .button-group > span:last-child {
+  border-bottom-right-radius: 0;
+}
+
+div.result.panel .view {
+  border: 1px solid #87888a;
+  background-color: #f6a800;
+}
+
+.result.button-group.button-panel {
+  display: inline-block;
+  width: auto;
+  vertical-align: bottom;
+  line-height: 1.5em;
+}
+.result.button-group.button-panel > span {
+  line-height: 1.5em;
+  border-width: 1px 0;
+}
+.result.button-group.button-panel > span:first-child {
+  border-left-width: 1px;
+}
+.result.button-group.button-panel > span:last-child {
+  border-right-width: 1px;
+}
+
+#total-results {
+  color: #9bad0b;
+  font-weight: bold;
+}
+
+.no-results {
+  margin: 0 auto;
+  text-align: center;
+}
+.no-results code {
+  font-weight: bold;
+}
+
+.button-icon.align.left::after {
+  content: "";
+}
+.button-icon.align.right::after {
+  content: "";
+}
+.button-icon.align.center::after {
+  content: "";
+}
+.button-icon.show-kq::after {
+  content: "";
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the embedded documentation.
+ */
+#tutorial {
+  position: fixed;
+  z-index: 9999;
+  top: 5%;
+  bottom: 5%;
+  left: 2%;
+  right: 2%;
+  padding-right: 20px;
+  background-color: #fefefe;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-width: 4px;
+  border-color: #616263;
+  border-style: solid;
+  border-radius: 6px;
+}
+#tutorial .button-group.button-view {
+  background-color: #87888a;
+  display: block;
+  height: 100%;
+}
+#tutorial iframe {
+  border-width: 0;
+  width: 100%;
+  min-height: 100.1%;
+  background-image: url("../img/korap-bg-kalamar.svg");
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: 20%;
+}
+
+p.bibentry {
+  font-size: 80%;
+  margin-left: 3em;
+  margin-bottom: 3em;
+  text-indent: -1.5em;
+}
+p.bibentry cite {
+  font-weight: bold;
+}
+
+body.embedded {
+  background-color: #fefefe;
+}
+body.embedded aside {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding-top: 0;
+  background-color: #87888a;
+}
+body.embedded aside > div {
+  position: relative;
+  top: 50%;
+  -webkit-transform: translateY(-50%);
+  -ms-transform: translateY(-50%);
+  transform: translateY(-50%);
+}
+
+main.tutorial a.embedded-link::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: " ";
+  font-size: 75%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the KoralQuery view.
+ */
+#koralquery {
+  white-space: pre;
+}
+#koralquery > div {
+  background-color: #fefefe;
+  overflow-x: auto;
+  font-size: 85%;
+  margin-top: 2pt;
+  margin-right: 20px;
+  margin-bottom: 2pt;
+  margin-left: 2pt;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+.alertify,
+.alertify-show,
+.alertify-log {
+  -webkit-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -moz-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -ms-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -o-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  /* easeOutBack */
+}
+
+.alertify-hide {
+  -webkit-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -moz-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -ms-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -o-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  /* easeInBack */
+}
+
+.alertify-log-hide {
+  -webkit-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -moz-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -ms-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -o-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  /* easeInBack */
+}
+
+.alertify-cover {
+  position: fixed;
+  z-index: 99999;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  background-color: white;
+  filter: opacity(0);
+  opacity: 0;
+}
+
+.alertify-cover-hidden {
+  display: none;
+}
+
+.alertify {
+  position: fixed;
+  z-index: 99999;
+  top: 50px;
+  left: 50%;
+  width: 550px;
+  margin-left: -275px;
+  opacity: 1;
+}
+
+.alertify-hidden {
+  -webkit-transform: translate(0, -150px);
+  -moz-transform: translate(0, -150px);
+  -ms-transform: translate(0, -150px);
+  -o-transform: translate(0, -150px);
+  transform: translate(0, -150px);
+  opacity: 0;
+  display: none;
+}
+
+/* overwrite display: none; for everything except IE6-8 */
+:root * > .alertify-hidden {
+  display: block;
+  visibility: hidden;
+}
+
+.alertify-logs {
+  position: fixed;
+  z-index: 5000;
+  bottom: 10px;
+  right: 10px;
+  width: 300px;
+}
+
+.alertify-logs-hidden {
+  display: none;
+}
+
+.alertify-log {
+  display: block;
+  margin-top: 10px;
+  position: relative;
+  right: -300px;
+  opacity: 0;
+}
+
+.alertify-log-show {
+  right: 0;
+  opacity: 1;
+}
+
+.alertify-log-hide {
+  -webkit-transform: translate(300px, 0);
+  -moz-transform: translate(300px, 0);
+  -ms-transform: translate(300px, 0);
+  -o-transform: translate(300px, 0);
+  transform: translate(300px, 0);
+  opacity: 0;
+}
+
+.alertify-dialog {
+  padding: 25px;
+}
+
+.alertify-resetFocus {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+.alertify-inner {
+  text-align: center;
+}
+
+.alertify-text {
+  margin-bottom: 15px;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 100%;
+}
+
+.alertify-button,
+.alertify-button:hover,
+.alertify-button:active,
+.alertify-button:visited {
+  background: none;
+  text-decoration: none;
+  border: none;
+  /* line-height and font-size for input button */
+  line-height: 1.5;
+  font-size: 100%;
+  display: inline-block;
+  cursor: pointer;
+  margin-left: 5px;
+}
+
+@media only screen and (max-width: 680px) {
+  .alertify,
+.alertify-logs {
+    width: 90%;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+
+  .alertify {
+    left: 5%;
+    margin: 0;
+  }
+}
+/**
+ * Default Look and Feel
+ */
+.alertify,
+.alertify-log {
+  font-family: sans-serif;
+}
+
+.alertify {
+  background: #FFF;
+  border: 10px solid #333;
+  /* browsers that don't support rgba */
+  border: 10px solid rgba(0, 0, 0, 0.7);
+  border-radius: 8px;
+  box-shadow: 0 3px 3px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding;
+  /* Safari 4? Chrome 6? */
+  -moz-background-clip: padding;
+  /* Firefox 3.6 */
+  background-clip: padding-box;
+  /* Firefox 4, Safari 5, Opera 10, IE 9 */
+}
+
+.alertify-text {
+  border: 1px solid #CCC;
+  padding: 10px;
+  border-radius: 4px;
+}
+
+.alertify-button {
+  border-radius: 4px;
+  color: #FFF;
+  font-weight: bold;
+  padding: 6px 15px;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
+  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.5);
+  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+}
+
+.alertify-button:hover,
+.alertify-button:focus {
+  outline: none;
+  background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+}
+
+.alertify-button:focus {
+  box-shadow: 0 0 15px #2B72D5;
+}
+
+.alertify-button:active {
+  position: relative;
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.alertify-button-cancel,
+.alertify-button-cancel:hover,
+.alertify-button-cancel:focus {
+  background-color: #FE1A00;
+  border: 1px solid #D83526;
+}
+
+.alertify-button-ok,
+.alertify-button-ok:hover,
+.alertify-button-ok:focus {
+  background-color: #5CB811;
+  border: 1px solid #3B7808;
+}
+
+.alertify-log {
+  background: #1F1F1F;
+  background: black;
+  padding: 15px;
+  border-radius: 4px;
+  color: #FFF;
+}
+
+/*
+.alertify-log-error {
+  background: #FE1A00;
+  //  background: rgba(254,26,0,.9);
+    background: rgb(254,26,0);
+}
+*/
+.alertify-log-success {
+  background: #5CB811;
+  background: #5cb811;
+}
+
+/**
+ * Alertify styles.
+ */
+article.alertify-log-warn {
+  background-color: #f6a800;
+}
+article.alertify-log-warn code.src {
+  color: #e55d00;
+}
+
+article.alertify-log code.src {
+  display: block;
+  color: black;
+  font-size: 70%;
+}
+
+.alertify-log-error {
+  background-color: #fe1a00;
+}
+
+#notifications {
+  display: none;
+}
+
+div.notify {
+  position: relative;
+  margin: 0.5em auto;
+  display: block;
+  padding: 0.5em;
+  border-radius: 6px;
+  max-width: 30em;
+  background-color: #fe1a00;
+  color: #fefefe;
+}
+div.notify.notify-success {
+  background-color: #636f07;
+}
+div.notify.notify-warn {
+  background-color: #f29400;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the intro page
+ */
+div.intro a:visited {
+  color: #e55d00;
+}
+div.intro div.announcement {
+  background-color: #f4eebb;
+  padding: 8px;
+  border: 5px dashed #f6a800;
+  border-radius: 1em;
+  width: 90%;
+  margin: auto;
+}
+
+aside.active ~ main div.intro {
+  margin-left: 198px;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/*
+ * Define the base layout of horizontal button groups
+ */
+.button-group > span {
+  cursor: pointer;
+}
+.button-group.button-panel > span,
+.button-group.button-panel a, .button-group.operators > span,
+.button-group.operators a {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  font-size: 9pt;
+  font-weight: normal;
+  line-height: 1.5em;
+  padding: 0 4px;
+  display: inline-block;
+  border-style: solid;
+  border-width: 2px 0;
+}
+.button-group.button-panel > span:hover,
+.button-group.button-panel a:hover, .button-group.operators > span:hover,
+.button-group.operators a:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+.button-group.button-panel > span:first-child,
+.button-group.button-panel a:first-child, .button-group.operators > span:first-child,
+.button-group.operators a:first-child {
+  border-left-width: 2px;
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.button-group.button-panel > span:last-child,
+.button-group.button-panel a:last-child, .button-group.operators > span:last-child,
+.button-group.operators a:last-child {
+  border-right-width: 2px;
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.button-group.button-panel > span > span.check,
+.button-group.button-panel a > span.check {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  width: 1em;
+  display: inline-block;
+  text-align: left;
+}
+.button-group.button-panel > span > span.check:not(.checked)::after,
+.button-group.button-panel a > span.check:not(.checked)::after {
+  content: "";
+}
+.button-group.button-panel > span > span.check.checked::after,
+.button-group.button-panel a > span.check.checked::after {
+  content: "";
+}
+.button-group.button-panel > span > span.check > span,
+.button-group.button-panel a > span.check > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+.button-group.button-view {
+  position: absolute;
+  display: block;
+  right: 0;
+  top: 0;
+  z-index: 20;
+  margin: 0;
+  padding: 0;
+  width: 20px;
+  font-size: 10pt;
+  color: #fefefe;
+}
+.button-group.button-view > span:first-child {
+  margin-top: 2px;
+}
+.button-group.button-view > span {
+  display: block !important;
+  border-width: 0;
+  text-decoration: none;
+  text-align: center;
+  font-style: normal;
+}
+.button-group.button-view > span.download::after {
+  content: "";
+}
+.button-group.button-view > span.close::after {
+  content: "";
+}
+.button-group.button-view > span.minimize::after {
+  content: "";
+}
+.button-group.button-view > span.plugin::after {
+  content: "";
+}
+
+ul.menu.button-group-list {
+  border-top-right-radius: 8px;
+  position: fixed;
+  font-size: 10pt;
+  left: 0;
+  text-align: left;
+  margin: -2px;
+  margin-top: 0;
+}
+ul.menu.button-group-list > li:first-of-type {
+  border-top-right-radius: 5px;
+}
+
+.button-icon {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  line-height: 1.3;
+}
+.button-icon > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+.button-icon[data-icon]::after {
+  content: attr(data-icon);
+}
+
+.button-panel .button-icon {
+  line-height: 0.7;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Base styles for all panels and views
+ */
+div.panel {
+  position: relative;
+  width: 100%;
+  display: block;
+}
+
+div.view {
+  position: relative;
+  padding-top: 2px;
+  display: block;
+  width: 100%;
+}
+
+div.view:not(.show) {
+  display: none;
+}
+
+.introjs-overlay {
+  position: absolute;
+  box-sizing: content-box;
+  z-index: 999999;
+  background-color: #000;
+  opacity: 0;
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0, 0, 0, 0.4)), color-stop(100%, rgba(0, 0, 0, 0.9)));
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+  filter: alpha(opacity=50);
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-fixParent {
+  z-index: auto !important;
+  opacity: 1 !important;
+  -webkit-transform: none !important;
+  -moz-transform: none !important;
+  -ms-transform: none !important;
+  -o-transform: none !important;
+  transform: none !important;
+}
+
+.introjs-showElement,
+tr.introjs-showElement > td,
+tr.introjs-showElement > th {
+  z-index: 9999999 !important;
+}
+
+.introjs-disableInteraction {
+  z-index: 99999999 !important;
+  position: absolute;
+  background-color: white;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+
+.introjs-relativePosition,
+tr.introjs-showElement > td,
+tr.introjs-showElement > th {
+  position: relative;
+}
+
+.introjs-helperLayer {
+  box-sizing: content-box;
+  position: absolute;
+  z-index: 9999998;
+  background-color: #FFF;
+  background-color: rgba(255, 255, 255, 0.9);
+  border: 1px solid #777;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  border-radius: 4px;
+  box-shadow: 0 2px 15px rgba(0, 0, 0, 0.4);
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-tooltipReferenceLayer {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: hidden;
+  z-index: 100000000;
+  background-color: transparent;
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-helperLayer *,
+.introjs-helperLayer *:before,
+.introjs-helperLayer *:after {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  -ms-box-sizing: content-box;
+  -o-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.introjs-helperNumberLayer {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: visible;
+  top: -16px;
+  left: -16px;
+  z-index: 9999999999 !important;
+  padding: 2px;
+  font-family: Arial, verdana, tahoma;
+  font-size: 13px;
+  font-weight: bold;
+  color: white;
+  text-align: center;
+  text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
+  background: #ff3019;
+  /* Old browsers */
+  background: -webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));
+  /* Chrome,Safari4+ */
+  background: -moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);
+  /* W3C */
+  width: 20px;
+  height: 20px;
+  line-height: 20px;
+  border: 3px solid white;
+  border-radius: 50%;
+  filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";
+  /* IE6-9 */
+  filter: "progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";
+  /* IE10 text shadows */
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4);
+}
+
+.introjs-arrow {
+  border: 5px solid transparent;
+  content: "";
+  position: absolute;
+}
+
+.introjs-arrow.top {
+  top: -10px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.top-right {
+  top: -10px;
+  right: 10px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.top-middle {
+  top: -10px;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.right {
+  right: -10px;
+  top: 10px;
+  border-left-color: white;
+}
+
+.introjs-arrow.right-bottom {
+  bottom: 10px;
+  right: -10px;
+  border-left-color: white;
+}
+
+.introjs-arrow.bottom {
+  bottom: -10px;
+  border-top-color: white;
+}
+
+.introjs-arrow.bottom-right {
+  bottom: -10px;
+  right: 10px;
+  border-top-color: white;
+}
+
+.introjs-arrow.bottom-middle {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: white;
+}
+
+.introjs-arrow.left {
+  left: -10px;
+  top: 10px;
+  border-right-color: white;
+}
+
+.introjs-arrow.left-bottom {
+  left: -10px;
+  bottom: 10px;
+  border-right-color: white;
+}
+
+.introjs-tooltip {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: visible;
+  padding: 10px;
+  background-color: white;
+  min-width: 200px;
+  max-width: 300px;
+  border-radius: 3px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.4);
+  -webkit-transition: opacity 0.1s ease-out;
+  -moz-transition: opacity 0.1s ease-out;
+  -ms-transition: opacity 0.1s ease-out;
+  -o-transition: opacity 0.1s ease-out;
+  transition: opacity 0.1s ease-out;
+}
+
+.introjs-tooltipbuttons {
+  text-align: right;
+  white-space: nowrap;
+}
+
+/*
+ Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/
+ Changed by Afshin Mehrabani
+*/
+.introjs-button {
+  box-sizing: content-box;
+  position: relative;
+  overflow: visible;
+  display: inline-block;
+  padding: 0.3em 0.8em;
+  border: 1px solid #d4d4d4;
+  margin: 0;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 #fff;
+  font: 11px/normal sans-serif;
+  color: #333;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  background-color: #ececec;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));
+  background-image: -moz-linear-gradient(#f4f4f4, #ececec);
+  background-image: -o-linear-gradient(#f4f4f4, #ececec);
+  background-image: linear-gradient(#f4f4f4, #ececec);
+  -webkit-background-clip: padding;
+  -moz-background-clip: padding;
+  -o-background-clip: padding-box;
+  /*background-clip: padding-box;*/
+  /* commented out due to Opera 11.10 bug */
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+  /* IE hacks */
+  zoom: 1;
+  *display: inline;
+  margin-top: 10px;
+}
+
+.introjs-button:hover {
+  border-color: #bcbcbc;
+  text-decoration: none;
+  box-shadow: 0px 1px 1px #e3e3e3;
+}
+
+.introjs-button:focus,
+.introjs-button:active {
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));
+  background-image: -moz-linear-gradient(#ececec, #f4f4f4);
+  background-image: -o-linear-gradient(#ececec, #f4f4f4);
+  background-image: linear-gradient(#ececec, #f4f4f4);
+}
+
+/* overrides extra padding on button elements in Firefox */
+.introjs-button::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+.introjs-skipbutton {
+  box-sizing: content-box;
+  margin-right: 5px;
+  color: #7a7a7a;
+}
+
+.introjs-prevbutton {
+  -webkit-border-radius: 0.2em 0 0 0.2em;
+  -moz-border-radius: 0.2em 0 0 0.2em;
+  border-radius: 0.2em 0 0 0.2em;
+  border-right: none;
+}
+
+.introjs-prevbutton.introjs-fullbutton {
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+}
+
+.introjs-nextbutton {
+  -webkit-border-radius: 0 0.2em 0.2em 0;
+  -moz-border-radius: 0 0.2em 0.2em 0;
+  border-radius: 0 0.2em 0.2em 0;
+}
+
+.introjs-nextbutton.introjs-fullbutton {
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+}
+
+.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {
+  color: #9a9a9a;
+  border-color: #d4d4d4;
+  box-shadow: none;
+  cursor: default;
+  background-color: #f4f4f4;
+  background-image: none;
+  text-decoration: none;
+}
+
+.introjs-hidden {
+  display: none;
+}
+
+.introjs-bullets {
+  text-align: center;
+}
+
+.introjs-bullets ul {
+  box-sizing: content-box;
+  clear: both;
+  margin: 15px auto 0;
+  padding: 0;
+  display: inline-block;
+}
+
+.introjs-bullets ul li {
+  box-sizing: content-box;
+  list-style: none;
+  float: left;
+  margin: 0 2px;
+}
+
+.introjs-bullets ul li a {
+  box-sizing: content-box;
+  display: block;
+  width: 6px;
+  height: 6px;
+  background: #ccc;
+  border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.introjs-bullets ul li a:hover {
+  background: #999;
+}
+
+.introjs-bullets ul li a.active {
+  background: #999;
+}
+
+.introjs-progress {
+  box-sizing: content-box;
+  overflow: hidden;
+  height: 10px;
+  margin: 10px 0 5px 0;
+  border-radius: 4px;
+  background-color: #ecf0f1;
+}
+
+.introjs-progressbar {
+  box-sizing: content-box;
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 10px;
+  line-height: 10px;
+  text-align: center;
+  background-color: #08c;
+}
+
+.introjsFloatingElement {
+  position: absolute;
+  height: 0;
+  width: 0;
+  left: 50%;
+  top: 50%;
+}
+
+.introjs-fixedTooltip {
+  position: fixed;
+}
+
+.introjs-hint {
+  box-sizing: content-box;
+  position: absolute;
+  background: transparent;
+  width: 20px;
+  height: 15px;
+  cursor: pointer;
+}
+
+.introjs-hint:focus {
+  border: 0;
+  outline: 0;
+}
+
+.introjs-hidehint {
+  display: none;
+}
+
+.introjs-fixedhint {
+  position: fixed;
+}
+
+.introjs-hint:hover > .introjs-hint-pulse {
+  border: 5px solid rgba(60, 60, 60, 0.57);
+}
+
+.introjs-hint-pulse {
+  box-sizing: content-box;
+  width: 10px;
+  height: 10px;
+  border: 5px solid rgba(60, 60, 60, 0.27);
+  -webkit-border-radius: 30px;
+  -moz-border-radius: 30px;
+  border-radius: 30px;
+  background-color: rgba(136, 136, 136, 0.24);
+  z-index: 10;
+  position: absolute;
+  -webkit-transition: all 0.2s ease-out;
+  -moz-transition: all 0.2s ease-out;
+  -ms-transition: all 0.2s ease-out;
+  -o-transition: all 0.2s ease-out;
+  transition: all 0.2s ease-out;
+}
+
+.introjs-hint-no-anim .introjs-hint-dot {
+  -webkit-animation: none;
+  -moz-animation: none;
+  animation: none;
+}
+
+.introjs-hint-dot {
+  box-sizing: content-box;
+  border: 10px solid rgba(146, 146, 146, 0.36);
+  background: transparent;
+  -webkit-border-radius: 60px;
+  -moz-border-radius: 60px;
+  border-radius: 60px;
+  height: 50px;
+  width: 50px;
+  -webkit-animation: introjspulse 3s ease-out;
+  -moz-animation: introjspulse 3s ease-out;
+  animation: introjspulse 3s ease-out;
+  -webkit-animation-iteration-count: infinite;
+  -moz-animation-iteration-count: infinite;
+  animation-iteration-count: infinite;
+  position: absolute;
+  top: -25px;
+  left: -25px;
+  z-index: 1;
+  opacity: 0;
+}
+
+@-webkit-keyframes introjspulse {
+  0% {
+    -webkit-transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    -webkit-transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    -webkit-transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    -webkit-transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    opacity: 0;
+  }
+}
+@-moz-keyframes introjspulse {
+  0% {
+    -moz-transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    -moz-transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    -moz-transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    -moz-transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    -moz-transform: scale(1);
+    opacity: 0;
+  }
+}
+@keyframes introjspulse {
+  0% {
+    transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 0;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles overriding introJS styles
+ */
+.introjs-helperLayer {
+  background-color: transparent;
+}
+
+.introjs-tooltip.gTstartSearch {
+  max-width: 500px;
+}
+
+.tgreeting {
+  font-weight: bold;
+  color: #e55d00;
+}
+
+.pfirstStep {
+  width: 500px;
+}
+
+.introjs-donebutton {
+  float: right;
+  margin-left: 5px;
+}
+
+.introjs-skipbutton {
+  color: #333;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for OAuth management form.
+ */
+ul.client-list {
+  padding-left: 1.5em;
+}
+ul.client-list li.client {
+  list-style-type: none;
+}
+ul.client-list li.client span.client-name::before {
+  margin-left: -1.5em;
+}
+ul.client-list li.client span.client-desc {
+  font-size: 70%;
+  display: block;
+}
+
+span.client-name {
+  font-weight: bold;
+}
+span.client-name::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  display: inline-block;
+  width: 1.5em;
+  content: "";
+  color: #009ee0;
+  font-size: 100%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+section#news {
+  background-color: #e3e8a3;
+  mix-blend-mode: soft-light;
+  padding: 1em;
+  padding-right: 2em;
+  border-radius: 6px;
+  border-left: 5px solid #636f07;
+}
+section#news dt {
+  float: left;
+  clear: left;
+  width: 15ex;
+  text-align: right;
+  font-weight: bold;
+}
+section#news dd.maintenance > h4::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  color: #c1002b;
+  content: " ";
+}
+section#news dd {
+  margin: 0 1ex 0 16ex;
+  padding: 0 0 0.5em 1em;
+}
+section#news dd > p {
+  max-width: 80ex;
+  margin-block-start: 0ex;
+}
+section#news dd > h4 {
+  margin-block-start: 0ex;
+  margin-block-end: 0.33ex;
+}
+
+@media all and (max-width: 42.5em) {
+  section#news dt {
+    text-align: left;
+    float: none;
+    width: auto;
+    padding-bottom: 0.2em;
+  }
+  section#news dd {
+    margin-left: 1em;
+  }
+}
+/**
+ * Base rules for all plugin related styles,
+ * like widgets.
+ */
+div.view.widget {
+  padding-right: 20px;
+}
+div.view.widget > iframe {
+  margin: 0;
+  box-sizing: border-box;
+  padding: 0;
+  width: 100%;
+  overflow-x: auto;
+}
+
+div.panel.result > div > div.widget > iframe {
+  background-color: #fefefe;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+main {
+  padding-bottom: 20pt;
+  margin-left: 40px;
+  margin-right: 20px;
+}
+main.embedded {
+  margin-left: 14px;
+  margin-right: 14px;
+}
+main p {
+  text-align: justify;
+  hyphens: auto;
+}
+main h2#page-top {
+  margin-top: 0;
+  padding-top: 1em;
+}
+main.page {
+  margin-left: 245px;
+}
+main.page p code,
+main.page li code,
+main.page dd code,
+main.page dt code {
+  background-color: #d9dadb;
+  color: #87888a;
+  padding: 0 0.5em;
+  border-radius: 6px;
+}
+main p.hint {
+  margin: 0 auto;
+  text-align: center;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the Kalamar hint helper.
+ */
+ul.menu.hint {
+  display: inline-block;
+  white-space: normal;
+  text-align: left;
+  max-width: 23em !important;
+  top: 0;
+}
+ul.menu.hint > li:first-of-type {
+  border-top-width: 1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+div.alert.hint {
+  position: absolute;
+  background-color: #fe1a00;
+  color: #fefefe;
+  padding: 3pt 6pt;
+  margin-top: 8px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  width: auto;
+  min-width: 10em;
+  max-width: 23em !important;
+  transition: opacity 0.2s ease 0s;
+  border-radius: 6px;
+  border-top-left-radius: 0;
+}
+div.alert.hint::before {
+  position: absolute;
+  content: "";
+  display: block;
+  top: -12px;
+  left: 0;
+  width: 0;
+  white-space: normal;
+  border-width: 0 8px 12px 0;
+  border-style: solid;
+  border-color: #fe1a00 transparent;
+}
+
+.hint.mirror {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  z-index: 90;
+  white-space: pre-wrap;
+  height: 0;
+}
+.hint.mirror > span {
+  opacity: 0;
+  white-space: pre-wrap;
+  overflow: hidden;
+}
+.hint.mirror > div {
+  position: absolute;
+  display: block;
+  cursor: pointer;
+  transition: left 0.2s ease 0s;
+  top: 0;
+  left: 0;
+  text-align: left;
+  padding: 0;
+  border-top: 5px solid #f6a800;
+  height: 10px;
+  width: 1.2em;
+}
+.hint.mirror > div:hover:not(.active) {
+  border-top: 10px solid #f6a800;
+}
+.hint.mirror > div.active {
+  border-top-width: 0;
+  height: 0;
+  width: 23em;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Search field
+ */
+#q-field {
+  display: block;
+  margin-bottom: 3px;
+  width: 100%;
+  margin: 0;
+}
+#q-field::-webkit-search-cancel-button {
+  display: none;
+}
+#q-field.loading {
+  background-color: #f4eebb;
+  background-image: none;
+}
+
+#searchbar {
+  position: relative;
+  width: 100%;
+  padding: 0;
+  padding-right: 70px;
+}
+#searchbar button[type=submit] {
+  position: absolute;
+  padding: 0;
+  right: 40px;
+}
+#searchbar button[type=submit]:not(.loading)::after {
+  content: "";
+}
+
+.query.panel {
+  padding-right: 70px;
+}
+
+.query.button-group.button-panel {
+  display: block;
+  width: auto;
+  text-align: right;
+  vertical-align: top;
+  line-height: 1.3em;
+}
+.query.button-group.button-panel > span {
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Virtual Collection Builder
+ */
+.vc {
+  margin-top: 4pt;
+  /**
+   * All document rules
+   */
+  /**
+   * All operators
+   */
+}
+.vc .builder {
+  position: initial;
+}
+.vc .docGroup {
+  position: relative;
+  display: inline-block;
+  margin-left: 4em;
+  padding: 4pt 2pt 4pt 0pt;
+  border-radius: 12px;
+  border-style: solid;
+  border-width: 0 0.4em;
+  /**
+   * All operators on groups
+   */
+}
+.vc .docGroup .docGroup {
+  display: block;
+}
+.vc .docGroup[data-operation] > .doc:first-child::before,
+.vc .docGroup[data-operation] > .docGroup:first-child::before {
+  content: none;
+}
+.vc .docGroup[data-operation] > .doc::before,
+.vc .docGroup[data-operation] > .docGroup::before {
+  position: absolute;
+  display: inline-block;
+  text-align: right;
+  width: 4em;
+  margin-left: -4.5em;
+  line-height: 1.5em;
+  border-top: 2px solid transparent;
+}
+.vc .docGroup[data-operation] > .docGroup::before {
+  margin-left: -4.9em;
+}
+.vc .docGroup[data-operation=or] > .doc::before,
+.vc .docGroup[data-operation=or] > .docGroup::before {
+  content: "or";
+}
+.vc .docGroup[data-operation=and] > .doc::before,
+.vc .docGroup[data-operation=and] > .docGroup::before {
+  content: "and";
+}
+.vc .docGroup > .operators {
+  position: absolute;
+  display: block;
+  vertical-align: middle;
+  top: 10px;
+  left: 3px;
+  margin-left: 100%;
+  padding: 0;
+}
+.vc .docGroup > .operators > span:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.vc .doc {
+  line-height: 170%;
+  padding-left: 4em;
+}
+.vc .doc > span + span,
+.vc .doc > span + div + span,
+.vc .doc > span + ul + span {
+  margin-left: 5pt;
+}
+.vc .doc > span.key, .vc .doc > span.value {
+  font-weight: bold;
+}
+.vc .doc > span.value[data-type=regex] {
+  font-style: italic;
+}
+.vc .doc > span.value[data-type=regex]::after, .vc .doc > span.value[data-type=regex]::before {
+  content: "/";
+}
+.vc .doc > span.key {
+  position: relative;
+}
+.vc .doc > span.key > ul {
+  margin: 0;
+  margin-left: 3.3em;
+}
+.vc .doc > span.key.fixed {
+  color: #9bad0b;
+}
+.vc .doc.unspecified > span,
+.vc .doc span.unspecified {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding: 0 4px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-style: solid;
+  border-width: 2px;
+  border-radius: 6px;
+}
+.vc .doc > .operators {
+  display: inline-block;
+  margin-left: 10px;
+}
+.vc .rewritten .rewrite {
+  display: inline-block;
+  margin-left: 4pt;
+  color: #f6a800;
+}
+.vc .rewritten .rewrite::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  font-style: normal;
+  font-weight: normal;
+  content: "";
+  text-decoration: underline;
+}
+.vc .rewritten .rewrite > span {
+  display: none;
+}
+.vc .operators {
+  opacity: 0;
+  white-space: nowrap;
+  padding: 0;
+  font-size: 0;
+  line-height: 0;
+  text-align: center;
+}
+.vc > .docGroup {
+  margin-left: 0;
+}
+.vc .menu {
+  display: inline-block;
+}
+.vc .menu li[data-type=ref]::before,
+.vc span.key.ref::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  padding-right: 4pt;
+  font-style: normal;
+  font-weight: normal;
+}
+.vc div.value {
+  position: absolute;
+  display: inline-block;
+  min-width: max-content;
+  z-index: 8000;
+  padding: 4pt;
+  margin-top: -6pt;
+  border-radius: 6px;
+  border-width: 2px;
+  border-style: solid;
+}
+.vc div.value input {
+  border-width: 0;
+  outline-width: 0;
+}
+.vc div.value > div {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  display: inline-block;
+  padding: 0 4pt;
+  margin-left: 4pt;
+  font-size: 80%;
+  font-style: italic;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+}
+.vc div.value.regex > input {
+  font-style: italic;
+}
+.vc div.value.regex > div {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+
+/* Rules for vcs excluding fragments,
+ * i.e. includingy dynamic changes.
+ */
+.vc:not(.fragment) {
+  /**
+   * Rules for all docGroups
+   */
+}
+.vc:not(.fragment) .docGroup,
+.vc:not(.fragment) .doc {
+  color: #616263;
+}
+.vc:not(.fragment) .docGroup:hover {
+  background-color: rgba(255, 255, 255, 0.3);
+}
+.vc:not(.fragment) .doc > span:not(.fixed) {
+  cursor: pointer;
+}
+.vc:not(.fragment) .doc > span:not(.fixed):hover {
+  color: #f6a800;
+}
+.vc:not(.fragment) .doc.unspecified > span:hover,
+.vc:not(.fragment) span.unspecified:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+.vc:not(.fragment) .doc:hover > .operators, .vc:not(.fragment) .docGroup:hover > .operators {
+  opacity: 1;
+}
+.vc:not(.fragment) .docGroup[data-operation] > .doc::before,
+.vc:not(.fragment) .docGroup[data-operation] > .docGroup::before {
+  color: #f6a800;
+}
+.vc:not(.fragment) .docGroup[data-operation=or] {
+  border-color: #f6a800;
+}
+.vc:not(.fragment) div.value {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+}
+.vc:not(.fragment) div.value > div {
+  cursor: pointer;
+}
+.vc:not(.fragment) div.value > div:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+
+/**
+ * The z-index cascade for groups.
+ */
+.docGroup > .operators {
+  z-index: 30;
+}
+.docGroup .docGroup > .operators {
+  z-index: 31;
+}
+.docGroup .docGroup .docGroup > .operators {
+  z-index: 32;
+}
+.docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 33;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 34;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 35;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 36;
+}
+
+.vc.fragment > div > div.docGroup {
+  margin-left: 0;
+}
+.vc.fragment .doc {
+  margin-right: 2em;
+}
+
+#collection {
+  line-height: 1em;
+  border-radius: 6px;
+}
+
+#vc-choose > span.rewritten::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  color: #f6a800;
+  padding: 0;
+  padding-left: 4px;
+  content: "";
+  text-decoration: underline;
+  font-style: normal;
+  font-weight: normal;
+}
+
+div#vc-view {
+  position: relative;
+}
+div#vc-view > div.vc {
+  display: none;
+  margin: 1.3em 0 0.5em 0;
+  border: 2px solid #636f07;
+  background-color: #fefefe;
+}
+div#vc-view > div.vc.active {
+  display: block;
+}
+div#vc-view > div.vc > div:first-child {
+  padding: 1.3em;
+}
+
+div.panel.vcinfo {
+  padding: 3pt 0pt 3pt 3pt;
+  background-color: #636f07;
+}
+div.panel.vcinfo div.button-group > span {
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Corpus statistic  
+ * Graying corpus statistic 
+ */
+div.stattable {
+  display: flex;
+  flex-direction: row;
+  margin-right: 20px;
+}
+
+div.stattable > dl {
+  margin-bottom: 4px;
+}
+div.stattable > dl > div {
+  border-color: #636f07;
+}
+div.stattable > dl > div > dt {
+  background-color: #8a9a0a;
+  width: 15em;
+  margin: 0;
+}
+div.stattable > dl > div > dt::after {
+  content: ":";
+}
+div.stattable > dl > div > dd {
+  background-color: #dce883;
+  color: #616263;
+}
+div.stattable.stdisabled dt,
+div.stattable.stdisabled dd {
+  background-color: #b9c46a;
+  color: #636f07;
+  text-shadow: none;
+}
+
+/* Corpus statistic reload button */
+div.reloadStatB > span.refresh {
+  margin-left: 2pt;
+}
+
+span.refresh::after {
+  vertical-align: sub;
+  content: "";
+}
+
+@media (min-width: 1680px) {
+  div.stattable dl.flex > div {
+    width: inherit;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the datepicker widget
+ * (used in the Virtual Collection creator)
+ * in Kalamar.
+ */
+div.datepicker {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: absolute;
+  display: inline-block;
+  z-index: 90;
+  font-size: 80%;
+  padding: 4pt;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+}
+div.datepicker > div {
+  font-size: 120%;
+  width: 45%;
+}
+div.datepicker > div.month {
+  float: right;
+}
+div.datepicker > div > span {
+  display: inline-block;
+  overflow: hidden;
+  white-space: nowrap;
+}
+div.datepicker > div > span:first-child, div.datepicker > div > span:last-child {
+  width: 15%;
+}
+div.datepicker > div > span:first-child::before, div.datepicker > div > span:last-child::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  min-width: 14px;
+}
+div.datepicker > div > span:first-child::before {
+  content: "";
+}
+div.datepicker > div > span:last-child::before {
+  content: "";
+}
+div.datepicker > div > span:nth-child(2) {
+  display: inline-block;
+  cursor: pointer;
+  width: 70%;
+  text-align: center;
+  text-overflow: ellipsis;
+  border-radius: 6px;
+  border-style: solid;
+  border-width: 2px;
+  border-color: transparent;
+}
+div.datepicker > div > span:nth-child(2):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+div.datepicker > div > span:nth-child(2).selected {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+div.datepicker table {
+  border-collapse: separate;
+  border-spacing: 1px;
+}
+div.datepicker input {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  background-color: #fefefe;
+  width: 100%;
+  border-style: solid;
+  border-width: 1px;
+}
+div.datepicker td {
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  text-align: center;
+  border-style: solid;
+  border-width: 1px;
+}
+div.datepicker td:not(.out) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  cursor: pointer;
+  background-color: #fefefe;
+}
+div.datepicker td:not(.out).today {
+  background-color: #bce4f7;
+  color: #009ee0;
+  text-shadow: none;
+}
+div.datepicker td:not(.out).selected {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+div.datepicker td:not(.out):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+div.datepicker td.out {
+  border-color: transparent;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Temporary hack for language chooser
+ * http://cssdeck.com/labs/styling-select-box-with-css3
+ * This is only active in no-js environment and before the
+ * javascript is loaded.
+ */
+#ql-field {
+  position: relative;
+  background-color: #9bad0b;
+  cursor: pointer;
+  margin: 0;
+  outline: none;
+  border: none;
+  display: inline-block;
+  color: white;
+  border-width: 0;
+  border-radius: 0;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+#ql-field:checked {
+  outline: none;
+}
+#ql-field > option {
+  padding: 0pt 2pt;
+  outline: none;
+}
+#ql-field:-moz-focusring {
+  color: transparent;
+  text-shadow: 0 0 0 white;
+}
+
+/**
+ * The pipe input field
+ */
+input.pipe {
+  display: none;
+}
+
+header {
+  -webkit-box-sizing: border-box;
+  /* Safari/Chrome, other WebKit */
+  -moz-box-sizing: border-box;
+  /* Firefox, other Gecko */
+  box-sizing: border-box;
+  /* Opera/IE 8+ */
+  position: relative;
+  background-color: #9bad0b;
+  padding: 8px 0 0 8px;
+  font-size: 10pt;
+  color: #fefefe;
+}
+header span.select {
+  display: inline-block;
+  cursor: pointer;
+  line-height: 1.8em;
+  border-width: 0;
+  border-bottom-width: 3px;
+  border-style: solid;
+  border-color: transparent;
+}
+header span.select > span {
+  font-weight: bold;
+}
+header span.select:hover {
+  color: #636f07;
+  border-color: #636f07;
+}
+header span.select::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  pointer-events: none;
+  text-align: center;
+  content: "";
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+header span.select.active {
+  border-color: #f6a800;
+}
+header span.select.active::after {
+  content: "";
+}
+header form {
+  position: relative;
+  display: block;
+  padding-left: 230px;
+  min-height: 2.7em;
+  margin: 0px;
+}
+header input {
+  outline: none;
+  font-size: 11pt;
+  border: 2px solid #fefefe;
+  padding: 2px;
+  margin: 0;
+}
+header .button {
+  color: #fefefe;
+  line-height: 2em;
+  margin-right: 40px;
+}
+header .button.right {
+  float: right;
+  display: inline-block;
+}
+header .button.top {
+  position: absolute;
+  display: block;
+  top: 0;
+  right: 0;
+  margin-right: 0;
+  width: 20px;
+  background-color: #636f07;
+  text-align: center;
+  height: 100%;
+  z-index: 20;
+}
+header .button.top > a:hover {
+  color: #fefefe;
+}
+header .button > a {
+  color: #fefefe;
+  cursor: pointer;
+  position: relative;
+  font-size: 120%;
+}
+header .button > a > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+header .button > a::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+}
+header .button > a.tutorial::after {
+  content: "";
+}
+header .button > a.question::after {
+  content: "";
+}
+header .button > a.login::after {
+  content: "";
+}
+header .button > a.logout::after {
+  content: "";
+}
+
+.query.button-group > span {
+  border-top-width: 0;
+  border-color: white;
+}
+.query.button-group > span:first-child {
+  border-top-left-radius: 0;
+}
+.query.button-group > span:last-child {
+  border-top-right-radius: 0;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the footer section of Kalamar
+ */
+footer {
+  background-color: #616263;
+  position: absolute;
+  bottom: 0;
+  padding-bottom: 2px;
+  font-size: 70%;
+  width: 100%;
+  text-align: right;
+}
+footer a:link {
+  margin: 0 0.5em;
+  color: #d9dadb;
+}
+footer a:visited {
+  color: #d9dadb;
+}
+footer a:hover {
+  color: #fefefe;
+}
+footer a[href^="http://"]::after, footer a[href^="https://"]::after {
+  content: none;
+}
+footer span.separator:after {
+  content: "-";
+  color: #d9dadb;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+aside {
+  background-color: #636f07;
+  color: #fefefe;
+  width: 230px;
+  position: fixed;
+  display: block;
+  transition: all 0.3s ease-in-out;
+  outline: none;
+  font-size: 10pt;
+  z-index: 100;
+  top: 0;
+  left: 0;
+  height: 100%;
+  padding-top: 65px;
+  /**
+   * Navigation menu
+   */
+}
+aside > div {
+  overflow-y: auto;
+  overflow-x: visible;
+  max-height: 100%;
+}
+aside > * {
+  opacity: 1;
+}
+aside::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  position: absolute;
+  display: block;
+  opacity: 0;
+  cursor: pointer;
+  right: 0;
+  bottom: 0;
+  content: "";
+  font-size: 16pt;
+  width: 16pt;
+  height: 17pt;
+  padding: 6pt;
+  background-color: #636f07;
+  border-top-right-radius: 6px;
+  margin-right: -20px;
+}
+aside h2,
+aside legend {
+  line-height: 2em;
+  text-align: center;
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  font-weight: bold;
+}
+aside ul.nav {
+  list-style-type: none;
+  margin: 0;
+  font-size: 10pt;
+  text-indent: 0;
+  padding: 0;
+}
+aside ul.nav li {
+  padding: 0;
+}
+aside ul.nav li > a {
+  padding: 3pt 6pt;
+}
+aside ul.nav li > a:visited {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+}
+aside ul.nav li.folded.active ul {
+  display: block;
+}
+aside ul.nav li.folded ul {
+  display: none;
+}
+aside ul.nav li.active > a:link {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+aside ul.nav li > a:link {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  display: block;
+  border-right-width: 2px;
+  border-right-style: solid;
+}
+aside ul.nav li > a:link:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+  transition: none;
+}
+aside ul.nav li h3 {
+  padding: 0;
+  margin: 0;
+  font-weight: bold;
+  font-size: 100%;
+}
+aside ul.nav li > a {
+  padding-left: 6pt;
+}
+aside ul.nav li li > a {
+  padding-left: 18pt;
+}
+aside ul.nav li li li > a {
+  padding-left: 36pt;
+}
+aside nav > ul > li > a {
+  font-weight: bold;
+}
+aside fieldset {
+  position: relative;
+  border-width: 0;
+}
+aside fieldset legend {
+  display: none;
+}
+aside fieldset input[type=text],
+aside fieldset input[type=password] {
+  outline: none;
+  font-size: 11pt;
+  border: 2px solid #fefefe;
+  padding: 2px;
+  margin: 0;
+  width: 100%;
+}
+aside fieldset > form > div {
+  position: relative;
+  width: 100%;
+  margin-top: 4px;
+  padding-right: 30px;
+}
+aside fieldset > p {
+  color: #9bad0b;
+}
+aside fieldset > p.announcement {
+  color: #fefefe;
+}
+aside fieldset > p.announcement > time {
+  display: block;
+  font-size: 70%;
+}
+aside fieldset hr {
+  border: none;
+  border-top: 2px solid #d9dadb;
+}
+aside fieldset ul {
+  display: block;
+  font-size: 80%;
+  text-align: right;
+  padding: 0;
+  margin-top: 0;
+}
+aside fieldset ul > li {
+  display: inline;
+}
+aside fieldset ul > li:first-child::after {
+  content: " | ";
+}
+aside fieldset button {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+aside fieldset button::after {
+  content: "";
+}
+aside.off, aside:not(:focus):not(.active) {
+  margin-left: -210px;
+}
+aside.off::after, aside:not(:focus):not(.active)::after {
+  opacity: 1;
+}
+aside.off > *, aside:not(:focus):not(.active) > * {
+  opacity: 0;
+  transition-property: opacity;
+  transition-duration: 0.3s;
+}
+aside.off::after {
+  display: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Optimization for no-js behaviour
+ */
+body.no-js #notifications {
+  display: block !important;
+}
+body.no-js aside {
+  position: relative;
+  display: block;
+  transition: none;
+  margin-left: 0 !important;
+  padding-top: 0;
+  width: 100%;
+  top: 0;
+}
+body.no-js aside > * {
+  opacity: 1 !important;
+  transition: none;
+}
+body.no-js aside form.login > input,
+body.no-js aside form.login > div {
+  width: auto;
+  margin-top: 0;
+}
+body.no-js aside form.login > input:first-of-type,
+body.no-js aside form.login > div:first-of-type {
+  float: left;
+  margin-right: 1em;
+}
+body.no-js aside form.login button {
+  height: 100%;
+}
+body.no-js aside p, body.no-js aside::after {
+  display: none;
+}
+body.no-js main div.intro {
+  margin-left: 8px !important;
+}
+
+#activate {
+  text-align: right;
+  background-color: #f6a800;
+  margin-top: 0;
+  padding: 8px;
+  padding-right: 40px;
+  color: #fefefe;
+  font-size: 80%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Media rules for different screen sizes.
+ * This will override some basic rules.
+ */
+@media all and (max-width: 42.5em) {
+  body,
+#search > ol,
+#search div.snippet > span,
+header,
+header input,
+div#resultinfo,
+#pagination > a {
+    font-size: 9pt;
+  }
+
+  header {
+    padding-right: 8px;
+  }
+
+  header form {
+    padding-left: 0;
+    padding-top: 33px;
+  }
+
+  .vc {
+    font-size: 9pt;
+  }
+  .vc .builder .doc {
+    padding-left: 3em;
+  }
+  .vc .builder * .docGroup {
+    margin-left: 3em;
+  }
+  .vc .builder > .doc {
+    padding-left: 0.5em;
+  }
+  .vc .builder > .docGroup {
+    margin-left: 0.5em;
+  }
+
+  h1 {
+    margin-left: 10px;
+    width: 130px;
+    height: 40px;
+    background-size: 100%;
+    background-position: 50% 0;
+    z-index: 110;
+  }
+
+  #searchbar {
+    padding-right: 30px;
+  }
+  #searchbar input {
+    font-size: 9pt;
+  }
+  #searchbar button[type=submit] {
+    right: 0;
+  }
+
+  .level-1 {
+    padding-bottom: 2px;
+  }
+
+  .level-2 {
+    padding-bottom: 4px;
+  }
+
+  main {
+    margin-left: 4px;
+    margin-right: 4px;
+  }
+
+  header .button {
+    margin-right: 4px;
+  }
+  header .button.top {
+    height: auto;
+  }
+
+  #search ol > li:target > div > div.snippet, #search ol > li.active > div > div.snippet {
+    margin: 2px 2em 2px 4px;
+  }
+  #search ol > li div.meta {
+    display: none;
+  }
+
+  div.matchinfo {
+    font-size: 9pt;
+  }
+
+  div.matchtable tr > * {
+    padding: 1pt 3pt;
+  }
+
+  div.matchtree h6 {
+    display: block;
+    float: none;
+  }
+  div.matchtree > div {
+    margin-left: 2px;
+  }
+
+  #kalamar-bg {
+    overflow: hidden;
+  }
+
+  #logos {
+    margin-left: 0;
+    margin-right: 0;
+  }
+  #logos > div {
+    border-top-width: 14px;
+    padding-right: 0;
+  }
+  #logos > div .logo > * {
+    background-size: 60%;
+    background-position: 0 0;
+  }
+
+  div.intro {
+    width: 100%;
+  }
+
+  body.embedded aside > div {
+    top: 0;
+    transform: translateY(0);
+  }
+
+  aside:not(:focus):not(.active) {
+    margin-left: -230px;
+  }
+  aside:not(:focus):not(.active)::after {
+    font-size: 12pt;
+    height: 11pt;
+    text-align: right;
+    padding-right: 3pt;
+    padding-top: 2pt;
+  }
+  aside ul {
+    font-size: 9pt;
+    line-height: 1em;
+  }
+  aside.active ~ main div.intro, aside.active ~ main.page {
+    margin-left: 4px !important;
+  }
+  aside.active {
+    position: relative;
+    display: block;
+    padding-top: 0;
+    width: 100%;
+    top: 0;
+    border-width: 0;
+  }
+  aside.active fieldset input {
+    font-size: 9pt;
+  }
+  aside.active::after {
+    display: none;
+  }
+  aside.active p, aside.active hr {
+    display: none;
+  }
+
+  #tutorial {
+    border-radius: 0;
+    border-width: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    top: 0;
+    padding: 0;
+  }
+  #tutorial iframe {
+    border-radius: 0;
+  }
+  #tutorial > ul.action.right {
+    height: 1.5em;
+    right: 20px;
+    border-bottom-left-radius: 5px;
+    border-bottom-right-radius: 5px;
+  }
+
+  main.page {
+    margin-right: 20px;
+  }
+}
+@media print {
+  body, html, select, g > text {
+    color: black;
+  }
+
+  header, aside {
+    display: none;
+  }
+
+  main.page {
+    margin: 1em;
+  }
+
+  #kalamar-bg {
+    display: none;
+  }
+
+  a.embedded-link {
+    color: black;
+    text-decoration: underline;
+  }
+
+  pre.query.tutorial {
+    background-color: white;
+    color: black;
+    margin-left: 1em;
+    margin-right: 1em;
+  }
+
+  blockquote.warning {
+    background-color: grey;
+    color: white;
+    border-left-color: black;
+    border-left-width: 1em;
+  }
+}
+
+/*# sourceMappingURL=kalamar-0.41.3.css.map */
\ No newline at end of file
diff --git a/public/css/kalamar-0.41.3.css.map b/public/css/kalamar-0.41.3.css.map
new file mode 100644
index 0000000..84b76f0
--- /dev/null
+++ b/public/css/kalamar-0.41.3.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/kalamar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/colors.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/icons.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/mixins.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/choose.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/lengths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/paths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fonts.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/flextable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fragment.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/load.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/form.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/view.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/menu.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/banner.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/base.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/highlight.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/kwic.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/logos.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/tree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/metatable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/matchinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/pagination.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/query.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/resultinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/tutorial.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/koralquery.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-core.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-default.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/intro.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/buttongroup.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/panel.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs-ids.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/oauth.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/news.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/plugin.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/main.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/hint.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/searchbar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/vc.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/statistics.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/datepicker.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/querylanguage.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/pipe.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/header.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/footer/footer.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/sidebar/sidebar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/no-js.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/media.scss"],"names":[],"mappings":"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AAAA;AAKA;AAAA;AAAA;AAiBA;AAAA;AAAA;AAUA;AAAA;AAAA;AAUA;AAAA;AAAA;AAQA;AAAA;AAAA;AASA;AAAA;AAAA;AAQA;AAAA;AAAA;AAOA;AAAA;AAAA;AGxEA;AAAA;AAAA;AAAA;AAYA;AAAA;AAAA;AAWA;AAAA;AAAA;AAWA;AAAA;AAAA;AAUA;AAAA;AAAA;AAWA;AAAA;AAAA;ACzDA;AAAA;AAAA;AAAA;AAcA;AAAA;AAAA;ACdA;AAAA;AAAA;AuBAA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;AAAgE;;;AAElE;EACE;EACA;EACA;EACA;EACA;AAAiE;;;AAEnE;EACE;EACA;EACA;EACA;EACA;AAAiE;;;AAEnE;EACE;EAAiB;EACjB;EAAQ;EAAU;EAAW;EAC7B;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EAAiB;EACjB;EAAW;EACX;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AACA;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;AAAA;IAEE;IACA;IACA;IACA;;;EAEF;IACE;IACA;;;ACtIJ;AAAA;AAAA;AAGA;AAAA;EAEE;;;AAEF;EACE;EACA;AAAyB;EACzB;EACA;EACA;EACA;AAAsC;EACtC;AAAmC;EACnC;AAA8B;;;AAEhC;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA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EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACG;EACC;EACC;EACG;;;AAGV;EACE;EACA;EACA;EACA;EACA;EACA;EACG;EACC;EACC;EACG;;;AAGV;AAAA;AAAA;EAGE;EACG;EACC;EACC;EACG;;;AAGV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAqB;EACrB;AAAoE;EACpE;AAAiH;EACjH;AAAoE;EACpE;AAAoE;EACpE;AAAoE;EACpE;AAA2E;EAC3E;EACA;EACA;EACA;EACA;EACA;AAAsH;EACtH;AAA6F;EAC7F;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACG;EACC;EACC;EACG;;;AAGV;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;AAAkC;EAClC;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACK;;;AAGL;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;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","file":"kalamar-0.41.3.css"}
\ No newline at end of file
diff --git a/public/css/kalamar-0.41.5.css b/public/css/kalamar-0.41.5.css
new file mode 100644
index 0000000..84bd95b
--- /dev/null
+++ b/public/css/kalamar-0.41.5.css
@@ -0,0 +1,8877 @@
+@charset "UTF-8";
+/**
+ * Aggregate separated Sass files for Kalamar
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Load web fonts for Kalamar
+ */
+@font-face {
+  font-family: "FontAwesome";
+  src: url("../font/fontawesome-webfont.eot?v=4.3.0");
+  src: url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"), url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"), url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"), url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"), url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");
+  font-weight: normal;
+  font-style: normal;
+}
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * This defines flexible table cells
+ * for views (including media queries).
+ */
+dl.flex {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+  align-items: stretch;
+  width: auto;
+  padding-bottom: 0;
+}
+dl.flex > div {
+  display: flex;
+  flex-direction: row;
+  text-align: center;
+  width: 100%;
+  border-width: 1px;
+  border-style: solid;
+  align-items: stretch;
+}
+dl.flex > div > * {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+}
+dl.flex > div > dt {
+  text-align: left;
+  width: 12.5em;
+  padding: 3pt 6pt;
+  margin: 0;
+}
+dl.flex > div > dd {
+  text-align: left;
+  padding: 3pt 6pt;
+  margin: 0;
+  width: 100%;
+  max-width: none;
+  max-height: 6em;
+  margin-left: 2px;
+  white-space: normal;
+  overflow-y: auto;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+}
+
+@media (min-width: 640px) {
+  dl.flex > div {
+    width: 50%;
+  }
+}
+@media (min-width: 800px) {
+  dl.flex > div {
+    width: 33.3333333333%;
+  }
+}
+@media (min-width: 1200px) {
+  dl.flex > div {
+    width: 25%;
+  }
+}
+@media (min-width: 1680px) {
+  dl.flex > div {
+    width: 20%;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Definitions of fragments for vc and query
+ * builder.
+ */
+.vc.fragment,
+p.query.fragment {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: relative;
+  padding: 4pt 6pt !important;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+  margin-left: 180px;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  margin-right: 20px;
+}
+.vc.fragment:hover,
+p.query.fragment:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+  cursor: pointer;
+}
+.vc.fragment > span:first-of-type,
+p.query.fragment > span:first-of-type {
+  font-weight: bold;
+  padding-right: 4pt;
+}
+.vc.fragment > span:nth-of-type(2),
+p.query.fragment > span:nth-of-type(2) {
+  padding-right: 1.2em;
+}
+.vc.fragment::after,
+p.query.fragment::after {
+  font-family: "FontAwesome";
+  content: "";
+  position: absolute;
+  right: 4pt;
+  top: 2px;
+}
+
+/**
+ * Load indicator.
+ */
+div.loading {
+  background-color: transparent !important;
+  height: 16px !important;
+  width: 16px !important;
+  margin: 0 auto !important;
+}
+
+.loading {
+  background-position: center;
+  background-repeat: no-repeat;
+  background-image: url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==");
+}
+
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Definition of form elements for Kalamar.
+ */
+.form-table {
+  display: block;
+  padding: 0;
+  font-size: 80%;
+}
+.form-table > fieldset {
+  margin-top: 0;
+}
+.form-table fieldset {
+  border-width: 0;
+  padding: 0;
+  margin-top: 1em;
+}
+.form-table fieldset > div {
+  white-space: nowrap;
+}
+.form-table legend {
+  background-color: transparent;
+  margin-left: 0;
+  font-weight: bold;
+  border-radius: 6px;
+}
+.form-table label[for] {
+  display: block;
+  text-align: left;
+}
+.form-table label[for],
+.form-table input[type=submit],
+.form-table a.form-button {
+  margin-top: 2em;
+}
+.form-table fieldset.form-line legend {
+  font-size: 100%;
+  display: inline-block;
+}
+.form-table fieldset.form-line legend::after {
+  content: ":";
+  color: #e3e8a3;
+}
+.form-table fieldset.form-line input, .form-table fieldset.form-line label[for] {
+  display: inline-block;
+  margin: 0;
+}
+.form-table fieldset.form-line input {
+  vertical-align: bottom;
+}
+.form-table fieldset.form-line label[for] {
+  margin-right: 2em;
+}
+.form-table input,
+.form-table textarea,
+.form-table button,
+.form-table a.form-button {
+  border-radius: 6px;
+}
+.form-table input,
+.form-table textarea {
+  border-color: #d9dadb;
+  background-color: #fefefe;
+  border-style: solid;
+}
+.form-table input,
+.form-table textarea,
+.form-table select,
+.form-table a.form-button {
+  border-style: solid;
+  display: inline-block;
+  width: 20%;
+  min-width: 20em;
+  padding: 8px;
+}
+.form-table input[type=radio] {
+  display: inline;
+  text-align: right;
+  background-color: red;
+  width: auto;
+  min-width: auto;
+}
+.form-table input[readonly=readonly],
+.form-table textarea[readonly] {
+  background-color: #f4eebb;
+}
+.form-table .field-with-error {
+  border-color: #c1002b;
+}
+.form-table input[type=submit],
+.form-table button,
+.form-table a.form-button {
+  display: inline-block;
+  cursor: pointer;
+  border-width: thin;
+  text-align: center;
+  background-color: #8a9a0a;
+  border-color: #636f07;
+  color: #636f07;
+}
+.form-table a.form-button:hover {
+  color: inherit !important;
+}
+.form-table label.field-required::after {
+  color: #009ee0;
+  content: "*";
+}
+
+.button-abort {
+  background-color: #ffd080 !important;
+  color: #e55d00 !important;
+  border-color: #e55d00 !important;
+}
+
+button {
+  cursor: pointer;
+}
+button + button {
+  right: 0;
+}
+button[type=submit] {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  font-weight: normal;
+  padding: 0;
+  height: 100%;
+  top: 0;
+  width: 30px;
+  border: 2px solid #fefefe;
+  /*
+   * This is just for styling the last button,
+   * in case there are more than one buttons.
+   */
+}
+button[type=submit] > span:nth-of-type(1) {
+  position: absolute;
+  margin-left: -3000px;
+}
+button[type=submit]::after {
+  font-family: "FontAwesome";
+}
+button[type=submit]:hover, button[type=submit]:focus {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+button[type=submit]::-moz-focus-inner {
+  border: none;
+}
+button[type=submit]:active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+button[type=submit]:last-of-type {
+  border-right-width: 2px;
+  border-right-style: solid;
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+
+/**
+ * Checkbox styling
+ * http://stackoverflow.com/questions/4148499/how-to-style-checkbox-using-css
+ */
+.checkbox {
+  display: none;
+}
+.checkbox + label {
+  cursor: pointer;
+}
+.checkbox + label span {
+  display: inline-block;
+  border-radius: 4px;
+  width: 1em;
+  height: 1em;
+  line-height: 1em;
+  vertical-align: middle;
+  padding: 0;
+  margin-right: 0.2em;
+}
+.checkbox + label span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+}
+.checkbox:checked + label span::after {
+  content: "";
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+.result-view {
+  background-color: #fefefe;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Definitions for menu design.
+ */
+ul.menu {
+  position: absolute;
+  padding: 0;
+  margin: 0;
+  text-indent: 0;
+  opacity: 0;
+  list-style-type: none;
+  list-style-position: outside;
+  /**
+   * Ruler
+   */
+  /**
+   * List items
+   */
+  /**
+   * Default prefix view
+   */
+  /**
+   * Default entry view
+   */
+}
+ul.menu.visible {
+  opacity: 1;
+}
+ul.menu,
+ul.menu > span.non-item:not(:empty) {
+  box-sizing: border-box;
+  text-shadow: none;
+  font-weight: normal;
+  z-index: 120;
+}
+ul.menu > li,
+ul.menu > span.non-item:not(.active) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+}
+ul.menu > li,
+ul.menu > span.non-item:not(:empty) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  cursor: pointer;
+  padding: 3pt 6pt;
+  white-space: normal;
+  border-width: 2px;
+  border-bottom-width: 0px;
+  border-top-width: 0px;
+  border-style: solid;
+}
+ul.menu span.desc {
+  display: block;
+  font-size: 75%;
+}
+ul.menu div.lengthField {
+  border-color: transparent;
+  border-width: 2px;
+  padding: 3pt 6pt;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+ul.menu div.lengthField span {
+  display: block !important;
+  line-height: 0;
+  color: transparent;
+}
+ul.menu > div.ruler {
+  position: absolute;
+  right: 0px;
+  margin-right: -14px;
+  background-color: transparent;
+  width: 14px;
+  height: 100%;
+  opacity: 0;
+  cursor: pointer;
+  transition: opacity 0.5s ease 1s;
+}
+ul.menu > div.ruler > span {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+  position: absolute;
+  display: block;
+  right: 0;
+  width: 10px;
+  z-index: 115;
+  border-radius: 4px;
+  border-width: 2px;
+  border-style: solid;
+}
+ul.menu > div.ruler.active > span {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+ul.menu > div.ruler > div {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  position: absolute;
+  right: 0;
+  width: 10px;
+  height: 100%;
+  border-radius: 4px;
+  border-width: 2px;
+  border-style: solid;
+}
+ul.menu:active > div.ruler, ul.menu:hover > div.ruler,
+ul.menu > div.ruler.active {
+  transition: opacity 0.1s ease;
+  opacity: 1;
+}
+ul.menu > li,
+ul.menu div.lengthField {
+  padding-right: 1.6em;
+}
+ul.menu > li:first-of-type {
+  border-top-width: 2px;
+  border-top-left-radius: 6px;
+  border-top-right-radius: 6px;
+}
+ul.menu > li:last-of-type {
+  border-bottom-width: 2px;
+  border-bottom-left-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+ul.menu > li mark {
+  text-decoration: underline;
+  background-color: transparent;
+  color: inherit;
+  font-weight: bold;
+}
+ul.menu > li.active,
+ul.menu span.non-item.active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+ul.menu > li:hover,
+ul.menu span.non-item:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+ul.menu span.non-item {
+  border-radius: 6px;
+  border-width: 2px !important;
+}
+ul.menu span.pref:not(:empty) {
+  position: absolute;
+  min-width: 5px;
+  font-size: 80%;
+  left: 0;
+  bottom: 0;
+  display: block;
+  margin-bottom: -2.1em;
+  padding: 2px 6px;
+}
+ul.menu span.entry:not(:empty) {
+  position: absolute;
+  min-width: 5px;
+  font-size: 80%;
+  left: 0;
+  bottom: 0;
+  display: block;
+  margin-bottom: -2.1em;
+  padding: 2px 6px;
+}
+ul.menu span.pref:not(:empty) + span.entry:not(:empty) {
+  bottom: -27px;
+  left: 50px;
+  display: grid;
+}
+
+/**
+ * Rolling menu
+ */
+ul.menu.roll > li:first-of-type:not(.no-more):before {
+  position: absolute;
+  font-family: "FontAwesome";
+  content: "";
+  right: 0.5em;
+  top: 0.4em;
+}
+ul.menu.roll > li:last-of-type:not(.no-more):before {
+  position: absolute;
+  font-family: "FontAwesome";
+  content: "";
+  right: 0.5em;
+  bottom: 0.4em;
+}
+ul.menu.roll:not(.visible) {
+  height: 0;
+}
+
+/**
+ * Sorting menu
+ */
+ul.menu.sort {
+  position: relative;
+  display: inline-block;
+}
+ul.menu.sort > li::before {
+  content: "";
+}
+ul.menu.sort > li.active:hover {
+  color: #fefefe;
+  background-color: #c1002b;
+  border-color: black;
+  text-shadow: none;
+}
+
+/**
+ * select menu
+ */
+span.menu.select > span {
+  z-index: 105;
+}
+span.menu.select > ul.menu.roll {
+  display: none;
+  z-index: -100;
+}
+span.menu.select > ul.menu.roll.visible {
+  display: block;
+  z-index: 110;
+}
+
+.banner {
+  position: fixed;
+  width: 10em;
+  height: 10em;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  right: 0px;
+  margin-right: -2.4em;
+  top: 0;
+}
+.banner::after {
+  content: attr(data-note);
+  display: block;
+  overflow: hidden;
+  width: 12em;
+  font-size: 10pt;
+  font-weight: bold;
+  word-spacing: 2px;
+  text-decoration: none;
+  position: relative;
+  left: 2em;
+  top: -1.6em;
+  line-height: 2em;
+  text-align: center;
+  -moz-transform-origin: 0 0;
+  -moz-transform: rotate(45deg);
+  -webkit-transform-origin: 0 0;
+  -webkit-transform: rotate(45deg);
+  -ms-transform-origin: 0 0;
+  -ms-transform: rotate(45deg);
+  transform-origin: 0 0;
+  transform: rotate(45deg);
+  background-color: #f4eebb;
+  color: #f6a800;
+  border: 1px solid #f6a800;
+}
+
+/**
+ * Basic global CSS rules for Kalamar
+ */
+* {
+  -webkit-box-sizing: border-box;
+  /* Safari/Chrome, other WebKit */
+  -moz-box-sizing: border-box;
+  /* Firefox, other Gecko */
+  box-sizing: border-box;
+  /* Opera/IE 8+ */
+}
+
+body,
+html,
+select,
+g > text {
+  font-family: verdana, tahoma, arial, Helvetica, sans-serif;
+  color: #616263;
+  margin: 0;
+}
+
+g > text {
+  fill: #616263;
+}
+
+html {
+  height: 100vh;
+}
+
+body {
+  position: relative;
+  min-height: 100vh;
+  font-size: 12pt;
+  margin: 0;
+  padding: 0;
+}
+
+a:visited {
+  color: #e55d00;
+}
+a:link {
+  text-decoration: none;
+  color: #f6a800;
+}
+a:link:hover {
+  color: #e55d00;
+  transition: color 0.3s ease 0s;
+}
+a[href^="http://"]::after, a[href^="https://"]::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: " ";
+  font-size: 75%;
+}
+
+a[onclick$="return PArok(this,false)"] {
+  unicode-bidi: bidi-override;
+  direction: rtl;
+  text-align: left;
+}
+a[onclick$="return PArok(this,false)"] > span:nth-child(1n+2) {
+  display: none;
+}
+a[onclick$="return PArok(this,false)"] > span:nth-child(1)::after {
+  content: "@";
+}
+
+.clear {
+  clear: both;
+}
+
+iframe {
+  border-width: 0;
+}
+
+blockquote {
+  border-radius: 6px;
+  padding: 2pt 5pt 2pt 20pt;
+  margin: 0;
+  border-left: 5px solid #009ee0;
+  background-color: #bce4f7;
+  color: #009ee0;
+  mix-blend-mode: soft-light;
+}
+blockquote.bug, blockquote.missing, blockquote.warning {
+  border-left-color: black;
+  background-color: #c1002b;
+  color: #fefefe;
+  mix-blend-mode: multiply;
+}
+
+dl {
+  margin: 0;
+  padding-bottom: 0.5em;
+}
+dl dt {
+  font-weight: bold;
+}
+dl dt abbr {
+  border-width: 0;
+}
+dl dt abbr[data-type=token]::after {
+  color: #009ee0;
+}
+dl dt abbr[data-type=span]::after {
+  color: #c1002b;
+}
+dl dt abbr::after {
+  content: " (" attr(title) ")";
+  vertical-align: bottom;
+  font-style: italic;
+  font-weight: normal;
+  font-size: 80%;
+}
+
+/*
+ * Based on github.com style (c) Vasily Polovnyov <vast@whiteants.net>
+ */
+.hljs {
+  display: block;
+  padding: 0.5em;
+}
+
+.hljs-comment,
+.hljs-template_comment,
+.diff .hljs-header,
+.hljs-javadoc {
+  color: #998;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.css .rule .hljs-keyword,
+.hljs-winutils,
+.javascript .hljs-title,
+.nginx .hljs-title,
+.hljs-subst,
+.hljs-request,
+.hljs-status {
+  color: #333;
+  font-weight: bold;
+}
+
+.hljs-number,
+.hljs-hexcolor,
+.ruby .hljs-constant {
+  color: #099;
+}
+
+.hljs-string,
+.hljs-tag .hljs-value,
+.hljs-phpdoc,
+.tex .hljs-formula {
+  color: #d14;
+}
+
+.hljs-title,
+.hljs-id,
+.coffeescript .hljs-params,
+.scss .hljs-preprocessor {
+  color: #900;
+  font-weight: bold;
+}
+
+.javascript .hljs-title,
+.lisp .hljs-title,
+.clojure .hljs-title,
+.hljs-subst {
+  font-weight: normal;
+}
+
+.hljs-class .hljs-title,
+.haskell .hljs-type,
+.vhdl .hljs-literal,
+.tex .hljs-command {
+  color: #458;
+  font-weight: bold;
+}
+
+.hljs-tag,
+.hljs-tag .hljs-title,
+.hljs-rules .hljs-property,
+.django .hljs-tag .hljs-keyword {
+  color: #000080;
+  font-weight: normal;
+}
+
+.hljs-attribute,
+.hljs-variable,
+.lisp .hljs-body {
+  color: #008080;
+}
+
+.hljs-regexp {
+  color: #009926;
+}
+
+.hljs-symbol,
+.ruby .hljs-symbol .hljs-string,
+.lisp .hljs-keyword,
+.tex .hljs-special,
+.hljs-prompt {
+  color: #990073;
+}
+
+.hljs-built_in,
+.lisp .hljs-title,
+.clojure .hljs-built_in {
+  color: #0086b3;
+}
+
+.hljs-preprocessor,
+.hljs-pragma,
+.hljs-pi,
+.hljs-doctype,
+.hljs-shebang,
+.hljs-cdata {
+  color: #999;
+  font-weight: bold;
+}
+
+.hljs-deletion {
+  background: #fdd;
+}
+
+.hljs-addition {
+  background: #dfd;
+}
+
+.diff .hljs-change {
+  background: #0086b3;
+}
+
+.hljs-chunk {
+  color: #aaa;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the KWIC view.
+ */
+#search {
+  position: relative;
+  margin-bottom: 30px;
+  overflow: visible;
+}
+#search div.matchinfo {
+  display: none;
+}
+#search > ol {
+  overflow-x: hidden;
+  overflow-y: visible;
+  width: auto;
+  text-indent: 0;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  border: 1px solid #87888a;
+  font-size: 10pt;
+}
+#search > ol > li {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: stretch;
+  align-content: stretch;
+  border-style: solid;
+  border-color: #f6a800;
+  border-width: 0;
+}
+#search > ol > li .button-group.button-view {
+  display: none;
+}
+#search > ol > li:nth-of-type(even) div.match-main div.match-wrap {
+  background-color: #fefefe;
+}
+#search > ol > li p.ref {
+  display: none;
+}
+#search > ol > li div.meta,
+#search > ol > li div.match-main {
+  position: relative;
+  cursor: pointer;
+}
+#search > ol > li div.match-main {
+  display: block;
+  flex: 7 0;
+  z-index: 4;
+  overflow: hidden;
+}
+#search > ol > li div.match-main > div.match-wrap {
+  width: 99999%;
+  margin-left: -49999.5%;
+  background-color: #d9dadb;
+  overflow-x: hidden;
+  overflow-y: visible;
+  white-space: normal;
+}
+#search > ol > li div.meta {
+  flex: 1 0;
+  min-width: 12em;
+  max-width: 15em;
+  text-align: left;
+  width: 2px;
+  z-index: 5;
+  overflow-y: hidden;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  background-color: #949597;
+  color: #fefefe;
+  font-size: 75%;
+  padding: 0 5pt;
+  border-color: #616263;
+  border-style: solid;
+  border-width: 2px 1px 0 0;
+}
+#search > ol > li div.meta:before {
+  content: " ";
+  display: inline-block;
+  height: 100%;
+  vertical-align: middle;
+}
+#search > ol > li div.meta:empty {
+  border-width: 0 1px 0 0;
+}
+#search > ol > li div.meta.flip {
+  background-color: #b3b4b5;
+}
+#search > ol > li:first-of-type div.meta {
+  border-top-width: 0;
+}
+#search > ol > li:last-of-type div.meta {
+  border-bottom-width: 0;
+}
+
+/**
+ * Snippet rules
+ */
+div.snippet {
+  text-overflow: ellipsis;
+  text-indent: 0;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  font-size: 0;
+  white-space: nowrap !important;
+}
+div.snippet > span, div.snippet mark {
+  padding: 5pt 0 6pt 0;
+  font-size: 10pt;
+}
+div.snippet > mark,
+div.snippet > span.match {
+  font-weight: bold;
+  color: #333;
+  text-shadow: none;
+  padding-left: 4pt;
+  padding-right: 2pt;
+}
+div.snippet > span.match > span.cutted::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  color: #9bad0b;
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+div.snippet.startMore:before, div.snippet.endMore:after {
+  content: "…";
+  padding-left: 2pt;
+  padding-right: 2pt;
+}
+div.snippet div.flag {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 0;
+  width: 11px;
+  background-color: #f6a800;
+  border-right: 1px solid #e55d00;
+}
+
+/**
+ * Active rules
+ */
+body.no-js #search > ol > li:active,
+#search > ol > li.active,
+#search > ol > li:target {
+  position: relative;
+  display: block;
+  background-color: #f6a800;
+  text-align: left;
+  border-width: 2px;
+  white-space: normal;
+  height: auto;
+  width: auto;
+  overflow: hidden;
+}
+body.no-js #search > ol > li:active div.matchinfo,
+#search > ol > li.active div.matchinfo,
+#search > ol > li:target div.matchinfo {
+  display: block;
+}
+body.no-js #search > ol > li:active + li.active,
+#search > ol > li.active + li.active,
+#search > ol > li:target + li.active {
+  border-top: 2px solid #d9dadb;
+  padding-top: 6px;
+}
+body.no-js #search > ol > li:active + li.active .button-group.button-view,
+#search > ol > li.active + li.active .button-group.button-view,
+#search > ol > li:target + li.active .button-group.button-view {
+  padding-top: 6px;
+}
+body.no-js #search > ol > li:active .snippet,
+#search > ol > li.active .snippet,
+#search > ol > li:target .snippet {
+  white-space: normal !important;
+  padding: 2pt 0 5pt 5pt;
+  background-color: #f4eebb;
+  margin-top: 0;
+  margin-right: 20px;
+  margin-bottom: 0;
+  margin-left: 0;
+}
+body.no-js #search > ol > li:active .snippet span,
+#search > ol > li.active .snippet span,
+#search > ol > li:target .snippet span {
+  display: inline !important;
+}
+body.no-js #search > ol > li:active .snippet > *,
+#search > ol > li.active .snippet > *,
+#search > ol > li:target .snippet > * {
+  background-color: transparent;
+}
+body.no-js #search > ol > li:active .snippet div.flag,
+#search > ol > li.active .snippet div.flag,
+#search > ol > li:target .snippet div.flag {
+  display: none;
+}
+body.no-js #search > ol > li:active .snippet > span,
+#search > ol > li.active .snippet > span,
+#search > ol > li:target .snippet > span {
+  line-height: 1.4em;
+  width: auto;
+}
+body.no-js #search > ol > li:active .snippet > span.context-left,
+#search > ol > li.active .snippet > span.context-left,
+#search > ol > li:target .snippet > span.context-left {
+  margin-left: 0;
+  display: inline;
+  overflow: visible;
+  text-align: left;
+  width: auto;
+}
+body.no-js #search > ol > li:active .button-group.button-view,
+#search > ol > li.active .button-group.button-view,
+#search > ol > li:target .button-group.button-view {
+  display: block;
+}
+body.no-js #search > ol > li:active div.match-main,
+#search > ol > li.active div.match-main,
+#search > ol > li:target div.match-main {
+  display: block;
+  width: 100%;
+}
+body.no-js #search > ol > li:active div.match-main div.match-wrap,
+#search > ol > li.active div.match-main div.match-wrap,
+#search > ol > li:target div.match-main div.match-wrap {
+  cursor: default;
+  min-height: 20pt;
+  background-color: #f6a800;
+  width: 100%;
+  margin-left: 0;
+  overflow-x: visible;
+  white-space: normal;
+}
+body.no-js #search > ol > li:active div.meta,
+#search > ol > li.active div.meta,
+#search > ol > li:target div.meta {
+  display: none;
+}
+body.no-js #search > ol > li:active p.ref,
+#search > ol > li.active p.ref,
+#search > ol > li:target p.ref {
+  display: block;
+  color: #fefefe;
+  padding: 3pt 10pt 3pt 3pt;
+  padding-right: 20px;
+  margin: 0pt;
+  width: 100%;
+  bottom: 0;
+  z-index: 30;
+}
+body.no-js #search > ol > li:active p.ref > span.sigle,
+#search > ol > li.active p.ref > span.sigle,
+#search > ol > li:target p.ref > span.sigle {
+  font-size: 75%;
+  vertical-align: top;
+  color: #f4eebb;
+  float: right;
+}
+
+/**
+ * Alignment rules
+ */
+#search ol span.context-left {
+  display: inline-block;
+  width: 50.01%;
+  text-align: right;
+}
+#search ol.align-right {
+  text-align: right;
+}
+#search ol.align-right div.match-main span.context-right {
+  display: inline-block;
+  width: 49.915%;
+  text-align: left;
+}
+#search ol.align-center div.match-main {
+  width: 100% !important;
+}
+#search ol.align-center div.match-main > .match-wrap {
+  position: relative;
+  margin-left: 0;
+}
+#search ol.align-center li:not(.active) div.snippet {
+  white-space: normal;
+  text-align: center;
+  width: 100000pt;
+  margin-left: -50000pt;
+}
+#search ol.align-center li:not(.active) div.snippet span.context-left {
+  display: inline-block;
+  text-align: right;
+  width: 40000pt;
+  margin-left: 70vw;
+}
+#search ol.align-center li:not(.active) div.snippet span.context-right {
+  display: inline-block;
+  text-align: left;
+  width: 40000pt;
+}
+
+/**
+ * Fix empty contexts
+ */
+#search ol span.context-left:empty::after, #search ol span.context-right:empty::after {
+  content: " ";
+  display: inline-block;
+}
+
+/**
+ * Highlight rules
+ */
+mark {
+  background-color: inherit;
+  color: inherit;
+}
+
+mark > mark,
+em,
+.level-0 {
+  border-bottom-width: 2px;
+  border-bottom-style: solid;
+  padding-bottom: 0px !important;
+  font-style: normal;
+}
+
+mark > mark > mark,
+em > em,
+.level-1 {
+  padding-bottom: 3px !important;
+}
+
+mark > mark > mark > mark,
+em > em > em,
+.level-2 {
+  padding-bottom: 6px !important;
+}
+
+#search > ol > li:not(.active) mark > mark > mark > mark, #search > ol > li:not(.active) em > em > em {
+  line-height: 180%;
+}
+#search > ol > li.active mark > mark > mark > mark, #search > ol > li.active em > em > em {
+  line-height: 250%;
+}
+
+.class-1 {
+  border-color: #c1002b;
+}
+
+.class-2 {
+  border-color: #009ee0;
+}
+
+.class-3 {
+  border-color: #f6a800;
+}
+
+.class-4 {
+  border-color: #9bad0b;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for logos.
+ */
+.logo::after {
+  content: "" !important;
+}
+.logo > * {
+  background-repeat: no-repeat;
+  background-size: 90%;
+  background-position: 50% 50%;
+}
+.logo > * > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+
+/**
+ * Logo: KorAP
+ */
+h1 {
+  position: absolute;
+  margin: 0;
+  margin-left: 10pt;
+  left: 0;
+  top: 0;
+  width: 7.8em;
+  height: 2.4em;
+  z-index: 105;
+  background-size: 78% !important;
+  background-image: url("../img/korap-logo.svg");
+}
+
+aside.active ~ header h1 {
+  position: fixed;
+}
+
+#overview {
+  text-align: center;
+  width: 100%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Table view
+ *
+ * The table view is complicated, as the
+ * first column has to be static.
+ */
+div.matchtable > div {
+  z-index: 20;
+  margin-left: 179px;
+  margin-right: 20px;
+  padding: 0;
+  overflow-x: auto;
+  overflow-y: visible;
+  width: auto;
+}
+div.matchtable table {
+  display: table;
+  border-collapse: separate;
+  border-spacing: 0px;
+}
+div.matchtable th {
+  color: #fefefe;
+}
+div.matchtable td,
+div.matchtable tbody th,
+div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted) {
+  cursor: pointer;
+}
+div.matchtable td:empty {
+  cursor: default;
+}
+div.matchtable td:empty::after {
+  content: " ";
+  white-space: pre;
+}
+div.matchtable td.matchkeyvalues {
+  padding: 0;
+}
+div.matchtable td.matchkeyvalues > div {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+}
+div.matchtable td.matchkeyvalues > div > span {
+  color: #e55d00;
+  text-align: right;
+  padding-right: 0.5em;
+}
+div.matchtable td.matchkeyvalues > div > span::after {
+  content: ":";
+}
+div.matchtable tr {
+  outline: none;
+  /**
+   * The first two columns.
+   */
+}
+div.matchtable tr td.chosen,
+div.matchtable tr th.chosen,
+div.matchtable tr div.chosen {
+  background-color: #9bad0b !important;
+  color: #fefefe;
+}
+div.matchtable tr > th:nth-of-type(1),
+div.matchtable tr > th:nth-of-type(2) {
+  border-top: 2px solid #ff8000;
+  width: 88px;
+  position: absolute;
+  z-index: 80;
+  vertical-align: middle;
+  left: 0px;
+}
+div.matchtable tr > th:nth-of-type(2) {
+  left: 90px;
+}
+div.matchtable tr > * {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+  border: 1px solid #f6a800;
+}
+div.matchtable tr > td {
+  background-color: #ffd080;
+  white-space: nowrap;
+  vertical-align: top;
+  text-align: center;
+}
+div.matchtable tr > td.mark {
+  background-color: #f4eebb;
+}
+div.matchtable tr:nth-child(even) > td {
+  background-color: #f4eebb;
+}
+div.matchtable tr:nth-child(even) > td.mark {
+  background-color: #ffd080;
+}
+div.matchtable thead th {
+  background-color: #ff8000;
+  border-top-width: 0px !important;
+  text-align: center;
+}
+div.matchtable thead th:nth-of-type(1), div.matchtable thead th:nth-of-type(2) {
+  text-align: left;
+}
+div.matchtable thead th.mark {
+  background-color: #e55d00;
+}
+div.matchtable thead th.cutted {
+  background-color: #f4eebb;
+}
+div.matchtable thead th.cutted::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  color: #9bad0b;
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+div.matchtable tbody > tr:nth-of-type(1) > th {
+  border-top-color: transparent;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * SVG tree
+ */
+path.edge {
+  stroke: #ff8000;
+  stroke-width: 2px;
+  fill: none;
+}
+
+g.arc.infocus > path.edge {
+  stroke: #636f07;
+}
+
+marker#arr {
+  overflow: visible;
+}
+marker#arr path {
+  stroke: #e55d00;
+  fill: #e55d00;
+  fill-opacity: 1;
+  stroke-width: 2;
+}
+
+path.anchor {
+  stroke: #e55d00;
+  stroke-width: 3;
+  stroke-linecap: round;
+  z-index: 20;
+}
+
+g.root rect.empty {
+  stroke: #ff8000;
+  fill: #ff8000;
+  stroke-width: 2px;
+}
+
+g.middle rect,
+g.label rect {
+  stroke: #ff8000;
+  stroke-width: 2px;
+  fill: #ffd080;
+}
+
+g.label.infocus rect {
+  stroke: #636f07;
+  fill: #dce883;
+}
+
+g.middle.mark rect {
+  fill: #ff8000;
+}
+g.middle.mark > text {
+  fill: #f4eebb;
+}
+g.middle.mark > text > tspan {
+  stroke: #f4eebb;
+}
+
+g.leaf.mark text > tspan {
+  font-weight: bold;
+}
+
+g.leaf > rect {
+  display: none;
+}
+
+g > text > tspan {
+  text-anchor: middle;
+  font-size: 9pt;
+}
+
+g.leaf > text > tspan,
+text.leaf > tspan {
+  font-size: 10pt;
+  overflow: visible;
+}
+
+/**
+ * Matchtree view
+ */
+div.matchtree {
+  overflow-x: hidden;
+  overflow-y: visible;
+  padding: 0;
+  margin-top: 1pt;
+}
+div.matchtree h6 {
+  display: inline;
+  font-size: inherit;
+  color: #fefefe;
+  margin: 0;
+  padding: 0 !important;
+  float: left;
+}
+div.matchtree h6 > span {
+  border-top: 2px solid #ff8000;
+  width: 88px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 25em;
+  overflow: hidden;
+  padding: 1px 6px;
+  margin: 0px;
+  display: inline-block !important;
+  margin: 0;
+}
+div.matchtree h6 > span:nth-of-type(2) {
+  margin-left: 2px;
+}
+div.matchtree > div {
+  position: unset;
+  z-index: 4;
+  overflow-x: auto;
+  margin: 2px;
+  margin-left: 180px;
+  margin-right: 20px;
+  background-color: #f4eebb;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+div.metatable > dl {
+  margin-right: 20px;
+  margin-top: 2px;
+}
+div.metatable > dl > div {
+  border-color: #f6a800;
+}
+div.metatable > dl > div > * {
+  padding: 0.2em;
+}
+div.metatable > dl > div > dt {
+  background: #ff8000;
+  color: #fefefe;
+  width: 12.5em;
+}
+div.metatable > dl > div > dd {
+  background-color: #f4eebb;
+  cursor: pointer;
+}
+div.metatable > dl > div > dd.metakeyvalues {
+  padding: 0;
+}
+div.metatable > dl > div > dd.metakeyvalues > div {
+  padding: 0.2em;
+}
+div.metatable > dl > div > dd.metakeyvalues > div::before {
+  content: "• ";
+  color: #f6a800;
+}
+div.metatable > dl > div > dd.chosen,
+div.metatable > dl > div > dd > div.chosen {
+  background-color: #9bad0b !important;
+  color: #fefefe;
+}
+div.metatable > dl > div > dd[data-type="type:store"], div.metatable > dl > div > dd[data-type="type:attachement"] {
+  background-color: #ffd080;
+  cursor: default;
+}
+div.metatable > dl > div > dd[data-type="type:store"] a, div.metatable > dl > div > dd[data-type="type:attachement"] a {
+  color: inherit;
+}
+div.metatable > dl.cbm-disabled > div > dd {
+  cursor: default !important;
+}
+
+/**
+ * General matchinfo styles.
+ */
+div.matchinfo {
+  position: relative;
+  width: 100%;
+  padding-top: 2px;
+  height: auto;
+  font-size: 10pt;
+  text-align: left;
+}
+div.matchinfo:empty {
+  display: none !important;
+}
+div.matchinfo .view + .view {
+  margin-top: 8px !important;
+}
+
+div.metatable,
+div.matchtable,
+div.matchtree {
+  position: relative;
+  background-color: #f6a800;
+}
+
+div.button-group.button-panel.button-matchinfo {
+  display: inline-block;
+  margin-right: 0.5em;
+}
+div.button-group.button-panel.button-matchinfo > span {
+  position: relative;
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * The pagination view
+ *
+ * <div id="pagination">
+ *   <a rel="prev"><span><i class="fa fa-caret-left"></i></span></a>
+ *   <a rel="self"><span>1</span></a>
+ *   <a href="#p=2"><span>2</span></a>
+ *   <a href="#3"><span>3</span></a>
+ *   <span><i class="fa fa-ellipsis-h"></i></span>
+ *   <a href="#67"><span>67</span></a>
+ *   <a rel="next" href="#2"><span><i class="fa fa-caret-right"></i></span></a>
+ * </div>
+ */
+#pagination {
+  /*
+   * Always in fixed position.
+   * This may need to be overwritten in case multiple
+   * paginations have to be activated.
+   */
+  position: fixed;
+  font-size: 0;
+  right: 10px;
+  bottom: 20px;
+  z-index: 35;
+  padding: 0;
+  height: auto;
+  line-height: 0;
+}
+#pagination > a {
+  margin: 0;
+  font-size: 10pt;
+  padding: 0;
+}
+#pagination > a > span {
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  display: inline-block;
+  line-height: 2em;
+  text-align: center;
+  border-top-width: 2px;
+  border-bottom-width: 2px;
+  border-top-style: solid;
+  border-bottom-style: solid;
+}
+#pagination > a:not(:link):not([rel=self]) span {
+  color: #87888a;
+}
+#pagination > a.ellipsis > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a.ellipsis > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a[rel=self] > span {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+  border-left-width: 2px;
+  border-right-width: 2px;
+  border-left-style: solid;
+  border-right-style: solid;
+}
+#pagination > a[rel=prev] > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+  border-left-width: 2px;
+  border-left-style: solid;
+}
+#pagination > a[rel=prev] > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a[rel=prev] > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a[rel=next] > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+  border-right-width: 2px;
+  border-right-style: solid;
+}
+#pagination > a[rel=next] > span > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+#pagination > a[rel=next] > span::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  line-height: 1em;
+}
+#pagination > a:link:hover, #pagination > a:link:focus {
+  outline: none;
+}
+#pagination > a:link:hover span, #pagination > a:link:focus span {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+pre.query {
+  overflow-x: hidden;
+  padding: 0.5em;
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: relative;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+}
+pre.query:not(.unsupported) {
+  cursor: pointer;
+}
+pre.query:not(.unsupported):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+pre.query:not(.unsupported):active {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+pre.query.unsupported span {
+  vertical-align: super;
+  color: #009ee0;
+  font-size: 90%;
+  font-weight: bold;
+  cursor: help;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules applicable for the result panel
+ */
+#resultinfo {
+  clear: both;
+  text-align: right;
+  line-height: 1.5em;
+  min-height: 1.5em;
+  margin-top: 0.4em;
+  font-size: 10pt;
+  /*
+   * TODO:
+   *   This rule should not be dependent on
+   *   whether something is found or not,
+   *   but whether #search contains a result,
+   *   e.g. when a result view is open in the
+   *   result panel. This should probably be
+   *   indicated by a class on the button group
+   *   rather than a class on the resultinfo.
+   */
+}
+#resultinfo p.found {
+  display: inline;
+  padding: 0;
+  margin: 0;
+  text-align: right;
+}
+#resultinfo.found {
+  position: relative;
+  margin-bottom: 0px;
+}
+#resultinfo.found .button-group > span {
+  margin-bottom: 0;
+  border-bottom-width: 0;
+  box-shadow: none;
+}
+#resultinfo.found .button-group > span:first-child {
+  border-bottom-left-radius: 0;
+}
+#resultinfo.found .button-group > span:last-child {
+  border-bottom-right-radius: 0;
+}
+
+div.result.panel .view {
+  border: 1px solid #87888a;
+  background-color: #f6a800;
+}
+
+.result.button-group.button-panel {
+  display: inline-block;
+  width: auto;
+  vertical-align: bottom;
+  line-height: 1.5em;
+}
+.result.button-group.button-panel > span {
+  line-height: 1.5em;
+  border-width: 1px 0;
+}
+.result.button-group.button-panel > span:first-child {
+  border-left-width: 1px;
+}
+.result.button-group.button-panel > span:last-child {
+  border-right-width: 1px;
+}
+
+#total-results {
+  color: #9bad0b;
+  font-weight: bold;
+}
+
+.no-results {
+  margin: 0 auto;
+  text-align: center;
+}
+.no-results code {
+  font-weight: bold;
+}
+
+.button-icon.align.left::after {
+  content: "";
+}
+.button-icon.align.right::after {
+  content: "";
+}
+.button-icon.align.center::after {
+  content: "";
+}
+.button-icon.show-kq::after {
+  content: "";
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the embedded documentation.
+ */
+#tutorial {
+  position: fixed;
+  z-index: 9999;
+  top: 5%;
+  bottom: 5%;
+  left: 2%;
+  right: 2%;
+  padding-right: 20px;
+  background-color: #fefefe;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-width: 4px;
+  border-color: #616263;
+  border-style: solid;
+  border-radius: 6px;
+}
+#tutorial .button-group.button-view {
+  background-color: #87888a;
+  display: block;
+  height: 100%;
+}
+#tutorial iframe {
+  border-width: 0;
+  width: 100%;
+  min-height: 100.1%;
+  background-image: url("../img/korap-bg.svg");
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: 15%;
+}
+
+p.bibentry {
+  font-size: 80%;
+  margin-left: 3em;
+  margin-bottom: 3em;
+  text-indent: -1.5em;
+}
+p.bibentry cite {
+  font-weight: bold;
+}
+
+body.embedded {
+  background-color: #fefefe;
+}
+body.embedded aside {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding-top: 0;
+  background-color: #87888a;
+}
+body.embedded aside > div {
+  position: relative;
+  top: 50%;
+  -webkit-transform: translateY(-50%);
+  -ms-transform: translateY(-50%);
+  transform: translateY(-50%);
+}
+
+main.tutorial a.embedded-link::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: " ";
+  font-size: 75%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the KoralQuery view.
+ */
+#koralquery {
+  white-space: pre;
+}
+#koralquery > div {
+  background-color: #fefefe;
+  overflow-x: auto;
+  font-size: 85%;
+  margin-top: 2pt;
+  margin-right: 20px;
+  margin-bottom: 2pt;
+  margin-left: 2pt;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+.alertify,
+.alertify-show,
+.alertify-log {
+  -webkit-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -moz-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -ms-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  -o-transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  transition: all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+  /* easeOutBack */
+}
+
+.alertify-hide {
+  -webkit-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -moz-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -ms-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -o-transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  transition: all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  /* easeInBack */
+}
+
+.alertify-log-hide {
+  -webkit-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -moz-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -ms-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  -o-transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  transition: all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);
+  /* easeInBack */
+}
+
+.alertify-cover {
+  position: fixed;
+  z-index: 99999;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  background-color: white;
+  filter: opacity(0);
+  opacity: 0;
+}
+
+.alertify-cover-hidden {
+  display: none;
+}
+
+.alertify {
+  position: fixed;
+  z-index: 99999;
+  top: 50px;
+  left: 50%;
+  width: 550px;
+  margin-left: -275px;
+  opacity: 1;
+}
+
+.alertify-hidden {
+  -webkit-transform: translate(0, -150px);
+  -moz-transform: translate(0, -150px);
+  -ms-transform: translate(0, -150px);
+  -o-transform: translate(0, -150px);
+  transform: translate(0, -150px);
+  opacity: 0;
+  display: none;
+}
+
+/* overwrite display: none; for everything except IE6-8 */
+:root * > .alertify-hidden {
+  display: block;
+  visibility: hidden;
+}
+
+.alertify-logs {
+  position: fixed;
+  z-index: 5000;
+  bottom: 10px;
+  right: 10px;
+  width: 300px;
+}
+
+.alertify-logs-hidden {
+  display: none;
+}
+
+.alertify-log {
+  display: block;
+  margin-top: 10px;
+  position: relative;
+  right: -300px;
+  opacity: 0;
+}
+
+.alertify-log-show {
+  right: 0;
+  opacity: 1;
+}
+
+.alertify-log-hide {
+  -webkit-transform: translate(300px, 0);
+  -moz-transform: translate(300px, 0);
+  -ms-transform: translate(300px, 0);
+  -o-transform: translate(300px, 0);
+  transform: translate(300px, 0);
+  opacity: 0;
+}
+
+.alertify-dialog {
+  padding: 25px;
+}
+
+.alertify-resetFocus {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+.alertify-inner {
+  text-align: center;
+}
+
+.alertify-text {
+  margin-bottom: 15px;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 100%;
+}
+
+.alertify-button,
+.alertify-button:hover,
+.alertify-button:active,
+.alertify-button:visited {
+  background: none;
+  text-decoration: none;
+  border: none;
+  /* line-height and font-size for input button */
+  line-height: 1.5;
+  font-size: 100%;
+  display: inline-block;
+  cursor: pointer;
+  margin-left: 5px;
+}
+
+@media only screen and (max-width: 680px) {
+  .alertify,
+.alertify-logs {
+    width: 90%;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+
+  .alertify {
+    left: 5%;
+    margin: 0;
+  }
+}
+/**
+ * Default Look and Feel
+ */
+.alertify,
+.alertify-log {
+  font-family: sans-serif;
+}
+
+.alertify {
+  background: #FFF;
+  border: 10px solid #333;
+  /* browsers that don't support rgba */
+  border: 10px solid rgba(0, 0, 0, 0.7);
+  border-radius: 8px;
+  box-shadow: 0 3px 3px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding;
+  /* Safari 4? Chrome 6? */
+  -moz-background-clip: padding;
+  /* Firefox 3.6 */
+  background-clip: padding-box;
+  /* Firefox 4, Safari 5, Opera 10, IE 9 */
+}
+
+.alertify-text {
+  border: 1px solid #CCC;
+  padding: 10px;
+  border-radius: 4px;
+}
+
+.alertify-button {
+  border-radius: 4px;
+  color: #FFF;
+  font-weight: bold;
+  padding: 6px 15px;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
+  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.5);
+  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -ms-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+  background-image: linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));
+}
+
+.alertify-button:hover,
+.alertify-button:focus {
+  outline: none;
+  background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+  background-image: linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
+}
+
+.alertify-button:focus {
+  box-shadow: 0 0 15px #2B72D5;
+}
+
+.alertify-button:active {
+  position: relative;
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.alertify-button-cancel,
+.alertify-button-cancel:hover,
+.alertify-button-cancel:focus {
+  background-color: #FE1A00;
+  border: 1px solid #D83526;
+}
+
+.alertify-button-ok,
+.alertify-button-ok:hover,
+.alertify-button-ok:focus {
+  background-color: #5CB811;
+  border: 1px solid #3B7808;
+}
+
+.alertify-log {
+  background: #1F1F1F;
+  background: black;
+  padding: 15px;
+  border-radius: 4px;
+  color: #FFF;
+}
+
+/*
+.alertify-log-error {
+  background: #FE1A00;
+  //  background: rgba(254,26,0,.9);
+    background: rgb(254,26,0);
+}
+*/
+.alertify-log-success {
+  background: #5CB811;
+  background: #5cb811;
+}
+
+/**
+ * Alertify styles.
+ */
+article.alertify-log-warn {
+  background-color: #f6a800;
+}
+article.alertify-log-warn code.src {
+  color: #e55d00;
+}
+
+article.alertify-log code.src {
+  display: block;
+  color: black;
+  font-size: 70%;
+}
+
+.alertify-log-error {
+  background-color: #fe1a00;
+}
+
+#notifications {
+  display: none;
+}
+
+div.notify {
+  position: relative;
+  margin: 0.5em auto;
+  display: block;
+  padding: 0.5em;
+  border-radius: 6px;
+  max-width: 30em;
+  background-color: #fe1a00;
+  color: #fefefe;
+}
+div.notify.notify-success {
+  background-color: #636f07;
+}
+div.notify.notify-warn {
+  background-color: #f29400;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for the intro page
+ */
+div.intro a:visited {
+  color: #e55d00;
+}
+div.intro div.announcement {
+  background-color: #f4eebb;
+  padding: 8px;
+  border: 5px dashed #f6a800;
+  border-radius: 1em;
+  width: 90%;
+  margin: auto;
+}
+
+aside.active ~ main div.intro {
+  margin-left: 198px;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/*
+ * Define the base layout of horizontal button groups
+ */
+.button-group {
+  font-size: 0;
+}
+.button-group > span {
+  cursor: pointer;
+}
+.button-group.button-panel > span,
+.button-group.button-panel a, .button-group.operators > span,
+.button-group.operators a {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  font-size: 9pt;
+  font-weight: normal;
+  line-height: 1.5em;
+  padding: 0 4px;
+  display: inline-block;
+  border-style: solid;
+  border-width: 2px 0;
+}
+.button-group.button-panel > span:hover,
+.button-group.button-panel a:hover, .button-group.operators > span:hover,
+.button-group.operators a:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+.button-group.button-panel > span:first-child,
+.button-group.button-panel a:first-child, .button-group.operators > span:first-child,
+.button-group.operators a:first-child {
+  border-left-width: 2px;
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.button-group.button-panel > span:last-child,
+.button-group.button-panel a:last-child, .button-group.operators > span:last-child,
+.button-group.operators a:last-child {
+  border-right-width: 2px;
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.button-group.button-panel > span > span.check,
+.button-group.button-panel a > span.check {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  width: 1em;
+  display: inline-block;
+  text-align: left;
+}
+.button-group.button-panel > span > span.check:not(.checked)::after,
+.button-group.button-panel a > span.check:not(.checked)::after {
+  content: "";
+}
+.button-group.button-panel > span > span.check.checked::after,
+.button-group.button-panel a > span.check.checked::after {
+  content: "";
+}
+.button-group.button-panel > span > span.check > span,
+.button-group.button-panel a > span.check > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+.button-group.button-view {
+  position: absolute;
+  display: block;
+  right: 0;
+  top: 0;
+  z-index: 20;
+  margin: 0;
+  padding: 0;
+  width: 20px;
+  font-size: 10pt;
+  color: #fefefe;
+}
+.button-group.button-view > span:first-child {
+  margin-top: 2px;
+}
+.button-group.button-view > span {
+  display: block !important;
+  border-width: 0;
+  text-decoration: none;
+  text-align: center;
+  font-style: normal;
+}
+.button-group.button-view > span.download::after {
+  content: "";
+}
+.button-group.button-view > span.close::after {
+  content: "";
+}
+.button-group.button-view > span.minimize::after {
+  content: "";
+}
+.button-group.button-view > span.plugin::after {
+  content: "";
+}
+
+ul.menu.button-group-list {
+  border-top-right-radius: 8px;
+  position: fixed;
+  font-size: 10pt;
+  left: 0;
+  text-align: left;
+  margin: -2px;
+  margin-top: 0;
+}
+ul.menu.button-group-list > li:first-of-type {
+  border-top-right-radius: 5px;
+}
+
+.button-icon {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  line-height: 1.3;
+}
+.button-icon > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+.button-icon[data-icon]::after {
+  content: attr(data-icon);
+}
+
+.button-panel .button-icon {
+  line-height: 0.7;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Base styles for all panels and views
+ */
+div.panel {
+  position: relative;
+  width: 100%;
+  display: block;
+}
+
+div.view {
+  position: relative;
+  padding-top: 2px;
+  display: block;
+  width: 100%;
+}
+
+div.view:not(.show) {
+  display: none;
+}
+
+.introjs-overlay {
+  position: absolute;
+  box-sizing: content-box;
+  z-index: 999999;
+  background-color: #000;
+  opacity: 0;
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0, 0, 0, 0.4)), color-stop(100%, rgba(0, 0, 0, 0.9)));
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  background: radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);
+  filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+  filter: alpha(opacity=50);
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-fixParent {
+  z-index: auto !important;
+  opacity: 1 !important;
+  -webkit-transform: none !important;
+  -moz-transform: none !important;
+  -ms-transform: none !important;
+  -o-transform: none !important;
+  transform: none !important;
+}
+
+.introjs-showElement,
+tr.introjs-showElement > td,
+tr.introjs-showElement > th {
+  z-index: 9999999 !important;
+}
+
+.introjs-disableInteraction {
+  z-index: 99999999 !important;
+  position: absolute;
+  background-color: white;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+
+.introjs-relativePosition,
+tr.introjs-showElement > td,
+tr.introjs-showElement > th {
+  position: relative;
+}
+
+.introjs-helperLayer {
+  box-sizing: content-box;
+  position: absolute;
+  z-index: 9999998;
+  background-color: #FFF;
+  background-color: rgba(255, 255, 255, 0.9);
+  border: 1px solid #777;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  border-radius: 4px;
+  box-shadow: 0 2px 15px rgba(0, 0, 0, 0.4);
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-tooltipReferenceLayer {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: hidden;
+  z-index: 100000000;
+  background-color: transparent;
+  -webkit-transition: all 0.3s ease-out;
+  -moz-transition: all 0.3s ease-out;
+  -ms-transition: all 0.3s ease-out;
+  -o-transition: all 0.3s ease-out;
+  transition: all 0.3s ease-out;
+}
+
+.introjs-helperLayer *,
+.introjs-helperLayer *:before,
+.introjs-helperLayer *:after {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  -ms-box-sizing: content-box;
+  -o-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.introjs-helperNumberLayer {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: visible;
+  top: -16px;
+  left: -16px;
+  z-index: 9999999999 !important;
+  padding: 2px;
+  font-family: Arial, verdana, tahoma;
+  font-size: 13px;
+  font-weight: bold;
+  color: white;
+  text-align: center;
+  text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
+  background: #ff3019;
+  /* Old browsers */
+  background: -webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));
+  /* Chrome,Safari4+ */
+  background: -moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #ff3019 0%, #cf0404 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);
+  /* W3C */
+  width: 20px;
+  height: 20px;
+  line-height: 20px;
+  border: 3px solid white;
+  border-radius: 50%;
+  filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";
+  /* IE6-9 */
+  filter: "progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";
+  /* IE10 text shadows */
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4);
+}
+
+.introjs-arrow {
+  border: 5px solid transparent;
+  content: "";
+  position: absolute;
+}
+
+.introjs-arrow.top {
+  top: -10px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.top-right {
+  top: -10px;
+  right: 10px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.top-middle {
+  top: -10px;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: white;
+}
+
+.introjs-arrow.right {
+  right: -10px;
+  top: 10px;
+  border-left-color: white;
+}
+
+.introjs-arrow.right-bottom {
+  bottom: 10px;
+  right: -10px;
+  border-left-color: white;
+}
+
+.introjs-arrow.bottom {
+  bottom: -10px;
+  border-top-color: white;
+}
+
+.introjs-arrow.bottom-right {
+  bottom: -10px;
+  right: 10px;
+  border-top-color: white;
+}
+
+.introjs-arrow.bottom-middle {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: white;
+}
+
+.introjs-arrow.left {
+  left: -10px;
+  top: 10px;
+  border-right-color: white;
+}
+
+.introjs-arrow.left-bottom {
+  left: -10px;
+  bottom: 10px;
+  border-right-color: white;
+}
+
+.introjs-tooltip {
+  box-sizing: content-box;
+  position: absolute;
+  visibility: visible;
+  padding: 10px;
+  background-color: white;
+  min-width: 200px;
+  max-width: 300px;
+  border-radius: 3px;
+  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.4);
+  -webkit-transition: opacity 0.1s ease-out;
+  -moz-transition: opacity 0.1s ease-out;
+  -ms-transition: opacity 0.1s ease-out;
+  -o-transition: opacity 0.1s ease-out;
+  transition: opacity 0.1s ease-out;
+}
+
+.introjs-tooltipbuttons {
+  text-align: right;
+  white-space: nowrap;
+}
+
+/*
+ Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/
+ Changed by Afshin Mehrabani
+*/
+.introjs-button {
+  box-sizing: content-box;
+  position: relative;
+  overflow: visible;
+  display: inline-block;
+  padding: 0.3em 0.8em;
+  border: 1px solid #d4d4d4;
+  margin: 0;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 #fff;
+  font: 11px/normal sans-serif;
+  color: #333;
+  white-space: nowrap;
+  cursor: pointer;
+  outline: none;
+  background-color: #ececec;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));
+  background-image: -moz-linear-gradient(#f4f4f4, #ececec);
+  background-image: -o-linear-gradient(#f4f4f4, #ececec);
+  background-image: linear-gradient(#f4f4f4, #ececec);
+  -webkit-background-clip: padding;
+  -moz-background-clip: padding;
+  -o-background-clip: padding-box;
+  /*background-clip: padding-box;*/
+  /* commented out due to Opera 11.10 bug */
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+  /* IE hacks */
+  zoom: 1;
+  *display: inline;
+  margin-top: 10px;
+}
+
+.introjs-button:hover {
+  border-color: #bcbcbc;
+  text-decoration: none;
+  box-shadow: 0px 1px 1px #e3e3e3;
+}
+
+.introjs-button:focus,
+.introjs-button:active {
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));
+  background-image: -moz-linear-gradient(#ececec, #f4f4f4);
+  background-image: -o-linear-gradient(#ececec, #f4f4f4);
+  background-image: linear-gradient(#ececec, #f4f4f4);
+}
+
+/* overrides extra padding on button elements in Firefox */
+.introjs-button::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+.introjs-skipbutton {
+  box-sizing: content-box;
+  margin-right: 5px;
+  color: #7a7a7a;
+}
+
+.introjs-prevbutton {
+  -webkit-border-radius: 0.2em 0 0 0.2em;
+  -moz-border-radius: 0.2em 0 0 0.2em;
+  border-radius: 0.2em 0 0 0.2em;
+  border-right: none;
+}
+
+.introjs-prevbutton.introjs-fullbutton {
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+}
+
+.introjs-nextbutton {
+  -webkit-border-radius: 0 0.2em 0.2em 0;
+  -moz-border-radius: 0 0.2em 0.2em 0;
+  border-radius: 0 0.2em 0.2em 0;
+}
+
+.introjs-nextbutton.introjs-fullbutton {
+  -webkit-border-radius: 0.2em;
+  -moz-border-radius: 0.2em;
+  border-radius: 0.2em;
+}
+
+.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {
+  color: #9a9a9a;
+  border-color: #d4d4d4;
+  box-shadow: none;
+  cursor: default;
+  background-color: #f4f4f4;
+  background-image: none;
+  text-decoration: none;
+}
+
+.introjs-hidden {
+  display: none;
+}
+
+.introjs-bullets {
+  text-align: center;
+}
+
+.introjs-bullets ul {
+  box-sizing: content-box;
+  clear: both;
+  margin: 15px auto 0;
+  padding: 0;
+  display: inline-block;
+}
+
+.introjs-bullets ul li {
+  box-sizing: content-box;
+  list-style: none;
+  float: left;
+  margin: 0 2px;
+}
+
+.introjs-bullets ul li a {
+  box-sizing: content-box;
+  display: block;
+  width: 6px;
+  height: 6px;
+  background: #ccc;
+  border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.introjs-bullets ul li a:hover {
+  background: #999;
+}
+
+.introjs-bullets ul li a.active {
+  background: #999;
+}
+
+.introjs-progress {
+  box-sizing: content-box;
+  overflow: hidden;
+  height: 10px;
+  margin: 10px 0 5px 0;
+  border-radius: 4px;
+  background-color: #ecf0f1;
+}
+
+.introjs-progressbar {
+  box-sizing: content-box;
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 10px;
+  line-height: 10px;
+  text-align: center;
+  background-color: #08c;
+}
+
+.introjsFloatingElement {
+  position: absolute;
+  height: 0;
+  width: 0;
+  left: 50%;
+  top: 50%;
+}
+
+.introjs-fixedTooltip {
+  position: fixed;
+}
+
+.introjs-hint {
+  box-sizing: content-box;
+  position: absolute;
+  background: transparent;
+  width: 20px;
+  height: 15px;
+  cursor: pointer;
+}
+
+.introjs-hint:focus {
+  border: 0;
+  outline: 0;
+}
+
+.introjs-hidehint {
+  display: none;
+}
+
+.introjs-fixedhint {
+  position: fixed;
+}
+
+.introjs-hint:hover > .introjs-hint-pulse {
+  border: 5px solid rgba(60, 60, 60, 0.57);
+}
+
+.introjs-hint-pulse {
+  box-sizing: content-box;
+  width: 10px;
+  height: 10px;
+  border: 5px solid rgba(60, 60, 60, 0.27);
+  -webkit-border-radius: 30px;
+  -moz-border-radius: 30px;
+  border-radius: 30px;
+  background-color: rgba(136, 136, 136, 0.24);
+  z-index: 10;
+  position: absolute;
+  -webkit-transition: all 0.2s ease-out;
+  -moz-transition: all 0.2s ease-out;
+  -ms-transition: all 0.2s ease-out;
+  -o-transition: all 0.2s ease-out;
+  transition: all 0.2s ease-out;
+}
+
+.introjs-hint-no-anim .introjs-hint-dot {
+  -webkit-animation: none;
+  -moz-animation: none;
+  animation: none;
+}
+
+.introjs-hint-dot {
+  box-sizing: content-box;
+  border: 10px solid rgba(146, 146, 146, 0.36);
+  background: transparent;
+  -webkit-border-radius: 60px;
+  -moz-border-radius: 60px;
+  border-radius: 60px;
+  height: 50px;
+  width: 50px;
+  -webkit-animation: introjspulse 3s ease-out;
+  -moz-animation: introjspulse 3s ease-out;
+  animation: introjspulse 3s ease-out;
+  -webkit-animation-iteration-count: infinite;
+  -moz-animation-iteration-count: infinite;
+  animation-iteration-count: infinite;
+  position: absolute;
+  top: -25px;
+  left: -25px;
+  z-index: 1;
+  opacity: 0;
+}
+
+@-webkit-keyframes introjspulse {
+  0% {
+    -webkit-transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    -webkit-transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    -webkit-transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    -webkit-transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    opacity: 0;
+  }
+}
+@-moz-keyframes introjspulse {
+  0% {
+    -moz-transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    -moz-transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    -moz-transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    -moz-transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    -moz-transform: scale(1);
+    opacity: 0;
+  }
+}
+@keyframes introjspulse {
+  0% {
+    transform: scale(0);
+    opacity: 0;
+  }
+  25% {
+    transform: scale(0);
+    opacity: 0.1;
+  }
+  50% {
+    transform: scale(0.1);
+    opacity: 0.3;
+  }
+  75% {
+    transform: scale(0.5);
+    opacity: 0.5;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 0;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles overriding introJS styles
+ */
+.introjs-helperLayer {
+  background-color: transparent;
+}
+
+.introjs-tooltip.gTstartSearch {
+  max-width: 500px;
+}
+
+.tgreeting {
+  font-weight: bold;
+  color: #e55d00;
+}
+
+.pfirstStep {
+  width: 500px;
+}
+
+.introjs-donebutton {
+  float: right;
+  margin-left: 5px;
+}
+
+.introjs-skipbutton {
+  color: #333;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Styles for OAuth management form.
+ */
+ul.client-list {
+  padding-left: 1.5em;
+}
+ul.client-list li.client {
+  list-style-type: none;
+}
+ul.client-list li.client span.client-name::before {
+  margin-left: -1.5em;
+}
+ul.client-list li.client span.client-desc {
+  font-size: 70%;
+  display: block;
+}
+
+span.client-name {
+  font-weight: bold;
+}
+span.client-name::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  display: inline-block;
+  width: 1.5em;
+  content: "";
+  color: #009ee0;
+  font-size: 100%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+section#news {
+  background-color: #e3e8a3;
+  mix-blend-mode: soft-light;
+  padding: 1em;
+  padding-right: 2em;
+  border-radius: 6px;
+  border-left: 5px solid #636f07;
+}
+section#news dt {
+  float: left;
+  clear: left;
+  width: 15ex;
+  text-align: right;
+  font-weight: bold;
+}
+section#news dd.maintenance > h4::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  color: #c1002b;
+  content: " ";
+}
+section#news dd {
+  margin: 0 1ex 0 16ex;
+  padding: 0 0 0.5em 1em;
+}
+section#news dd > p {
+  max-width: 80ex;
+  margin-block-start: 0ex;
+}
+section#news dd > h4 {
+  margin-block-start: 0ex;
+  margin-block-end: 0.33ex;
+}
+
+@media all and (max-width: 42.5em) {
+  section#news dt {
+    text-align: left;
+    float: none;
+    width: auto;
+    padding-bottom: 0.2em;
+  }
+  section#news dd {
+    margin-left: 1em;
+  }
+}
+/**
+ * Base rules for all plugin related styles,
+ * like widgets.
+ */
+div.view.widget {
+  padding-right: 20px;
+}
+div.view.widget > iframe {
+  margin: 0;
+  box-sizing: border-box;
+  padding: 0;
+  width: 100%;
+  overflow-x: auto;
+}
+
+div.panel.result > div > div.widget > iframe {
+  background-color: #fefefe;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+main {
+  padding-bottom: 100pt;
+  margin-left: 40px;
+  margin-right: 20px;
+}
+main.embedded {
+  margin-left: 14px;
+  margin-right: 14px;
+}
+main p {
+  text-align: justify;
+  hyphens: auto;
+}
+main h2#page-top {
+  margin-top: 0;
+  padding-top: 1em;
+}
+main.page {
+  margin-left: 245px;
+}
+main.page p code,
+main.page li code,
+main.page dd code,
+main.page dt code {
+  background-color: #d9dadb;
+  color: #87888a;
+  padding: 0 0.5em;
+  border-radius: 6px;
+}
+main p.hint {
+  margin: 0 auto;
+  text-align: center;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the Kalamar hint helper.
+ */
+ul.menu.hint {
+  display: inline-block;
+  white-space: normal;
+  text-align: left;
+  max-width: 23em !important;
+  top: 0;
+}
+ul.menu.hint > li:first-of-type {
+  border-top-width: 1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+div.alert.hint {
+  position: absolute;
+  background-color: #fe1a00;
+  color: #fefefe;
+  padding: 3pt 6pt;
+  margin-top: 8px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  width: auto;
+  min-width: 10em;
+  max-width: 23em !important;
+  transition: opacity 0.2s ease 0s;
+  border-radius: 6px;
+  border-top-left-radius: 0;
+}
+div.alert.hint::before {
+  position: absolute;
+  content: "";
+  display: block;
+  top: -12px;
+  left: 0;
+  width: 0;
+  white-space: normal;
+  border-width: 0 8px 12px 0;
+  border-style: solid;
+  border-color: #fe1a00 transparent;
+}
+
+.hint.mirror {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  z-index: 90;
+  white-space: pre-wrap;
+  height: 0;
+}
+.hint.mirror > span {
+  opacity: 0;
+  white-space: pre-wrap;
+  overflow: hidden;
+}
+.hint.mirror > div {
+  position: absolute;
+  display: block;
+  cursor: pointer;
+  transition: left 0.2s ease 0s;
+  top: 0;
+  left: 0;
+  text-align: left;
+  padding: 0;
+  border-top: 5px solid #f6a800;
+  height: 10px;
+  width: 1.2em;
+}
+.hint.mirror > div:hover:not(.active) {
+  border-top: 10px solid #f6a800;
+}
+.hint.mirror > div.active {
+  border-top-width: 0;
+  height: 0;
+  width: 23em;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Search field
+ */
+#q-field {
+  display: block;
+  margin-bottom: 3px;
+  width: 100%;
+  margin: 0;
+}
+#q-field::-webkit-search-cancel-button {
+  display: none;
+}
+#q-field.loading {
+  background-color: #f4eebb;
+  background-image: none;
+}
+
+#searchbar {
+  position: relative;
+  width: 100%;
+  padding: 0;
+  padding-right: 70px;
+  margin-top: 7pt;
+}
+#searchbar button[type=submit] {
+  position: absolute;
+  padding: 0;
+  right: 40px;
+}
+#searchbar button[type=submit]:not(.loading)::after {
+  content: "";
+}
+
+.query.panel {
+  padding-right: 70px;
+}
+
+.query.button-group.button-panel {
+  display: block;
+  width: auto;
+  text-align: right;
+  vertical-align: top;
+  line-height: 1.3em;
+}
+.query.button-group.button-panel > span {
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Virtual Collection Builder
+ */
+.vc {
+  margin-top: 4pt;
+  /**
+   * All document rules
+   */
+  /**
+   * All operators
+   */
+}
+.vc .builder {
+  position: initial;
+}
+.vc .docGroup {
+  position: relative;
+  display: inline-block;
+  margin-left: 4em;
+  padding: 4pt 2pt 4pt 0pt;
+  border-radius: 12px;
+  border-style: solid;
+  border-width: 0 0.4em;
+  /**
+   * All operators on groups
+   */
+}
+.vc .docGroup .docGroup {
+  display: block;
+}
+.vc .docGroup[data-operation] > .doc:first-child::before,
+.vc .docGroup[data-operation] > .docGroup:first-child::before {
+  content: none;
+}
+.vc .docGroup[data-operation] > .doc::before,
+.vc .docGroup[data-operation] > .docGroup::before {
+  position: absolute;
+  display: inline-block;
+  text-align: right;
+  width: 4em;
+  margin-left: -4.5em;
+  line-height: 1.5em;
+  border-top: 2px solid transparent;
+}
+.vc .docGroup[data-operation] > .docGroup::before {
+  margin-left: -4.9em;
+}
+.vc .docGroup[data-operation=or] > .doc::before,
+.vc .docGroup[data-operation=or] > .docGroup::before {
+  content: "or";
+}
+.vc .docGroup[data-operation=and] > .doc::before,
+.vc .docGroup[data-operation=and] > .docGroup::before {
+  content: "and";
+}
+.vc .docGroup > .operators {
+  position: absolute;
+  display: block;
+  vertical-align: middle;
+  top: 10px;
+  left: 3px;
+  margin-left: 100%;
+  padding: 0;
+}
+.vc .docGroup > .operators > span:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.vc .doc {
+  line-height: 170%;
+  padding-left: 4em;
+}
+.vc .doc > span + span,
+.vc .doc > span + div + span,
+.vc .doc > span + ul + span {
+  margin-left: 5pt;
+}
+.vc .doc > span.key, .vc .doc > span.value {
+  font-weight: bold;
+}
+.vc .doc > span.value[data-type=regex] {
+  font-style: italic;
+}
+.vc .doc > span.value[data-type=regex]::after, .vc .doc > span.value[data-type=regex]::before {
+  content: "/";
+}
+.vc .doc > span.key {
+  position: relative;
+}
+.vc .doc > span.key > ul {
+  margin: 0;
+  margin-left: 3.3em;
+}
+.vc .doc > span.key.fixed {
+  color: #9bad0b;
+}
+.vc .doc.unspecified > span,
+.vc .doc span.unspecified {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding: 0 4px;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-style: solid;
+  border-width: 2px;
+  border-radius: 6px;
+}
+.vc .doc > .operators {
+  display: inline-block;
+  margin-left: 10px;
+}
+.vc .rewritten .rewrite {
+  display: inline-block;
+  margin-left: 4pt;
+  color: #f6a800;
+}
+.vc .rewritten .rewrite::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  font-style: normal;
+  font-weight: normal;
+  content: "";
+  text-decoration: underline;
+}
+.vc .rewritten .rewrite > span {
+  display: none;
+}
+.vc .operators {
+  opacity: 0;
+  white-space: nowrap;
+  padding: 0;
+  font-size: 0;
+  line-height: 0;
+  text-align: center;
+}
+.vc > .docGroup {
+  margin-left: 0;
+}
+.vc .menu {
+  display: inline-block;
+}
+.vc .menu li[data-type=ref]::before,
+.vc span.key.ref::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  content: "";
+  padding-right: 4pt;
+  font-style: normal;
+  font-weight: normal;
+}
+.vc div.value {
+  position: absolute;
+  display: inline-block;
+  min-width: max-content;
+  z-index: 8000;
+  padding: 4pt;
+  margin-top: -6pt;
+  border-radius: 6px;
+  border-width: 2px;
+  border-style: solid;
+}
+.vc div.value input {
+  border-width: 0;
+  outline-width: 0;
+}
+.vc div.value > div {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  display: inline-block;
+  padding: 0 4pt;
+  margin-left: 4pt;
+  font-size: 80%;
+  font-style: italic;
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+}
+.vc div.value.regex > input {
+  font-style: italic;
+}
+.vc div.value.regex > div {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+
+/* Rules for vcs excluding fragments,
+ * i.e. includingy dynamic changes.
+ */
+.vc:not(.fragment) {
+  /**
+   * Rules for all docGroups
+   */
+}
+.vc:not(.fragment) .docGroup,
+.vc:not(.fragment) .doc {
+  color: #616263;
+}
+.vc:not(.fragment) .docGroup:hover {
+  background-color: rgba(255, 255, 255, 0.3);
+}
+.vc:not(.fragment) .doc > span:not(.fixed) {
+  cursor: pointer;
+}
+.vc:not(.fragment) .doc > span:not(.fixed):hover {
+  color: #f6a800;
+}
+.vc:not(.fragment) .doc.unspecified > span:hover,
+.vc:not(.fragment) span.unspecified:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+.vc:not(.fragment) .doc:hover > .operators, .vc:not(.fragment) .docGroup:hover > .operators {
+  opacity: 1;
+}
+.vc:not(.fragment) .docGroup[data-operation] > .doc::before,
+.vc:not(.fragment) .docGroup[data-operation] > .docGroup::before {
+  color: #f6a800;
+}
+.vc:not(.fragment) .docGroup[data-operation=or] {
+  border-color: #f6a800;
+}
+.vc:not(.fragment) div.value {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+}
+.vc:not(.fragment) div.value > div {
+  cursor: pointer;
+}
+.vc:not(.fragment) div.value > div:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+
+/**
+ * The z-index cascade for groups.
+ */
+.docGroup > .operators {
+  z-index: 30;
+}
+.docGroup .docGroup > .operators {
+  z-index: 31;
+}
+.docGroup .docGroup .docGroup > .operators {
+  z-index: 32;
+}
+.docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 33;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 34;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 35;
+}
+.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup > .operators {
+  z-index: 36;
+}
+
+.vc.fragment > div > div.docGroup {
+  margin-left: 0;
+}
+.vc.fragment .doc {
+  margin-right: 2em;
+}
+
+#collection {
+  line-height: 1em;
+  border-radius: 6px;
+}
+
+#vc-choose > span.rewritten::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  color: #f6a800;
+  padding: 0;
+  padding-left: 4px;
+  content: "";
+  text-decoration: underline;
+  font-style: normal;
+  font-weight: normal;
+}
+
+div#vc-view {
+  position: relative;
+}
+div#vc-view > div.vc {
+  display: none;
+  margin: 1.3em 0 0.5em 0;
+  border: 2px solid #636f07;
+  background-color: #fefefe;
+}
+div#vc-view > div.vc.active {
+  display: block;
+}
+div#vc-view > div.vc > div:first-child {
+  padding: 1.3em;
+}
+
+div.panel.vcinfo {
+  padding: 3pt 0pt 3pt 3pt;
+  background-color: #636f07;
+}
+div.panel.vcinfo div.button-group > span {
+  box-shadow: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Corpus statistic  
+ * Graying corpus statistic 
+ */
+div.stattable {
+  display: flex;
+  flex-direction: row;
+  margin-right: 20px;
+}
+
+div.stattable > dl {
+  margin-bottom: 4px;
+}
+div.stattable > dl > div {
+  border-color: #636f07;
+}
+div.stattable > dl > div > dt {
+  background-color: #8a9a0a;
+  width: 15em;
+  margin: 0;
+}
+div.stattable > dl > div > dt::after {
+  content: ":";
+}
+div.stattable > dl > div > dd {
+  background-color: #dce883;
+  color: #616263;
+}
+div.stattable.stdisabled dt,
+div.stattable.stdisabled dd {
+  background-color: #b9c46a;
+  color: #636f07;
+  text-shadow: none;
+}
+
+/* Corpus statistic reload button */
+div.reloadStatB > span.refresh {
+  margin-left: 2pt;
+}
+
+span.refresh::after {
+  vertical-align: sub;
+  content: "";
+}
+
+@media (min-width: 1680px) {
+  div.stattable dl.flex > div {
+    width: inherit;
+  }
+}
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the datepicker widget
+ * (used in the Virtual Collection creator)
+ * in Kalamar.
+ */
+div.datepicker {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  position: absolute;
+  display: inline-block;
+  z-index: 90;
+  font-size: 80%;
+  padding: 4pt;
+  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
+  border-width: 2px;
+  border-style: solid;
+  border-radius: 6px;
+}
+div.datepicker > div {
+  font-size: 120%;
+  width: 45%;
+}
+div.datepicker > div.month {
+  float: right;
+}
+div.datepicker > div > span {
+  display: inline-block;
+  overflow: hidden;
+  white-space: nowrap;
+}
+div.datepicker > div > span:first-child, div.datepicker > div > span:last-child {
+  width: 15%;
+}
+div.datepicker > div > span:first-child::before, div.datepicker > div > span:last-child::before {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  min-width: 14px;
+}
+div.datepicker > div > span:first-child::before {
+  content: "";
+}
+div.datepicker > div > span:last-child::before {
+  content: "";
+}
+div.datepicker > div > span:nth-child(2) {
+  display: inline-block;
+  cursor: pointer;
+  width: 70%;
+  text-align: center;
+  text-overflow: ellipsis;
+  border-radius: 6px;
+  border-style: solid;
+  border-width: 2px;
+  border-color: transparent;
+}
+div.datepicker > div > span:nth-child(2):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+div.datepicker > div > span:nth-child(2).selected {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+div.datepicker table {
+  border-collapse: separate;
+  border-spacing: 1px;
+}
+div.datepicker input {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  background-color: #fefefe;
+  width: 100%;
+  border-style: solid;
+  border-width: 1px;
+}
+div.datepicker td {
+  padding-left: 0.4em;
+  padding-right: 0.4em;
+  text-align: center;
+  border-style: solid;
+  border-width: 1px;
+}
+div.datepicker td:not(.out) {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  cursor: pointer;
+  background-color: #fefefe;
+}
+div.datepicker td:not(.out).today {
+  background-color: #bce4f7;
+  color: #009ee0;
+  text-shadow: none;
+}
+div.datepicker td:not(.out).selected {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+div.datepicker td:not(.out):hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+}
+div.datepicker td.out {
+  border-color: transparent;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Temporary hack for language chooser
+ * http://cssdeck.com/labs/styling-select-box-with-css3
+ * This is only active in no-js environment and before the
+ * javascript is loaded.
+ */
+#ql-field {
+  position: relative;
+  background-color: #9bad0b;
+  cursor: pointer;
+  margin: 0;
+  outline: none;
+  border: none;
+  display: inline-block;
+  color: white;
+  border-width: 0;
+  border-radius: 0;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+#ql-field:checked {
+  outline: none;
+}
+#ql-field > option {
+  padding: 0pt 2pt;
+  outline: none;
+}
+#ql-field:-moz-focusring {
+  color: transparent;
+  text-shadow: 0 0 0 white;
+}
+
+/**
+ * The pipe input field
+ */
+input.pipe {
+  display: none;
+}
+
+header {
+  -webkit-box-sizing: border-box;
+  /* Safari/Chrome, other WebKit */
+  -moz-box-sizing: border-box;
+  /* Firefox, other Gecko */
+  box-sizing: border-box;
+  /* Opera/IE 8+ */
+  position: relative;
+  background-color: #9bad0b;
+  padding: 8px 0 0 8px;
+  font-size: 10pt;
+  color: #fefefe;
+}
+header span.select {
+  display: inline-block;
+  cursor: pointer;
+  line-height: 1.8em;
+  border-width: 0;
+  border-bottom-width: 3px;
+  border-style: solid;
+  border-color: transparent;
+}
+header span.select > span {
+  font-weight: bold;
+}
+header span.select:hover {
+  color: #636f07;
+  border-color: #636f07;
+}
+header span.select::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  pointer-events: none;
+  text-align: center;
+  content: "";
+  padding-left: 4pt;
+  padding-right: 4pt;
+}
+header span.select.active {
+  border-color: #f6a800;
+}
+header span.select.active::after {
+  content: "";
+}
+header form {
+  position: relative;
+  display: block;
+  padding-left: 230px;
+  min-height: 2.7em;
+  margin: 0px;
+}
+header input {
+  outline: none;
+  font-size: 11pt;
+  border: 2px solid #fefefe;
+  padding: 2px;
+  margin: 0;
+}
+header .button {
+  color: #fefefe;
+  line-height: 2em;
+  margin-right: 40px;
+}
+header .button.right {
+  float: right;
+  display: inline-block;
+}
+header .button.top {
+  position: absolute;
+  display: block;
+  top: 0;
+  right: 0;
+  margin-right: 0;
+  width: 20px;
+  background-color: #636f07;
+  text-align: center;
+  height: 100%;
+  z-index: 20;
+}
+header .button.top > a:hover {
+  color: #fefefe;
+}
+header .button > a {
+  color: #fefefe;
+  cursor: pointer;
+  position: relative;
+  font-size: 120%;
+}
+header .button > a > span {
+  position: absolute;
+  margin-left: -3000px;
+}
+header .button > a::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+}
+header .button > a.tutorial::after {
+  content: "";
+}
+header .button > a.question::after {
+  content: "";
+}
+header .button > a.login::after {
+  content: "";
+}
+header .button > a.logout::after {
+  content: "";
+}
+
+.query.button-group > span {
+  border-top-width: 0;
+  border-color: white;
+}
+.query.button-group > span:first-child {
+  border-top-left-radius: 0;
+}
+.query.button-group > span:last-child {
+  border-top-right-radius: 0;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Rules for the footer section of Kalamar
+ */
+footer {
+  background-color: #616263;
+  position: absolute;
+  bottom: 0;
+  padding-bottom: 2px;
+  font-size: 70%;
+  width: 100%;
+  text-align: right;
+  display: flex;
+  align-items: center;
+  height: 100pt;
+}
+footer nav {
+  margin-left: 30px;
+  padding: 3pt 6pt;
+  text-align: left;
+  flex-grow: 2;
+}
+footer nav a {
+  white-space: nowrap;
+}
+footer div.logos {
+  font-size: 0;
+  flex-grow: 1;
+}
+footer a {
+  font-size: 10pt;
+}
+footer a:link {
+  color: #d9dadb;
+}
+footer a:visited {
+  color: #d9dadb;
+}
+footer a:hover {
+  color: #fefefe;
+}
+footer a[href^="http://"]::after, footer a[href^="https://"]::after {
+  content: none;
+}
+footer span.separator:after {
+  font-size: bold;
+  content: " | ";
+  color: #f6a800;
+}
+
+/**
+ * Logo table of the front page
+ */
+#logos {
+  margin-right: 40px;
+}
+
+/**
+ * Logo: Institute for German Language
+ */
+#ids-logo {
+  display: inline-block;
+  width: 21.0333333333em;
+  height: 6.6666666667em;
+  background-image: url("../img/ids-institute-for-the-german-language-white.svg");
+}
+
+aside.active ~ footer {
+  padding-left: 230px;
+  transition: all 0.3s ease-in-out;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+aside {
+  background-color: #636f07;
+  color: #fefefe;
+  width: 230px;
+  position: fixed;
+  display: block;
+  transition: all 0.3s ease-in-out;
+  outline: none;
+  font-size: 10pt;
+  z-index: 100;
+  top: 0;
+  left: 0;
+  height: 100%;
+  padding-top: 65px;
+  /**
+   * Navigation menu
+   */
+}
+aside > div {
+  overflow-y: auto;
+  overflow-x: visible;
+  max-height: 100%;
+}
+aside > * {
+  opacity: 1;
+}
+aside::after {
+  font-family: "FontAwesome";
+  white-space: nowrap;
+  position: absolute;
+  display: block;
+  opacity: 0;
+  cursor: pointer;
+  right: 0;
+  bottom: 0;
+  content: "";
+  font-size: 16pt;
+  width: 16pt;
+  height: 17pt;
+  padding: 6pt;
+  background-color: #636f07;
+  border-top-right-radius: 6px;
+  margin-right: -20px;
+}
+aside h2,
+aside legend {
+  line-height: 2em;
+  text-align: center;
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  font-weight: bold;
+}
+aside ul.nav {
+  list-style-type: none;
+  margin: 0;
+  font-size: 10pt;
+  text-indent: 0;
+  padding: 0;
+}
+aside ul.nav li {
+  padding: 0;
+}
+aside ul.nav li > a {
+  padding: 3pt 6pt;
+}
+aside ul.nav li > a:visited {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+}
+aside ul.nav li.folded.active ul {
+  display: block;
+}
+aside ul.nav li.folded ul {
+  display: none;
+}
+aside ul.nav li.active > a:link {
+  color: #636f07;
+  background-color: #9bad0b;
+  border-color: #636f07;
+  text-shadow: none;
+}
+aside ul.nav li > a:link {
+  color: #616263;
+  background-color: #d9dadb;
+  border-color: #87888a;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.5);
+  display: block;
+  border-right-width: 2px;
+  border-right-style: solid;
+}
+aside ul.nav li > a:link:hover {
+  color: #fefefe;
+  background-color: #f6a800;
+  border-color: #ff8000;
+  text-shadow: none;
+  transition: none;
+}
+aside ul.nav li h3 {
+  padding: 0;
+  margin: 0;
+  font-weight: bold;
+  font-size: 100%;
+}
+aside ul.nav li > a {
+  padding-left: 6pt;
+}
+aside ul.nav li li > a {
+  padding-left: 18pt;
+}
+aside ul.nav li li li > a {
+  padding-left: 36pt;
+}
+aside nav > ul > li > a {
+  font-weight: bold;
+}
+aside fieldset {
+  position: relative;
+  border-width: 0;
+}
+aside fieldset legend {
+  display: none;
+}
+aside fieldset input[type=text],
+aside fieldset input[type=password] {
+  outline: none;
+  font-size: 11pt;
+  border: 2px solid #fefefe;
+  padding: 2px;
+  margin: 0;
+  width: 100%;
+}
+aside fieldset > form > div {
+  position: relative;
+  width: 100%;
+  margin-top: 4px;
+  padding-right: 30px;
+}
+aside fieldset > p {
+  color: #9bad0b;
+}
+aside fieldset > p.announcement {
+  color: #fefefe;
+}
+aside fieldset > p.announcement > time {
+  display: block;
+  font-size: 70%;
+}
+aside fieldset hr {
+  border: none;
+  border-top: 2px solid #d9dadb;
+}
+aside fieldset ul {
+  display: block;
+  font-size: 80%;
+  text-align: right;
+  padding: 0;
+  margin-top: 0;
+}
+aside fieldset ul > li {
+  display: inline;
+}
+aside fieldset ul > li:first-child::after {
+  content: " | ";
+}
+aside fieldset button {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+aside fieldset button::after {
+  content: "";
+}
+aside.off, aside:not(:focus):not(.active) {
+  margin-left: -210px;
+}
+aside.off::after, aside:not(:focus):not(.active)::after {
+  opacity: 1;
+}
+aside.off > *, aside:not(:focus):not(.active) > * {
+  opacity: 0;
+  transition-property: opacity;
+  transition-duration: 0.3s;
+}
+aside.off::after {
+  display: none;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Optimization for no-js behaviour
+ */
+body.no-js #notifications {
+  display: block !important;
+}
+body.no-js aside {
+  position: relative;
+  display: block;
+  transition: none;
+  margin-left: 0 !important;
+  padding-top: 0;
+  width: 100%;
+  top: 0;
+}
+body.no-js aside > * {
+  opacity: 1 !important;
+  transition: none;
+}
+body.no-js aside form.login > input,
+body.no-js aside form.login > div {
+  width: auto;
+  margin-top: 0;
+}
+body.no-js aside form.login > input:first-of-type,
+body.no-js aside form.login > div:first-of-type {
+  float: left;
+  margin-right: 1em;
+}
+body.no-js aside form.login button {
+  height: 100%;
+}
+body.no-js aside p, body.no-js aside::after {
+  display: none;
+}
+body.no-js main div.intro {
+  margin-left: 8px !important;
+}
+
+#activate {
+  text-align: right;
+  background-color: #f6a800;
+  margin-top: 0;
+  padding: 8px;
+  padding-right: 40px;
+  color: #fefefe;
+  font-size: 80%;
+}
+
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Font Awesome symbol table.
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Mixin for blind elements
+ * (e.g., spans in elements with an icon background)
+ */
+/**
+ * Mixin for basic color transition
+ */
+/**
+ * Mixing for basic text padding
+ */
+/**
+ * Mixing for icon fonts
+ */
+/**
+ * Mixing for correct box sizing (probably not necessary)
+ * DEPRECATED
+ */
+/**
+ * Some colors and shadow definitions
+ * for Kalamar,
+ */
+/**
+ * Official IDS colors
+ */
+/**
+ * Orange Colors
+ */
+/**
+ * Green Colors
+ */
+/**
+ * Blue Colors
+ */
+/**
+ * Grey Colors
+ */
+/**
+ * Red Colors (no IDS relation)
+ */
+/**
+ * Basic shadows
+ */
+/**
+ * KWIC colors
+ */
+/**
+ * Some color definitions and mixins for
+ * buttons and menus.
+ */
+/**
+ * Chooseable items (default)
+ */
+/**
+ * Chooseable items (mouse over)
+ */
+/**
+ * Chooseable items (not available)
+ */
+/**
+ * Chooseable items (active)
+ */
+/**
+ * Chooseable items (action: remove something)
+ */
+/*
+ * Defined lengths and sizes for the
+ * Kalamar layout.
+ */
+/**
+ * Margins
+ */
+/**
+ * Path information - relative to css!
+ */
+/**
+ * Media rules for different screen sizes.
+ * This will override some basic rules.
+ */
+@media all and (max-width: 42.5em) {
+  body,
+#search > ol,
+#search div.snippet > span,
+header,
+header input,
+div#resultinfo,
+#pagination > a {
+    font-size: 9pt;
+  }
+
+  header {
+    padding-right: 8px;
+  }
+
+  header form {
+    padding-left: 0;
+    padding-top: 33px;
+  }
+
+  .vc {
+    font-size: 9pt;
+  }
+  .vc .builder .doc {
+    padding-left: 3em;
+  }
+  .vc .builder * .docGroup {
+    margin-left: 3em;
+  }
+  .vc .builder > .doc {
+    padding-left: 0.5em;
+  }
+  .vc .builder > .docGroup {
+    margin-left: 0.5em;
+  }
+
+  h1 {
+    margin-left: 0px;
+    width: 130px;
+    height: 40px;
+    background-size: 100%;
+    background-position: 50% 0;
+    z-index: 110;
+    position: absolute !important;
+  }
+
+  #searchbar {
+    padding-right: 30px;
+    margin-top: 0;
+  }
+  #searchbar input {
+    font-size: 9pt;
+  }
+  #searchbar button[type=submit] {
+    right: 0;
+  }
+
+  .level-1 {
+    padding-bottom: 2px;
+  }
+
+  .level-2 {
+    padding-bottom: 4px;
+  }
+
+  main {
+    margin-left: 4px;
+    margin-right: 4px;
+  }
+
+  header .button {
+    margin-right: 4px;
+  }
+  header .button.top {
+    height: auto;
+  }
+
+  #search ol > li:target > div > div.snippet, #search ol > li.active > div > div.snippet {
+    margin: 2px 2em 2px 4px;
+  }
+  #search ol > li div.meta {
+    display: none;
+  }
+
+  div.matchinfo {
+    font-size: 9pt;
+  }
+
+  div.matchtable tr > * {
+    padding: 1pt 3pt;
+  }
+
+  div.matchtree h6 {
+    display: block;
+    float: none;
+  }
+  div.matchtree > div {
+    margin-left: 2px;
+  }
+
+  #logos {
+    margin-left: 0;
+    margin-right: 0;
+  }
+  #logos > div {
+    border-top-width: 14px;
+    padding-right: 0;
+  }
+  #logos > div .logo > * {
+    background-size: 60%;
+    background-position: 0 0;
+  }
+
+  div.intro {
+    width: 100%;
+  }
+
+  body.embedded aside > div {
+    top: 0;
+    transform: translateY(0);
+  }
+
+  aside:not(:focus):not(.active) {
+    margin-left: -230px;
+  }
+  aside:not(:focus):not(.active)::after {
+    font-size: 12pt;
+    height: 11pt;
+    text-align: right;
+    padding-right: 3pt;
+    padding-top: 2pt;
+  }
+  aside ul {
+    font-size: 9pt;
+    line-height: 1em;
+  }
+  aside.active ~ main div.intro, aside.active ~ main.page {
+    margin-left: 4px !important;
+  }
+  aside.active {
+    position: relative;
+    display: block;
+    padding-top: 0;
+    width: 100%;
+    top: 0;
+    border-width: 0;
+  }
+  aside.active fieldset input {
+    font-size: 9pt;
+  }
+  aside.active::after {
+    display: none;
+  }
+  aside.active p, aside.active hr {
+    display: none;
+  }
+
+  #tutorial {
+    border-radius: 0;
+    border-width: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    top: 0;
+    padding: 0;
+  }
+  #tutorial iframe {
+    border-radius: 0;
+  }
+  #tutorial > ul.action.right {
+    height: 1.5em;
+    right: 20px;
+    border-bottom-left-radius: 5px;
+    border-bottom-right-radius: 5px;
+  }
+
+  main.page {
+    margin-right: 20px;
+  }
+
+  footer {
+    padding-left: 0 !important;
+  }
+}
+@media print {
+  body, html, select, g > text {
+    color: black;
+  }
+
+  header, aside {
+    display: none;
+  }
+
+  main.page {
+    margin: 1em;
+  }
+
+  a.embedded-link {
+    color: black;
+    text-decoration: underline;
+  }
+
+  pre.query.tutorial {
+    background-color: white;
+    color: black;
+    margin-left: 1em;
+    margin-right: 1em;
+  }
+
+  blockquote.warning {
+    background-color: grey;
+    color: white;
+    border-left-color: black;
+    border-left-width: 1em;
+  }
+}
+
+/*# sourceMappingURL=kalamar-0.41.5.css.map */
\ No newline at end of file
diff --git a/public/css/kalamar-0.41.5.css.map b/public/css/kalamar-0.41.5.css.map
new file mode 100644
index 0000000..9231cf1
--- /dev/null
+++ b/public/css/kalamar-0.41.5.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/kalamar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/colors.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/icons.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/mixins.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/choose.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/lengths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/paths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fonts.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/flextable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fragment.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/load.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/form.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/view.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/menu.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/banner.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/base.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/highlight.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/kwic.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/logos.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/tree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/metatable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/matchinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/pagination.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/query.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/resultinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/tutorial.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/koralquery.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-core.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-default.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/intro.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/buttongroup.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/panel.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs-ids.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/oauth.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/news.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/plugin.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/main.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/hint.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/searchbar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/vc.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/statistics.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/datepicker.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/querylanguage.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/pipe.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/header.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/footer/footer.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/sidebar/sidebar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/no-js.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/media.scss"],"names":[],"mappings":"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A;AAAA;AAAA;AAOA;AAAA;AAAA;AGzEA;AAAA;AAAA;AAAA;AAYA;AAAA;AAAA;AAWA;AAAA;AAAA;AAWA;AAAA;AAAA;AAUA;AAAA;AAAA;AAWA;AAAA;AAAA;ACzDA;AAAA;AAAA;AAAA;AAcA;AAAA;AAAA;ACdA;AAAA;AAAA;AuBAA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;AAAgE;;;AAElE;EACE;EACA;EACA;EACA;EACA;AAAiE;;;AAEnE;EACE;EACA;EACA;EACA;EACA;AAAiE;;;AAEnE;EACE;EAAiB;EACjB;EAAQ;EAAU;EAAW;EAC7B;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EAAiB;EACjB;EAAW;EACX;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AACA;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;AAAA;IAEE;IACA;IACA;IACA;;;EAEF;IACE;IACA;;;ACtIJ;AAAA;AAAA;AAGA;AAAA;EAEE;;;AAEF;EACE;EACA;AAAyB;EACzB;EACA;EACA;EACA;AAAsC;EACtC;AAAmC;EACnC;AAA8B;;;AAEhC;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;AAAA;AAAA;EAGE;EACA;;;AAEF;AAAA;AAAA;EAGE;EACA;;;AAGF;EACE;EAEA;EACA;EACA;EACA;;;AAGF;AAAA;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EACA;EACA;EACA;EACG;EACC;EACC;EACG;;;AAGV;AAAA;AAAA;EAGE;EACG;EACC;EACC;EACG;;;AAGV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAqB;EACrB;AAAoE;EACpE;AAAiH;EACjH;AAAoE;EACpE;AAAoE;EACpE;AAAoE;EACpE;AAA2E;EAC3E;EACA;EACA;EACA;EACA;EACA;AAAsH;EACtH;AAA6F;EAC7F;;;AAGF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACG;EACC;EACC;EACG;;;AAGV;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;AAAkC;EAClC;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACK;;;AAGL;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;A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","file":"kalamar-0.41.5.css"}
\ No newline at end of file
diff --git a/public/css/kalamar-0.43.0.css b/public/css/kalamar-0.43.0.css
new file mode 100644
index 0000000..2ee865c
--- /dev/null
+++ b/public/css/kalamar-0.43.0.css
@@ -0,0 +1,3 @@
+﻿@font-face{font-family:"FontAwesome";src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media(min-width: 640px){dl.flex>div{width:50%}}@media(min-width: 800px){dl.flex>div{width:33.3333333333%}}@media(min-width: 1200px){dl.flex>div{width:25%}}@media(min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:"FontAwesome";content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:":";color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:"*"}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:"FontAwesome";white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.non-item:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.non-item:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}ul.menu>li,ul.menu>span.non-item:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu span.non-item.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu span.non-item:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu span.non-item{border-radius:6px;border-width:2px !important}ul.menu span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.entry:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.pref:not(:empty)~span.entry:not(:empty){bottom:-27px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:""}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}ul.containermenu>ul.menu.container{bottom:0;transform:translateY(100%);margin-bottom:-0.3em}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}input.show-pwd{padding-right:2em}a.show-pwd::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:-1.5em;margin-top:.6em;font-size:130%}a.show-pwd.hide::after{content:""}a.copy-to-clipboard::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:.4em;margin-top:.6em;font-size:130%}.button-group{font-size:0}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a,.button-group.operators>span,.button-group.operators input[type=submit],.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:hover,.button-group.button-panel input[type=submit]:hover,.button-group.button-panel a:hover,.button-group.operators>span:hover,.button-group.operators input[type=submit]:hover,.button-group.operators a:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}.button-group.button-panel>span:first-child,.button-group.button-panel input[type=submit]:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators input[type=submit]:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel input[type=submit]:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators input[type=submit]:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a{margin-top:0;width:auto;min-width:auto}.button-group.button-panel>span>span.check,.button-group.button-panel input[type=submit]>span.check,.button-group.button-panel a>span.check{font-family:"FontAwesome";white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel input[type=submit]>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel input[type=submit]>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel input[type=submit]>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:"FontAwesome";white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana,tahoma,arial,Helvetica,sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100vh}body{position:relative;min-height:100vh;font-size:12pt;margin:0;padding:0}a:visited{color:#e55d00}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color .3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}a[onclick$="return PArok(this,false)"]{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$="return PArok(this,false)"]>span:nth-child(1n+2){display:none}a[onclick$="return PArok(this,false)"]>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}.hljs{display:block;padding:.5em}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}#search{position:relative;margin-bottom:30px;overflow:visible}#search div.matchinfo{display:none}#search>ol{overflow-x:hidden;overflow-y:visible;width:auto;text-indent:0;list-style-type:none;margin:0;padding:0;border:1px solid #87888a;font-size:10pt}#search>ol>li{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;align-content:stretch;border-style:solid;border-color:#f6a800;border-width:0}#search>ol>li .button-group.button-view{display:none}#search>ol>li:nth-of-type(even) div.match-main div.match-wrap{background-color:#fefefe}#search>ol>li p.ref{display:none}#search>ol>li div.meta,#search>ol>li div.match-main{position:relative;cursor:pointer}#search>ol>li div.match-main{display:block;flex:7 0;z-index:4;overflow:hidden}#search>ol>li div.match-main>div.match-wrap{width:99999%;margin-left:-49999.5%;background-color:#d9dadb;overflow-x:hidden;overflow-y:visible;white-space:normal}#search>ol>li div.meta{flex:1 0;min-width:12em;max-width:15em;text-align:left;width:2px;z-index:5;overflow-y:hidden;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#949597;color:#fefefe;font-size:75%;padding:0 5pt;border-color:#616263;border-style:solid;border-width:2px 1px 0 0}#search>ol>li div.meta:before{content:" ";display:inline-block;height:100%;vertical-align:middle}#search>ol>li div.meta:empty{border-width:0 1px 0 0}#search>ol>li div.meta.flip{background-color:#b3b4b5}#search>ol>li:first-of-type div.meta{border-top-width:0}#search>ol>li:last-of-type div.meta{border-bottom-width:0}div.snippet{text-overflow:ellipsis;text-indent:0;text-shadow:1px 1px rgba(255,255,255,.5);font-size:0;white-space:nowrap !important}div.snippet>span,div.snippet mark{padding:5pt 0 6pt 0;font-size:10pt}div.snippet>mark,div.snippet>span.match{font-weight:bold;color:#333;text-shadow:none;padding-left:4pt;padding-right:2pt}div.snippet>span.match>span.cutted::after{font-family:"FontAwesome";white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.snippet.startMore:before,div.snippet.endMore:after{content:"…";padding-left:2pt;padding-right:2pt}div.snippet div.flag{position:absolute;height:100%;top:0;left:0;width:11px;background-color:#f6a800;border-right:1px solid #e55d00}body.no-js #search>ol>li:active,#search>ol>li.active,#search>ol>li:target{position:relative;display:block;background-color:#f6a800;text-align:left;border-width:2px;white-space:normal;height:auto;width:auto;overflow:hidden}body.no-js #search>ol>li:active div.matchinfo,#search>ol>li.active div.matchinfo,#search>ol>li:target div.matchinfo{display:block}body.no-js #search>ol>li:active+li.active,#search>ol>li.active+li.active,#search>ol>li:target+li.active{border-top:2px solid #d9dadb;padding-top:6px}body.no-js #search>ol>li:active+li.active .button-group.button-view,#search>ol>li.active+li.active .button-group.button-view,#search>ol>li:target+li.active .button-group.button-view{padding-top:6px}body.no-js #search>ol>li:active .snippet,#search>ol>li.active .snippet,#search>ol>li:target .snippet{white-space:normal !important;padding:2pt 0 5pt 5pt;background-color:#f4eebb;margin-top:0;margin-right:20px;margin-bottom:0;margin-left:0}body.no-js #search>ol>li:active .snippet span,#search>ol>li.active .snippet span,#search>ol>li:target .snippet span{display:inline !important}body.no-js #search>ol>li:active .snippet>*,#search>ol>li.active .snippet>*,#search>ol>li:target .snippet>*{background-color:transparent}body.no-js #search>ol>li:active .snippet div.flag,#search>ol>li.active .snippet div.flag,#search>ol>li:target .snippet div.flag{display:none}body.no-js #search>ol>li:active .snippet>span,#search>ol>li.active .snippet>span,#search>ol>li:target .snippet>span{line-height:1.4em;width:auto}body.no-js #search>ol>li:active .snippet>span.context-left,#search>ol>li.active .snippet>span.context-left,#search>ol>li:target .snippet>span.context-left{margin-left:0;display:inline;overflow:visible;text-align:left;width:auto}body.no-js #search>ol>li:active .button-group.button-view,#search>ol>li.active .button-group.button-view,#search>ol>li:target .button-group.button-view{display:block}body.no-js #search>ol>li:active div.match-main,#search>ol>li.active div.match-main,#search>ol>li:target div.match-main{display:block;width:100%}body.no-js #search>ol>li:active div.match-main div.match-wrap,#search>ol>li.active div.match-main div.match-wrap,#search>ol>li:target div.match-main div.match-wrap{cursor:default;min-height:20pt;background-color:#f6a800;width:100%;margin-left:0;overflow-x:visible;white-space:normal}body.no-js #search>ol>li:active div.meta,#search>ol>li.active div.meta,#search>ol>li:target div.meta{display:none}body.no-js #search>ol>li:active p.ref,#search>ol>li.active p.ref,#search>ol>li:target p.ref{display:block;color:#fefefe;padding:3pt 10pt 3pt 3pt;padding-right:20px;margin:0pt;width:100%;bottom:0;z-index:30}body.no-js #search>ol>li:active p.ref>span.sigle,#search>ol>li.active p.ref>span.sigle,#search>ol>li:target p.ref>span.sigle{font-size:75%;vertical-align:top;color:#f4eebb;float:right}#search ol span.context-left{display:inline-block;width:50.01%;text-align:right}#search ol.align-right{text-align:right}#search ol.align-right div.match-main span.context-right{display:inline-block;width:49.915%;text-align:left}#search ol.align-center div.match-main{width:100% !important}#search ol.align-center div.match-main>.match-wrap{position:relative;margin-left:0}#search ol.align-center li:not(.active) div.snippet{white-space:normal;text-align:center;width:100000pt;margin-left:-50000pt}#search ol.align-center li:not(.active) div.snippet span.context-left{display:inline-block;text-align:right;width:40000pt;margin-left:70vw}#search ol.align-center li:not(.active) div.snippet span.context-right{display:inline-block;text-align:left;width:40000pt}#search ol span.context-left:empty::after,#search ol span.context-right:empty::after{content:" ";display:inline-block}mark{background-color:inherit;color:inherit}mark>mark,em,.level-0{border-bottom-width:2px;border-bottom-style:solid;padding-bottom:0px !important;font-style:normal}mark>mark>mark,em>em,.level-1{padding-bottom:3px !important}mark>mark>mark>mark,em>em>em,.level-2{padding-bottom:6px !important}#search>ol>li:not(.active) mark>mark>mark>mark,#search>ol>li:not(.active) em>em>em{line-height:180%}#search>ol>li.active mark>mark>mark>mark,#search>ol>li.active em>em>em{line-height:250%}.class-1{border-color:#c1002b}.class-2{border-color:#009ee0}.class-3{border-color:#f6a800}.class-4{border-color:#9bad0b}.logo::after{content:"" !important}.logo>*{background-repeat:no-repeat;background-size:90%;background-position:50% 50%}.logo>*>span{position:absolute;margin-left:-3000px}h1{position:absolute;margin:0;margin-left:10pt;left:0;top:0;width:7.8em;height:2.4em;z-index:105;background-size:78% !important;background-image:url("../img/korap-logo.svg")}aside.active~header h1{position:fixed}#overview{text-align:center;width:100%}div.matchtable>div{z-index:20;margin-left:179px;margin-right:20px;padding:0;overflow-x:auto;overflow-y:visible;width:auto}div.matchtable table{display:table;border-collapse:separate;border-spacing:0px}div.matchtable th{color:#fefefe}div.matchtable td,div.matchtable tbody th,div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted){cursor:pointer}div.matchtable td:empty{cursor:default}div.matchtable td:empty::after{content:" ";white-space:pre}div.matchtable td.matchkeyvalues{padding:0}div.matchtable td.matchkeyvalues>div{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}div.matchtable td.matchkeyvalues>div>span{color:#e55d00;text-align:right;padding-right:.5em}div.matchtable td.matchkeyvalues>div>span::after{content:":"}div.matchtable tr{outline:none}div.matchtable tr td.chosen,div.matchtable tr th.chosen,div.matchtable tr div.chosen{background-color:#9bad0b !important;color:#fefefe}div.matchtable tr>th:nth-of-type(1),div.matchtable tr>th:nth-of-type(2){border-top:2px solid #ff8000;width:88px;position:absolute;z-index:80;vertical-align:middle;left:0px}div.matchtable tr>th:nth-of-type(2){left:90px}div.matchtable tr>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;border:1px solid #f6a800}div.matchtable tr>td{background-color:#ffd080;white-space:nowrap;vertical-align:top;text-align:center}div.matchtable tr>td.mark{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td.mark{background-color:#ffd080}div.matchtable thead th{background-color:#ff8000;border-top-width:0px !important;text-align:center}div.matchtable thead th:nth-of-type(1),div.matchtable thead th:nth-of-type(2){text-align:left}div.matchtable thead th.mark{background-color:#e55d00}div.matchtable thead th.cutted{background-color:#f4eebb}div.matchtable thead th.cutted::after{font-family:"FontAwesome";white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.matchtable tbody>tr:nth-of-type(1)>th{border-top-color:transparent}path.edge{stroke:#ff8000;stroke-width:2px;fill:none}g.arc.infocus>path.edge{stroke:#636f07}marker#arr{overflow:visible}marker#arr path{stroke:#e55d00;fill:#e55d00;fill-opacity:1;stroke-width:2}path.anchor{stroke:#e55d00;stroke-width:3;stroke-linecap:round;z-index:20}g.root rect.empty{stroke:#ff8000;fill:#ff8000;stroke-width:2px}g.middle rect,g.label rect{stroke:#ff8000;stroke-width:2px;fill:#ffd080}g.label.infocus rect{stroke:#636f07;fill:#dce883}g.middle.mark rect{fill:#ff8000}g.middle.mark>text{fill:#f4eebb}g.middle.mark>text>tspan{stroke:#f4eebb}g.leaf.mark text>tspan{font-weight:bold}g.leaf>rect{display:none}g>text>tspan{text-anchor:middle;font-size:9pt}g.leaf>text>tspan,text.leaf>tspan{font-size:10pt;overflow:visible}div.matchtree{overflow-x:hidden;overflow-y:visible;padding:0;margin-top:1pt}div.matchtree h6{display:inline;font-size:inherit;color:#fefefe;margin:0;padding:0 !important;float:left}div.matchtree h6>span{border-top:2px solid #ff8000;width:88px;text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;display:inline-block !important;margin:0}div.matchtree h6>span:nth-of-type(2){margin-left:2px}div.matchtree>div{position:unset;z-index:4;overflow-x:auto;margin:2px;margin-left:180px;margin-right:20px;background-color:#f4eebb}div.metatable>dl{margin-right:20px;margin-top:2px}div.metatable>dl>div{border-color:#f6a800}div.metatable>dl>div>*{padding:.2em}div.metatable>dl>div>dt{background:#ff8000;color:#fefefe;width:12.5em}div.metatable>dl>div>dd{background-color:#f4eebb;cursor:pointer}div.metatable>dl>div>dd.metakeyvalues{padding:0}div.metatable>dl>div>dd.metakeyvalues>div{padding:.2em}div.metatable>dl>div>dd.metakeyvalues>div::before{content:"• ";color:#f6a800}div.metatable>dl>div>dd.chosen,div.metatable>dl>div>dd>div.chosen{background-color:#9bad0b !important;color:#fefefe}div.metatable>dl>div>dd[data-type="type:store"],div.metatable>dl>div>dd[data-type="type:attachement"]{background-color:#ffd080;cursor:default}div.metatable>dl>div>dd[data-type="type:store"] a,div.metatable>dl>div>dd[data-type="type:attachement"] a{color:inherit}div.metatable>dl.cbm-disabled>div>dd{cursor:default !important}div.matchinfo{position:relative;width:100%;padding-top:2px;height:auto;font-size:10pt;text-align:left}div.matchinfo:empty{display:none !important}div.matchinfo .view+.view{margin-top:8px !important}div.metatable,div.matchtable,div.matchtree{position:relative;background-color:#f6a800}div.button-group.button-panel.button-matchinfo{display:inline-block;margin-right:.5em}div.button-group.button-panel.button-matchinfo>span{position:relative;box-shadow:none}#pagination{position:fixed;font-size:0;right:10px;bottom:20px;z-index:35;padding:0;height:auto;line-height:0}#pagination>*{font-size:10pt;line-height:2em}#pagination>*:not(:link):not([rel=self]){color:#87888a}#pagination>*.ellipsis>span,#pagination>*[rel=prev]>span,#pagination>*[rel=next]>span{position:absolute;margin-left:-3000px}#pagination>*.ellipsis::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}#pagination>*[rel=self]{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;border-left-width:2px;border-right-width:2px;border-left-style:solid;border-right-style:solid}#pagination>*[rel=prev]::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}#pagination>*[rel=next]::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}pre.query{overflow-x:hidden;padding:.5em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;border-width:2px;border-style:solid;border-radius:6px;box-shadow:2px 2px 2px rgba(0,0,0,.2)}pre.query:not(.unsupported){cursor:pointer}pre.query:not(.unsupported):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query:not(.unsupported):active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}pre.query.unsupported span{vertical-align:super;color:#009ee0;font-size:90%;font-weight:bold;cursor:help}#resultinfo{clear:both;text-align:right;line-height:1.5em;min-height:1.5em;margin-top:.4em;font-size:10pt}#resultinfo p.found{display:inline;padding:0;margin:0;text-align:right}#resultinfo.found{position:relative;margin-bottom:0px}#resultinfo.found .button-group>span{margin-bottom:0;border-bottom-width:0;box-shadow:none}#resultinfo.found .button-group>span:first-child{border-bottom-left-radius:0}#resultinfo.found .button-group>span:last-child{border-bottom-right-radius:0}div.result.panel .view{border:1px solid #87888a;background-color:#f6a800}.result.button-group.button-panel{display:inline-block;width:auto;vertical-align:bottom;line-height:1.5em}.result.button-group.button-panel>span{line-height:1.5em;border-width:1px 0}.result.button-group.button-panel>span:first-child{border-left-width:1px}.result.button-group.button-panel>span:last-child{border-right-width:1px}#total-results{color:#9bad0b;font-weight:bold}.no-results{margin:0 auto;text-align:center}.no-results code{font-weight:bold}.button-icon.align.left::after{content:""}.button-icon.align.right::after{content:""}.button-icon.align.center::after{content:""}.button-icon.show-kq::after{content:""}#tutorial{position:fixed;z-index:9999;top:5%;bottom:5%;left:2%;right:2%;padding-right:20px;background-color:#fefefe;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-width:4px;border-color:#616263;border-style:solid;border-radius:6px}#tutorial .button-group.button-view{background-color:#87888a;display:block;height:100%}#tutorial iframe{border-width:0;width:100%;min-height:100.1%;background-image:url("../img/korap-bg.svg");background-repeat:no-repeat;background-position:center center;background-size:15%}p.bibentry{font-size:80%;margin-left:3em;margin-bottom:3em;text-indent:-1.5em}p.bibentry cite{font-weight:bold}body.embedded{background-color:#fefefe}body.embedded aside{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding-top:0;background-color:#87888a}body.embedded aside>div{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}main.tutorial a.embedded-link::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}#koralquery{white-space:pre}#koralquery>div{background-color:#fefefe;overflow-x:auto;font-size:85%;margin-top:2pt;margin-right:20px;margin-bottom:2pt;margin-left:2pt}.alertify,.alertify-show,.alertify-log{-webkit-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-ms-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)}.alertify-hide{-webkit-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-log-hide{-webkit-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-cover{position:fixed;z-index:99999;top:0;right:0;bottom:0;left:0;background-color:#fff;filter:opacity(0);opacity:0}.alertify-cover-hidden{display:none}.alertify{position:fixed;z-index:99999;top:50px;left:50%;width:550px;margin-left:-275px;opacity:1}.alertify-hidden{-webkit-transform:translate(0, -150px);-moz-transform:translate(0, -150px);-ms-transform:translate(0, -150px);-o-transform:translate(0, -150px);transform:translate(0, -150px);opacity:0;display:none}:root *>.alertify-hidden{display:block;visibility:hidden}.alertify-logs{position:fixed;z-index:5000;bottom:10px;right:10px;width:300px}.alertify-logs-hidden{display:none}.alertify-log{display:block;margin-top:10px;position:relative;right:-300px;opacity:0}.alertify-log-show{right:0;opacity:1}.alertify-log-hide{-webkit-transform:translate(300px, 0);-moz-transform:translate(300px, 0);-ms-transform:translate(300px, 0);-o-transform:translate(300px, 0);transform:translate(300px, 0);opacity:0}.alertify-dialog{padding:25px}.alertify-resetFocus{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.alertify-inner{text-align:center}.alertify-text{margin-bottom:15px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:100%}.alertify-button,.alertify-button:hover,.alertify-button:active,.alertify-button:visited{background:none;text-decoration:none;border:none;line-height:1.5;font-size:100%;display:inline-block;cursor:pointer;margin-left:5px}@media only screen and (max-width: 680px){.alertify,.alertify-logs{width:90%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.alertify{left:5%;margin:0}}.alertify,.alertify-log{font-family:sans-serif}.alertify{background:#fff;border:10px solid #333;border:10px solid rgba(0,0,0,.7);border-radius:8px;box-shadow:0 3px 3px rgba(0,0,0,.3);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box}.alertify-text{border:1px solid #ccc;padding:10px;border-radius:4px}.alertify-button{border-radius:4px;color:#fff;font-weight:bold;padding:6px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,.5);box-shadow:inset 0 1px 0 0 rgba(255,255,255,.5);background-image:-webkit-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-ms-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-o-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0))}.alertify-button:hover,.alertify-button:focus{outline:none;background-image:-webkit-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-moz-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-ms-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-o-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0))}.alertify-button:focus{box-shadow:0 0 15px #2b72d5}.alertify-button:active{position:relative;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.alertify-button-cancel,.alertify-button-cancel:hover,.alertify-button-cancel:focus{background-color:#fe1a00;border:1px solid #d83526}.alertify-button-ok,.alertify-button-ok:hover,.alertify-button-ok:focus{background-color:#5cb811;border:1px solid #3b7808}.alertify-log{background:#1f1f1f;background:#000;padding:15px;border-radius:4px;color:#fff}.alertify-log-success{background:#5cb811;background:#5cb811}article.alertify-log-warn{background-color:#f6a800}article.alertify-log-warn code.src{color:#e55d00}article.alertify-log code.src{display:block;color:#000;font-size:70%}.alertify-log-error{background-color:#fe1a00}#notifications{display:none}div.notify{position:relative;margin:.5em auto;display:block;padding:.5em;border-radius:6px;max-width:30em;background-color:#fe1a00;color:#fefefe}div.notify.notify-success{background-color:#636f07}div.notify.notify-warn{background-color:#f29400}div.intro a:visited{color:#e55d00}div.intro div.announcement{background-color:#f4eebb;padding:8px;border:5px dashed #f6a800;border-radius:1em;width:90%;margin:auto}aside.active~main div.intro{margin-left:198px}div.panel{position:relative;width:100%;display:block}div.view{position:relative;padding-top:2px;display:block;width:100%}div.view:not(.show){display:none}.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);background:-webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(0, 0, 0, 0.4)), color-stop(100%, rgba(0, 0, 0, 0.9)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);background:radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.4) 0, rgba(0, 0, 0, 0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto !important;opacity:1 !important;-webkit-transform:none !important;-moz-transform:none !important;-ms-transform:none !important;-o-transform:none !important;transform:none !important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999 !important}.introjs-disableInteraction{z-index:99999999 !important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#fff;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999 !important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:bold;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff3019), color-stop(100%, #cf0404));background:-moz-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-ms-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:-o-linear-gradient(top, #ff3019 0%, #cf0404 100%);background:linear-gradient(to bottom, #ff3019 0%, #cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid transparent;content:"";position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:none;background-color:#ececec;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f4f4f4), to(#ececec));background-image:-moz-linear-gradient(#f4f4f4, #ececec);background-image:-o-linear-gradient(#f4f4f4, #ececec);background-image:linear-gradient(#f4f4f4, #ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0px 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ececec), to(#f4f4f4));background-image:-moz-linear-gradient(#ececec, #f4f4f4);background-image:-o-linear-gradient(#ececec, #f4f4f4);background-image:linear-gradient(#ececec, #f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(0.1);opacity:.3}75%{-moz-transform:scale(0.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(0.1);opacity:.3}75%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:0}}.introjs-helperLayer{background-color:transparent}.introjs-tooltip.gTstartSearch{max-width:500px}.tgreeting{font-weight:bold;color:#e55d00}.pfirstStep{width:500px}.introjs-donebutton{float:right;margin-left:5px}.introjs-skipbutton{color:#333}ul.client-list{padding-left:1.5em}ul.client-list li.client{list-style-type:none}ul.client-list li.client span.client-name::before{margin-left:-1.5em}ul.client-list li.client span.client-desc{font-size:70%;display:block}ul.client-list br{display:block;margin:3pt 0}span.client-name{font-weight:bold}span.client-name::before{font-family:"FontAwesome";white-space:nowrap;display:inline-block;width:1.5em;content:"";color:#009ee0;font-size:100%}li.token{list-style-type:none}label[for=token]{font-weight:bold}label[for=token]::before{font-family:"FontAwesome";white-space:nowrap;font-feature-settings:"ss01" on;margin-left:-1.5em;display:inline-block;width:1.5em;content:"";color:#009ee0 !important;font-size:100%;font-weight:900}section#news{background-color:#e3e8a3;mix-blend-mode:soft-light;padding:1em;padding-right:2em;border-radius:6px;border-left:5px solid #636f07}section#news dt{float:left;clear:left;width:15ex;text-align:right;font-weight:bold}section#news dd.maintenance>h4::after{font-family:"FontAwesome";white-space:nowrap;color:#c1002b;content:" "}section#news dd{margin:0 1ex 0 16ex;padding:0 0 .5em 1em}section#news dd>p{max-width:80ex;margin-block-start:0ex}section#news dd>h4{margin-block-start:0ex;margin-block-end:.33ex}@media all and (max-width: 42.5em){section#news dt{text-align:left;float:none;width:auto;padding-bottom:.2em}section#news dd{margin-left:1em}}div.view.widget{padding-right:20px}div.view.widget>iframe{margin:0;box-sizing:border-box;padding:0;width:100%;overflow-x:auto}div.panel.result>div>div.widget>iframe{background-color:#fefefe}main{padding-bottom:115pt;margin-left:40px;margin-right:20px}main.embedded{margin-left:14px;margin-right:14px}main p{text-align:justify;hyphens:auto}main h2#page-top{margin-top:0;padding-top:1em}main.page{margin-left:245px}main.page p code,main.page li code,main.page dd code,main.page dt code{background-color:#d9dadb;color:#87888a;padding:0 .5em;border-radius:6px}main p.hint{margin:0 auto;text-align:center}ul.menu.hint{display:inline-block;white-space:normal;text-align:left;max-width:23em !important;top:0}ul.menu.hint>li:first-of-type{border-top-width:1px;border-top-left-radius:0;border-top-right-radius:0}div.alert.hint{position:absolute;background-color:#fe1a00;color:#fefefe;padding:3pt 6pt;margin-top:8px;box-shadow:2px 2px 2px rgba(0,0,0,.2);width:auto;min-width:10em;max-width:23em !important;transition:opacity .2s ease 0s;border-radius:6px;border-top-left-radius:0}div.alert.hint::before{position:absolute;content:"";display:block;top:-12px;left:0;width:0;white-space:normal;border-width:0 8px 12px 0;border-style:solid;border-color:#fe1a00 transparent}.hint.mirror{position:absolute;display:block;left:0;top:0;z-index:90;white-space:pre-wrap;height:0}.hint.mirror>span{opacity:0;white-space:pre-wrap;overflow:hidden}.hint.mirror>div{position:absolute;display:block;cursor:pointer;transition:left .2s ease 0s;top:0;left:0;text-align:left;padding:0;border-top:5px solid #f6a800;height:10px;width:1.2em}.hint.mirror>div:hover:not(.active){border-top:10px solid #f6a800}.hint.mirror>div.active{border-top-width:0;height:0;width:23em}#q-field{display:block;margin-bottom:3px;width:100%;margin:0}#q-field::-webkit-search-cancel-button{display:none}#q-field.loading{background-color:#f4eebb;background-image:none}#searchbar{position:relative;width:100%;padding:0;padding-right:70px;margin-top:7pt}#searchbar button[type=submit]{position:absolute;padding:0;right:40px}#searchbar button[type=submit]:not(.loading)::after{content:""}.query.panel{padding-right:70px}.query.button-group.button-panel{display:block;width:auto;text-align:right;vertical-align:top;line-height:1.3em}.query.button-group.button-panel>span{box-shadow:none}.vc{margin-top:4pt}.vc .builder{position:initial}.vc .docGroup{position:relative;display:inline-block;margin-left:4em;padding:4pt 2pt 4pt 0pt;border-radius:12px;border-style:solid;border-width:0 .4em}.vc .docGroup .docGroup{display:block}.vc .docGroup[data-operation]>.doc:first-child::before,.vc .docGroup[data-operation]>.docGroup:first-child::before{content:none}.vc .docGroup[data-operation]>.doc::before,.vc .docGroup[data-operation]>.docGroup::before{position:absolute;display:inline-block;text-align:right;width:4em;margin-left:-4.5em;line-height:1.5em;border-top:2px solid transparent}.vc .docGroup[data-operation]>.docGroup::before{margin-left:-4.9em}.vc .docGroup[data-operation=or]>.doc::before,.vc .docGroup[data-operation=or]>.docGroup::before{content:"or"}.vc .docGroup[data-operation=and]>.doc::before,.vc .docGroup[data-operation=and]>.docGroup::before{content:"and"}.vc .docGroup>.operators{position:absolute;display:block;vertical-align:middle;top:10px;left:3px;margin-left:100%;padding:0}.vc .docGroup>.operators>span:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.vc .doc{line-height:170%;padding-left:4em}.vc .doc>span+span,.vc .doc>span+div+span,.vc .doc>span+ul+span{margin-left:5pt}.vc .doc>span.key,.vc .doc>span.value{font-weight:bold}.vc .doc>span.value[data-type=regex]{font-style:italic}.vc .doc>span.value[data-type=regex]::after,.vc .doc>span.value[data-type=regex]::before{content:"/"}.vc .doc>span.key{position:relative}.vc .doc>span.key>ul{margin:0;margin-left:3.3em}.vc .doc>span.key.fixed{color:#9bad0b}.vc .doc.unspecified>span,.vc .doc span.unspecified{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding:0 4px;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-style:solid;border-width:2px;border-radius:6px}.vc .doc>.operators{display:inline-block;margin-left:10px}.vc .rewritten .rewrite{display:inline-block;margin-left:4pt;color:#f6a800}.vc .rewritten .rewrite::after{font-family:"FontAwesome";white-space:nowrap;font-style:normal;font-weight:normal;content:"";text-decoration:underline}.vc .rewritten .rewrite>span{display:none}.vc .operators{opacity:0;white-space:nowrap;padding:0;font-size:0;line-height:0;text-align:center}.vc>.docGroup{margin-left:0}.vc .menu{display:inline-block}.vc .menu li[data-type=ref]::before,.vc span.key.ref::before{font-family:"FontAwesome";white-space:nowrap;content:"";padding-right:4pt;font-style:normal;font-weight:normal}.vc div.value{position:absolute;display:inline-block;min-width:max-content;z-index:8000;padding:4pt;margin-top:-6pt;border-radius:6px;border-width:2px;border-style:solid}.vc div.value input{border-width:0;outline-width:0}.vc div.value>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);display:inline-block;padding:0 4pt;margin-left:4pt;font-size:80%;font-style:italic;border-width:2px;border-style:solid;border-radius:6px}.vc div.value.regex>input{font-style:italic}.vc div.value.regex>div{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}.vc:not(.fragment) .docGroup,.vc:not(.fragment) .doc{color:#616263}.vc:not(.fragment) .docGroup:hover{background-color:rgba(255,255,255,.3)}.vc:not(.fragment) .doc>span:not(.fixed){cursor:pointer}.vc:not(.fragment) .doc>span:not(.fixed):hover{color:#f6a800}.vc:not(.fragment) .doc.unspecified>span:hover,.vc:not(.fragment) span.unspecified:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.vc:not(.fragment) .doc:hover>.operators,.vc:not(.fragment) .docGroup:hover>.operators{opacity:1}.vc:not(.fragment) .docGroup[data-operation]>.doc::before,.vc:not(.fragment) .docGroup[data-operation]>.docGroup::before{color:#f6a800}.vc:not(.fragment) .docGroup[data-operation=or]{border-color:#f6a800}.vc:not(.fragment) div.value{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2)}.vc:not(.fragment) div.value>div{cursor:pointer}.vc:not(.fragment) div.value>div:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.docGroup>.operators{z-index:30}.docGroup .docGroup>.operators{z-index:31}.docGroup .docGroup .docGroup>.operators{z-index:32}.docGroup .docGroup .docGroup .docGroup>.operators{z-index:33}.docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:34}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:35}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:36}.vc.fragment>div>div.docGroup{margin-left:0}.vc.fragment .doc{margin-right:2em}#collection{line-height:1em;border-radius:6px}#vc-choose>span.rewritten::after{font-family:"FontAwesome";white-space:nowrap;color:#f6a800;padding:0;padding-left:4px;content:"";text-decoration:underline;font-style:normal;font-weight:normal}div#vc-view{position:relative}div#vc-view>div.vc{display:none;margin:1.3em 0 .5em 0;border:2px solid #636f07;background-color:#fefefe}div#vc-view>div.vc.active{display:block}div#vc-view>div.vc>div:first-child{padding:1.3em}div.panel.vcinfo{padding:3pt 0pt 3pt 3pt;background-color:#636f07}div.panel.vcinfo div.button-group>span{box-shadow:none}div.stattable{display:flex;flex-direction:row;margin-right:20px}div.stattable>dl{margin-bottom:4px}div.stattable>dl>div{border-color:#636f07}div.stattable>dl>div>dt{background-color:#8a9a0a;width:15em;margin:0}div.stattable>dl>div>dt::after{content:":"}div.stattable>dl>div>dd{background-color:#dce883;color:#616263}div.stattable.stdisabled dt,div.stattable.stdisabled dd{background-color:#b9c46a;color:#636f07;text-shadow:none}div.reloadStatB>span.refresh{margin-left:2pt}span.refresh::after{vertical-align:sub;content:""}@media(min-width: 1680px){div.stattable dl.flex>div{width:inherit}}div.datepicker{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:absolute;display:inline-block;z-index:90;font-size:80%;padding:4pt;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-width:2px;border-style:solid;border-radius:6px}div.datepicker>div{font-size:120%;width:45%}div.datepicker>div.month{float:right}div.datepicker>div>span{display:inline-block;overflow:hidden;white-space:nowrap}div.datepicker>div>span:first-child,div.datepicker>div>span:last-child{width:15%}div.datepicker>div>span:first-child::before,div.datepicker>div>span:last-child::before{font-family:"FontAwesome";white-space:nowrap;display:inline-block;text-align:center;cursor:pointer;min-width:14px}div.datepicker>div>span:first-child::before{content:""}div.datepicker>div>span:last-child::before{content:""}div.datepicker>div>span:nth-child(2){display:inline-block;cursor:pointer;width:70%;text-align:center;text-overflow:ellipsis;border-radius:6px;border-style:solid;border-width:2px;border-color:transparent}div.datepicker>div>span:nth-child(2):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker>div>span:nth-child(2).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker table{border-collapse:separate;border-spacing:1px}div.datepicker input{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding-left:.4em;padding-right:.4em;background-color:#fefefe;width:100%;border-style:solid;border-width:1px}div.datepicker td{padding-left:.4em;padding-right:.4em;text-align:center;border-style:solid;border-width:1px}div.datepicker td:not(.out){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);cursor:pointer;background-color:#fefefe}div.datepicker td:not(.out).today{background-color:#bce4f7;color:#009ee0;text-shadow:none}div.datepicker td:not(.out).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker td:not(.out):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker td.out{border-color:transparent}#ql-field{position:relative;background-color:#9bad0b;cursor:pointer;margin:0;outline:none;border:none;display:inline-block;color:#fff;border-width:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#ql-field:checked{outline:none}#ql-field>option{padding:0pt 2pt;outline:none}#ql-field:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}input.pipe{display:none}header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;background-color:#9bad0b;padding:8px 0 0 8px;font-size:10pt;color:#fefefe}header span.select{display:inline-block;cursor:pointer;line-height:1.8em;border-width:0;border-bottom-width:3px;border-style:solid;border-color:transparent}header span.select>span{font-weight:bold}header span.select:hover{color:#636f07;border-color:#636f07}header span.select::after{font-family:"FontAwesome";white-space:nowrap;pointer-events:none;text-align:center;content:"";padding-left:4pt;padding-right:4pt}header span.select.active{border-color:#f6a800}header span.select.active::after{content:""}header form{position:relative;display:block;padding-left:230px;min-height:2.7em;margin:0px}header input{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0}header .button{color:#fefefe;line-height:2em;margin-right:40px}header .button.right{float:right;display:inline-block}header .button.top{position:absolute;display:block;top:0;right:0;margin-right:0;width:20px;background-color:#636f07;text-align:center;height:100%;z-index:20}header .button.top>a:hover{color:#fefefe}header .button>a{color:#fefefe;cursor:pointer;position:relative;font-size:120%}header .button>a>span{position:absolute;margin-left:-3000px}header .button>a::after{font-family:"FontAwesome";white-space:nowrap}header .button>a.tutorial::after{content:""}header .button>a.question::after{content:""}header .button>a.login::after{content:""}header .button>a.logout::after{content:""}.query.button-group>span{border-top-width:0;border-color:#fff}.query.button-group>span:first-child{border-top-left-radius:0}.query.button-group>span:last-child{border-top-right-radius:0}footer{background-color:#616263;position:absolute;bottom:0;padding-bottom:2px;font-size:70%;width:100%;text-align:right;display:flex;align-items:center;height:100pt}footer nav{margin-left:30px;padding:3pt 6pt;text-align:left;flex-grow:2}footer nav a{white-space:nowrap}footer div.logos{font-size:0;flex-grow:1}footer a{font-size:10pt}footer a:link{color:#d9dadb}footer a:visited{color:#d9dadb}footer a:hover{color:#fefefe}footer a[href^="http://"]::after,footer a[href^="https://"]::after{content:none}footer span.separator:after{font-size:bold;content:" | ";color:#f6a800}#logos{margin-right:40px}#ids-logo{display:inline-block;width:21.0333333333em;height:6.6666666667em;background-image:url("../img/ids-institute-for-the-german-language-white.svg")}aside.active~footer{padding-left:230px;transition:all .3s ease-in-out}aside{background-color:#636f07;color:#fefefe;width:230px;position:fixed;display:block;transition:all .3s ease-in-out;outline:none;font-size:10pt;z-index:100;top:0;left:0;height:100%;padding-top:65px}aside>div{overflow-y:auto;overflow-x:visible;max-height:100%}aside>*{opacity:1}aside::after{font-family:"FontAwesome";white-space:nowrap;position:absolute;display:block;opacity:0;cursor:pointer;right:0;bottom:0;content:"";font-size:16pt;width:16pt;height:17pt;padding:6pt;background-color:#636f07;border-top-right-radius:6px;margin-right:-20px}aside.settings::after{content:""}aside h2,aside legend{line-height:2em;text-align:center;padding:0;margin:0;font-size:100%;font-weight:bold}aside ul.nav{list-style-type:none;margin:0;font-size:10pt;text-indent:0;padding:0}aside ul.nav li{padding:0}aside ul.nav li>a{padding:3pt 6pt}aside ul.nav li>a:visited{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}aside ul.nav li.folded.active>ul{display:block}aside ul.nav li.folded>ul{display:none}aside ul.nav li.folded>ul.active{display:block !important}aside ul.nav li.active>a:link{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}aside ul.nav li>a:link{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);display:block;border-right-width:2px;border-right-style:solid}aside ul.nav li>a:link:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}aside ul.nav li h3{padding:0;margin:0;font-weight:bold;font-size:100%}aside ul.nav li>a{padding-left:6pt}aside ul.nav li li>a{padding-left:18pt}aside ul.nav li li li>a{padding-left:36pt}aside nav>ul>li>a{font-weight:bold}aside fieldset{position:relative;border-width:0}aside fieldset legend{display:none}aside fieldset input[type=text],aside fieldset input[type=password]{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0;width:100%}aside fieldset>form>div{position:relative;width:100%;margin-top:4px;padding-right:30px}aside fieldset>p{color:#9bad0b}aside fieldset>p.announcement{color:#fefefe}aside fieldset>p.announcement>time{display:block;font-size:70%}aside fieldset hr{border:none;border-top:2px solid #d9dadb}aside fieldset ul{display:block;font-size:80%;text-align:right;padding:0;margin-top:0}aside fieldset ul>li{display:inline}aside fieldset ul>li:first-child::after{content:" | "}aside fieldset button{position:absolute;top:0;right:0}aside fieldset button::after{content:""}aside.off,aside:not(:focus):not(.active){margin-left:-210px}aside.off::after,aside:not(:focus):not(.active)::after{opacity:1}aside.off>*,aside:not(:focus):not(.active)>*{opacity:0;transition-property:opacity;transition-duration:.3s}aside.off::after{display:none}body.no-js #notifications{display:block !important}body.no-js aside{position:relative;display:block;transition:none;margin-left:0 !important;padding-top:0;width:100%;top:0}body.no-js aside>*{opacity:1 !important;transition:none}body.no-js aside form.login>input,body.no-js aside form.login>div{width:auto;margin-top:0}body.no-js aside form.login>input:first-of-type,body.no-js aside form.login>div:first-of-type{float:left;margin-right:1em}body.no-js aside form.login button{height:100%}body.no-js aside p,body.no-js aside::after{display:none}body.no-js main div.intro{margin-left:8px !important}#activate{text-align:right;background-color:#f6a800;margin-top:0;padding:8px;padding-right:40px;color:#fefefe;font-size:80%}@media all and (max-width: 42.5em){body,#search>ol,#search div.snippet>span,header,header input,div#resultinfo,#pagination>a{font-size:9pt}header{padding-right:8px}header form{padding-left:0;padding-top:33px}.vc{font-size:9pt}.vc .builder .doc{padding-left:3em}.vc .builder * .docGroup{margin-left:3em}.vc .builder>.doc{padding-left:.5em}.vc .builder>.docGroup{margin-left:.5em}h1{margin-left:0px;width:130px;height:40px;background-size:100%;background-position:50% 0;z-index:110;position:absolute !important}#searchbar{padding-right:30px;margin-top:0}#searchbar input{font-size:9pt}#searchbar button[type=submit]{right:0}.level-1{padding-bottom:2px}.level-2{padding-bottom:4px}main{margin-left:4px;margin-right:4px}header .button{margin-right:4px}header .button.top{height:auto}#search ol>li:target>div>div.snippet,#search ol>li.active>div>div.snippet{margin:2px 2em 2px 4px}#search ol>li div.meta{display:none}div.matchinfo{font-size:9pt}div.matchtable tr>*{padding:1pt 3pt}div.matchtree h6{display:block;float:none}div.matchtree>div{margin-left:2px}#logos{margin-left:0;margin-right:0}#logos>div{border-top-width:14px;padding-right:0}#logos>div .logo>*{background-size:60%;background-position:0 0}div.intro{width:100%}body.embedded aside>div{top:0;transform:translateY(0)}aside:not(:focus):not(.active){margin-left:-230px}aside:not(:focus):not(.active)::after{font-size:12pt;height:11pt;text-align:right;padding-right:3pt;padding-top:2pt}aside ul{font-size:9pt;line-height:1em}aside.active~main div.intro,aside.active~main.page{margin-left:4px !important}aside.active{position:relative;display:block;padding-top:0;width:100%;top:0;border-width:0}aside.active fieldset input{font-size:9pt}aside.active::after{display:none}aside.active p,aside.active hr{display:none}#tutorial{border-radius:0;border-width:0;right:0;left:0;bottom:0;top:0;padding:0}#tutorial iframe{border-radius:0}#tutorial>ul.action.right{height:1.5em;right:20px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}main.page{margin-right:20px}footer{padding-left:0 !important}}@media print{body,html,select,g>text{color:#000}header,aside{display:none}main.page{margin:1em}a.embedded-link{color:#000;text-decoration:underline}pre.query.tutorial{background-color:#fff;color:#000;margin-left:1em;margin-right:1em}blockquote.warning{background-color:gray;color:#fff;border-left-color:#000;border-left-width:1em}}
+
+/*# sourceMappingURL=kalamar-0.43.0.css.map */
\ No newline at end of file
diff --git a/public/css/kalamar-0.43.0.css.map b/public/css/kalamar-0.43.0.css.map
new file mode 100644
index 0000000..4b65605
--- /dev/null
+++ b/public/css/kalamar-0.43.0.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fonts.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/flextable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/mixins.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/lengths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fragment.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/choose.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/colors.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/icons.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/load.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/form.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/view.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/menu.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/banner.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/showPWD.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/copyToClipboard.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/buttongroup.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/base.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/highlight.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/kwic.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/logos.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/tree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/metatable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/matchinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/pagination.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/query.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/resultinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/tutorial.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/koralquery.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-core.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-default.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/intro.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/panel.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs-ids.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/oauth.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/news.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/plugin.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/main.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/hint.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/searchbar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/vc.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/statistics.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/datepicker.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/querylanguage.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/pipe.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/header.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/footer/footer.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/sidebar/sidebar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/no-js.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/media.scss"],"names":[],"mappings":"CAOA,WACE,0BACA,mDACA,wWACA,mBACA,kBCJF,QACE,aACA,mBACA,eACA,2BACA,oBACA,WACA,iBAEA,YACE,aACA,mBACA,kBACA,WACA,iBACA,mBACA,oBACA,cCZF,uBACA,mBACA,eACA,gBACA,gBACA,WDUE,eACE,gBACA,aACA,QE1BmB,QF2BnB,SAEF,eACE,gBACA,QE/BmB,QFgCnB,SACA,WACA,eACA,eACA,YE9BmB,IF+BnB,mBACA,gBACA,kBACA,uBAMN,yBACE,YACE,WAIJ,yBACE,YACE,sBAIJ,0BACE,YACE,WAIJ,0BACE,YACE,WG7DJ,8BCQE,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BF3Db,kBACA,2BAGE,aDNqB,ICOrB,mBACA,cDfqB,ICmBrB,YDXqB,MCYrB,gBACA,mBACA,aDPkB,KCUpB,gDE4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBDDE,eAIF,oEACE,iBACA,kBAIF,sEACE,oBAGF,4CACC,0BACA,QGhBe,IHiBd,kBACA,UACA,IDvCqB,IKPzB,YACE,wCACA,uBACA,sBACA,yBAGF,SAEI,2BACA,4BACA,+4BCRJ,YACE,cACA,UACA,cAEA,qBACE,aAGF,qBACE,eACA,UACA,eACA,yBACE,mBAIJ,mBACE,6BACA,cACA,iBACA,cNzBqB,IMiCvB,uBACE,cACA,gBAGF,gFAGE,eAIA,sCAEE,eACA,qBAEF,6CACE,YACA,MHzCS,QG2CX,+EACE,qBACA,SAEF,qCACE,sBAEF,0CACE,iBAIJ,oFAIE,cNtEqB,IMyEvB,uCAEE,aHpEW,QGqEX,iBHvBW,QGwBX,mBAGF,oFAIE,mBACA,qBACA,UACA,eACA,QNrFqB,IMwFvB,8BACE,eACA,iBACA,qBACA,WACA,eAGF,oEAEE,iBH/Ea,QGkFf,8BACE,aH7FW,QGgGb,4EAGE,qBACA,eACA,kBACA,kBACA,iBHlFa,QGmFb,aH1GW,QG4GX,MH5GW,QG+Gb,gCACE,yBAGF,wCACE,MHtHW,QGuHX,YAIJ,cACE,oCACA,yBACA,gCAGF,OACE,eAEA,cACE,QAGF,oBJlIA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BG8EX,mBACA,UACA,YACA,MACA,MNpJqB,KM8JrB,yBARA,wCPrJF,kBACA,oBOwJE,2BACE,0BAKF,oDJzIF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBI2IE,sCACE,YAGF,2BJ7HF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBIkIE,iCAEI,mBN9KiB,IM+KjB,yBACA,wBNvLiB,IMwLjB,2BNxLiB,IMkMzB,UACE,aAEA,gBACE,eAEA,qBACE,qBACA,kBACA,UACA,WACA,gBACA,sBACA,UACA,kBAEA,4BPvKJ,0BACA,mBOwKK,QF9LW,IEmMhB,oCACE,QFrMc,IGvBlB,aACE,iBJsDa,QKhDf,QACE,kBACA,UACA,SACA,cAEA,UAME,qBACA,4BANF,gBACE,UAQF,0CAEE,sBACA,iBACA,mBACA,YAGF,8CNfA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKlCb,6CNpBA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BK/BX,WN9BkB,2BM+BlB,eACA,QRtCqB,QQuCrB,mBAEE,aRnCmB,IQoCnB,wBACA,qBACA,mBAGJ,kBACE,cACA,cAGF,wBAEI,yBACA,aRjDmB,IQmDrB,QRzDqB,QQ0DrB,cACA,iBACA,6BACE,yBACA,cACA,kBAOJ,kBACE,kBACA,UACA,mBACA,6BACA,WACA,YACA,UACA,eACA,+BAEA,uBNpCF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBMmCI,kBACA,cACA,QACA,WACA,YAEC,kBACA,iBACA,mBAIH,8BNvEF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBMwEE,sBNtFF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKkCT,WN/FgB,2BMgGhB,kBACA,QACA,WACA,YAEE,kBACD,iBACA,mBAKL,0EAGE,4BACA,UAOF,mCAEE,oBAIA,yBAEG,iBR/HkB,IQgIlB,uBRvIkB,IQwIlB,wBRxIkB,IQ4IrB,wBAEG,oBRvIkB,IQwIlB,0BR/IkB,IQgJlB,2BRhJkB,IQmJ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F,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBqB7BA,2BACE,qBACA,MpBdW,QoBeX,cACA,iBACA,YCpBJ,YACE,WACA,iBACA,kBACA,iBACA,gBACA,eAEA,oBACE,eACA,UACA,SACA,iBAaF,kBACE,kBACA,kBAEA,qCACE,gBACA,sBACA,gBAEA,iDACE,4BAGF,gDACE,6BAOR,uBACE,yBACA,iBrBjDa,QqBsDf,kCACE,qBACA,WACA,sBACA,kBAEA,uCACE,kBACA,mBAEA,mDACE,kBxBhEmB,IwBmErB,kDACE,mBxBpEmB,IwB0EzB,eACE,MrB9Ce,QqB+Cf,iBAIF,YACE,cACA,kBACA,iBACE,iBAUF,+BACE,QpBnFc,IoBqFhB,gCACE,QpBrFc,IoBuFhB,iCACE,QpBvFc,IoByFhB,4BACE,QpBtFc,IqBpBlB,UACE,eACA,aACA,OACA,UACA,QACA,SACA,czBKoB,KyBJpB,iBtB0Ca,QsBzCb,WvBLoB,2BuBclB,iBACA,atB8BW,QsB7BX,mBACA,czBxBqB,IyBcvB,oCACE,iBtBTW,QsBUX,cACA,YAUF,iBACE,eACA,WAGA,kBAEE,4CACA,4BACA,kCACA,oBAKN,WACE,cACA,gBACA,kBAIA,mBAHA,gBACE,iBAKJ,cACE,yBACA,oBvBxCA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BsBZX,cACA,iBtBnDW,QsBqDX,wBACE,kBACA,QACA,mCACA,+BACA,2BAMN,qC1B3BE,0BACA,mB0B4BA,aACA,cCtEF,YACE,gBACA,gBAGE,iBvB6CW,QuB5CX,gBACA,cAGE,eACA,a1BCgB,uB0BChB,gBCpBN,uCAGE,qEACA,kEACA,iEACA,gEACA,6DAEF,eACE,oEACA,iEACA,gEACA,+DACA,4DAEF,mBACE,oEACA,iEACA,gEACA,+DACA,4DAEF,gBACE,6BACA,8BACA,sBACA,kBACA,UAEF,uBACE,aAEF,UACE,6BACA,kBACA,YACA,mBACA,UAEF,iBACE,uCACA,oCACA,mCACA,kCACA,+BACA,UACA,aAGF,yBACE,cACA,kBAEF,eACE,eACA,aACA,YACA,WACA,YAEF,sBACE,aAEF,cACE,cACA,gBACA,kBACA,aACA,UAEF,mBACE,QACA,UAEF,mBACE,sCACA,mCACA,kCACA,iCACA,8BACA,UAEF,iBACE,aAEF,qBACE,SACA,mBACA,WACA,YACA,gBACA,UACA,kBACA,UAEF,gBACE,kBAEF,eACE,mBACA,WACA,8BACA,2BACA,sBACA,eAIF,yFAIE,gBACA,qBACA,YAEA,gBACA,eACA,qBACA,eACA,gBAGF,0CACE,yBAEE,UACA,8BACA,2BACA,sBAEF,UACE,QACA,UCnIJ,wBAEE,uBAEF,UACE,gBACA,uBACA,iCACA,kBACA,oCACA,gCACA,6BACA,4BAEF,eACE,sBACA,aACA,kBAEF,iBACE,kBACA,WACA,iBACA,iBACA,qBACA,qCACA,gDACA,gGACA,6FACA,4FACA,2FACA,wFAEF,8CAEE,aACA,oFACA,iFACA,gFACA,+EACA,4EAEF,uBACE,4BAEF,wBACE,kBACA,qEAEF,oFAGE,yBACA,yBAEF,wEAGE,yBACA,yBAGF,cACE,mBAEA,gBACA,aACA,kBACA,WAUF,sBACE,mBAEA,mBC5EF,0BACE,iB1BDa,Q0BEb,mCACE,M1BmBa,Q0BfjB,8BACE,cACA,M1BgDW,K0B/CX,cAGF,oBACE,iB1B4CW,Q0BzCb,eACE,aAKF,WACE,kBACA,iBACA,cACA,aAEA,c7BjCuB,I6BkCvB,eACA,iB1B2BW,Q0B1BX,M1BiBa,Q0BhBb,0BACE,iB1B5BW,Q0B8Bb,uBACE,iB1BpCW,Q2BDb,oBACE,M3BqBa,Q2BlBf,2BACE,iB3Baa,Q2BZb,Q9BPqB,I8BQrB,0BACA,kBACA,UACA,YAIJ,4BACE,kBCjBF,UACE,kBACA,WACA,cAGF,SACE,kBACA,Y/BHuB,I+BIvB,cACA,WAGF,oBACE,aCpBF,iBACE,kBACA,uBACA,eACA,sBACA,UACA,gHACA,uJACA,mHACA,8GACA,+GACA,2GACA,sHACA,iEACA,yBACA,oCACG,iCACC,gCACC,+BACG,4BAGV,mBACE,wBACA,qBACA,kCACG,+BACC,8BACC,6BACG,0BAGV,yEAGE,2BAGF,4BACE,4BACA,kBACA,sBACA,UACA,wBAGF,8EAGE,kBAGF,qBACE,uBACA,kBACA,gBACA,sBACA,sCACA,sBACA,gCACA,kBACA,qCACA,oCACG,iCACC,gCACC,+BACG,4BAGV,+BACE,uBACA,kBACA,kBACA,kBACA,6BACA,oCACG,iCACC,gCACC,+BACG,4BAGV,kFAGE,+BACG,4BACC,2BACC,0BACG,uBAGV,2BACE,uBACA,kBACA,mBACA,UACA,WACA,8BACA,YACA,iCACA,eACA,iBACA,WACA,kBACA,uCACA,mBACA,kEACA,+GACA,+DACA,8DACA,6DACA,gEACA,WACA,YACA,iBACA,sBACA,kBACA,oHACA,2FACA,oCAGF,eACE,6BACA,WACA,kBAEF,mBACE,UACA,yBAEF,yBACE,UACA,WACA,yBAEF,0BACE,UACA,SACA,iBACA,yBAEF,qBACE,YACA,SACA,uBAEF,4BACE,YACA,YACA,uBAEF,sBACE,aACA,sBAEF,4BACE,aACA,WACA,sBAEF,6BACE,aACA,SACA,iBACA,sBAEF,oBACE,WACA,SACA,wBAEF,2BACE,WACA,YACA,wBAGF,iBACE,uBACA,kBACA,mBACA,aACA,sBACA,gBACA,gBACA,kBACA,qCACA,wCACG,qCACC,oCACC,mCACG,gCAGV,wBACE,iBACA,mBAOF,gBACE,uBACA,kBACA,iBACA,qBACA,kBACA,yBACA,SACA,qBACA,2BACA,4BACA,WACA,mBACA,eACA,aACA,yBACA,mFACA,wDACA,sDACA,mDACA,gCACA,6BACA,+BAEA,2BACA,wBACA,mBAEA,OACA,gBACA,gBAGF,sBACE,qBACA,qBACA,+BAGF,6CAEE,mFACA,wDACA,sDACA,mDAIF,kCACE,UACA,SAGF,oBACE,uBACA,iBACA,cAGF,oBACE,oCACA,iCACA,4BACA,kBAGF,uCACE,yBACA,2BACA,wBACA,mBAGF,oBACE,oCACA,iCACA,4BAGF,uCACE,2BACA,wBACA,mBAGF,kEACE,cACA,qBACA,gBACA,eACA,yBACA,sBACA,qBAGF,gBACK,aAGL,iBACE,kBAEF,oBACE,uBACA,WACA,mBACA,UACA,qBAEF,uBACE,uBACA,gBACA,WACA,aAEF,yBACE,uBACA,cACA,UACA,WACA,gBACA,mBACA,wBACA,2BACA,qBACA,eAEF,+BACE,gBAEF,gCACE,gBAGF,kBACE,uBACA,gBACA,YACA,oBACA,kBACA,yBAEF,qBACE,uBACA,WACA,SACA,YACA,eACA,iBACA,kBACA,sBAGF,wBACE,kBACA,SACA,QACA,SACA,QAGF,sBACE,eAGF,cACE,uBACA,kBACA,uBACA,WACA,YACA,eAEF,oBACI,SACA,UAEJ,kBACE,aAGF,mBACE,eAGF,wCACE,oCAGF,oBACE,uBACA,WACA,YACA,oCACA,2BACA,wBACA,mBACA,uCACA,WACA,kBACA,oCACG,iCACC,gCACC,+BACG,4BAEV,wCACE,uBACA,oBACA,eAEF,kBACE,uBACA,wCACA,uBACA,2BACA,wBACA,mBACA,YACA,WACA,2CACA,wCACA,mCACA,2CACA,wCACA,mCACA,kBACA,UACA,WACA,UACA,UAGF,gCACI,GACI,2BACA,UAEJ,IACI,2BACA,WAEJ,IACI,6BACA,WAEJ,IACI,6BACA,WAEJ,KACI,2BACA,WAIR,6BACI,GACI,wBACA,UAEJ,IACI,wBACA,WAEJ,IACI,0BACA,WAEJ,IACI,0BACA,WAEJ,KACI,wBACA,WAIR,wBACI,GACI,mBACA,UAEJ,IACI,mBACA,WAEJ,IACI,qBACA,WAEJ,IACI,qBACA,WAEJ,KACI,mBACA,WCjfR,qBACE,6BAGF,+BACE,gBAIF,WACE,iBACA,M9Bae,Q8BVjB,YACE,YAGF,oBACE,YACA,gBAGF,oBACE,M9BXa,K+Bbf,eACE,mBAEA,yBACE,qBAEA,kDACE,mBAGF,0CACE,cACA,cAIJ,kBACI,cACA,aAIN,iBACE,iBAEA,yBnCgBA,0BACA,mBmCfE,qBACA,YACA,Q9BFc,I8BGd,M/BxBW,Q+ByBX,eAIJ,SACI,qBAIJ,iBACI,iBAEF,yBnCFA,0BACA,mBmCGE,gCACA,mBACA,qBACA,YACA,Q9BlBc,I8BmBd,yBACA,eACA,gBCvDJ,aACE,iBhCWa,QgCVb,0BACA,YACA,kBACA,cnCJuB,ImCKvB,8BAEA,gBACE,WACA,WACA,WACA,iBACA,iBAGF,sCpC4BA,0BACA,mBoC3BE,MhCLW,QgCMX,aAGF,gBACE,oBACA,qBACA,kBACE,eACA,uBAGF,mBACE,uBACA,uBAKN,mCAEI,gBACE,gBACA,WACA,WACA,oBAEF,gBACE,iBC5CN,gBACE,cpCaoB,KoCXpB,uBACE,SACA,sBACA,UACA,WACA,gBAIJ,uCACE,iBjCuCa,QkCnCf,KACE,qBAGE,YrCTkB,KqCUlB,kBAGF,cAEI,iBACA,kBAIJ,OACE,mBACA,aAGF,iBACE,aACA,gBAGF,UACE,kBAKE,uEACE,iBlC3CO,QkC4CP,MlC7CO,QkC8CP,eACA,crCrDiB,IqC0DvB,YACE,cACA,kBC1DJ,aACE,qBACA,mBACA,gBACA,0BACA,MAEA,8BAEI,qBACA,yBACA,0BAMN,eACE,kBACA,iBnCyCW,QmCxCX,MnC+Ba,QmC9Bb,QtCtBuB,QsCuBvB,eACA,WpClBoB,2BoCmBpB,WACA,eACA,0BACA,+BAGE,ctChCqB,IsCiCrB,yBAGF,uBACE,kBACA,WACA,cACA,UACA,OACA,QACA,mBAEE,0BACA,mBACA,iCAMN,aACE,kBACA,cACA,OACA,MACA,WACA,qBACA,SAEA,kBACE,UACA,qBACA,gBAIF,iBACE,kBACA,cACA,eACA,4BACA,MACA,OACA,gBACA,UACA,6BACA,YACA,YAEA,oCACE,8BAGF,wBACE,mBACA,SACA,WCtFN,SACE,cACA,kBACA,WACA,SAEA,uCACE,aAGF,iBAEI,iBpCOW,QoCNX,sBAMN,WACE,kBACA,WACA,UACA,mBACA,eAEA,+BACE,kBACA,UACA,MvCnBkB,KuCqBlB,oDACE,QnCxBY,ImC6BlB,aACE,mBAKF,iCACE,cACA,WACA,iBACA,mBACA,kBAEA,sCACE,gBC/CJ,IACE,eAEA,aACE,iBAGF,cACE,kBACA,qBACA,YAdW,IAeX,wBAOE,mBACA,mBACA,oBAPF,wBACE,cAWA,mHAEE,aAGF,2FAEE,kBACA,qBACA,iBACA,MAvCO,IAwCP,mBACA,kBACA,iCAGF,gDACE,mBAMF,iGAGE,aAMF,mGAGE,cAQJ,yBACE,kBACA,cACA,sBACA,SACA,SACA,iBACA,UAEA,0CAEI,yBACA,4BAUR,SACE,iBACA,aAhGW,IAoGT,gEAGE,gBAGF,sCAEE,iBAGF,qCACE,kBAEA,yFAEE,YAIJ,kBACE,kBAEA,qBACE,SACA,kBAGF,wBACE,MrClGO,QqCwGb,oDtC5HF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCyET,cACA,WtCvIgB,2BsC0Id,mBACA,axC3IiB,IwC4IjB,cxCnJiB,IwCwJrB,oBACE,qBACA,iBAIJ,wBACE,qBACA,gBACA,MrC7JW,QqC8JX,+BzCvHF,0BACA,mByCwHI,kBACA,mBACA,QpC1JY,IoC2JZ,0BAGF,6BACE,aAOJ,eACE,UACA,mBACA,UACA,YACA,cACA,kBAGF,cACE,cAGF,UACE,qBAIF,6DzCzJA,0BACA,mByC2JE,QpCzKc,IoC0Kd,kBAEE,kBACA,mBAIJ,cACE,kBACA,qBACA,sBACA,aACA,YACA,gBAGE,cxCxNmB,IwCyNnB,axClNmB,IwCmNnB,mBAGF,oBACE,eACA,gBAGF,kBtCpNF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCgKT,qBACA,cACA,gBAGE,cACA,kBAIA,axCvOiB,IwCwOjB,mBACA,cxChPiB,IwCqPnB,0BACE,kBAGF,wBtC3MJ,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBsCoNA,qDAEE,MrCnNW,QqC0Nb,mCACE,sCAGF,yCACE,eACA,+CACE,MrCjRS,QqCwRX,yFtCnQF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBsCsQE,uFACE,UAMA,yHAEE,MrCvSO,QqC0SX,gDACE,arC3SS,QqC+Sb,6BtCrSA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCiPX,WtC9SkB,2BsCgTlB,iCACE,eACA,uCtChSJ,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBsC0SA,qBACE,QAHQ,GAMR,+BACE,WAGA,yCACE,WAGA,mDACE,WAGA,6DACE,WAGA,uEACE,WAGA,iFACE,WAWd,8BACE,cAEF,kBACE,iBAIJ,YACE,gBACA,cxCpXuB,IwCuXzB,iCzC5UE,0BACA,mByC6UA,MrCrXa,QqCsXb,UACA,iBACA,QpChXgB,IoCiXhB,0BACA,kBACA,mBAGF,YACE,kBAEA,mBACE,aACA,sBACA,yBACA,iBrCpVW,QqCsVX,0BACE,cAGF,mCACE,cAKN,iBACE,wBACA,iBrC7Ya,QqC+Yb,uCACE,gBCtZJ,cACE,aACA,mBACA,azCQoB,KyCJpB,iBACE,kBAEA,qBACE,atCLS,QsCOT,wBACE,iBtCeS,QsCdT,WACA,SAEA,+BACE,YAGJ,wBACE,iBtCQS,QsCPT,MtCwBO,QsClBX,wDAEE,yBACA,MtC3BS,QsC4BT,iBAON,6BACE,gBAGF,oBACE,mBACA,QrCpBgB,IqCyBlB,0BACE,0BACE,eCrDJ,exCSE,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BuC7Db,kBACA,qBACA,WACA,cACA,YACA,WxCLoB,2BwCQlB,a1CRqB,I0CSrB,mBACA,c1CjBqB,I0CoBvB,mBACE,eACA,UAEA,yBACE,YAGF,wBACE,qBACA,gBACA,mBAEA,uEAEC,UACA,uF3COL,0BACA,mB2CNO,qBACA,kBACA,eACA,eAIH,4CACC,QtCrCW,IsCwCZ,2CACC,QtCxCW,IsC2CZ,qCACC,qBACA,eACA,UACA,kBACA,uBAGE,c1C7DgB,I0C8DhB,mBACA,a1CxDgB,I0CyDhB,yBAGF,2CxC1CL,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBwC2CK,8CxCzBL,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBwC6BA,qBACE,yBACA,mBAGF,qBxCrEA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BJlCb,kBACA,mB2CmDE,iBvCjCW,QuCkCX,WAGE,mBACA,iBAIJ,kB3C7DA,kBACA,mB2C8DE,kBAGE,mBACA,iBAGF,4BxC1FF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BuCsCT,eACA,iBvCtDS,QuCwDT,kCACC,iBvCrGQ,QuCs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","file":"kalamar-0.43.0.css"}
\ No newline at end of file
diff --git a/public/css/kalamar-0.43.1.css b/public/css/kalamar-0.43.1.css
new file mode 100644
index 0000000..3e551ad
--- /dev/null
+++ b/public/css/kalamar-0.43.1.css
@@ -0,0 +1,3 @@
+﻿@font-face{font-family:"FontAwesome";src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media(min-width: 640px){dl.flex>div{width:50%}}@media(min-width: 800px){dl.flex>div{width:33.3333333333%}}@media(min-width: 1200px){dl.flex>div{width:25%}}@media(min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:"FontAwesome";content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:":";color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:"*"}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px;font-size:1px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:"FontAwesome";white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.non-item:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.non-item:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}ul.menu>li,ul.menu>span.non-item:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu span.non-item.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu span.non-item:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu span.non-item{border-radius:6px;border-width:2px !important}ul.menu span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.entry:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.pref:not(:empty)~span.entry:not(:empty){bottom:-27px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:""}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}ul.containermenu>ul.menu.container{bottom:0;transform:translateY(100%);margin-bottom:-0.3em}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}input.show-pwd{padding-right:2em}a.show-pwd::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:-1.5em;margin-top:.6em;font-size:130%}a.show-pwd.hide::after{content:""}a.copy-to-clipboard::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:.4em;margin-top:.6em;font-size:130%}.button-group{font-size:0}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a,.button-group.operators>span,.button-group.operators input[type=submit],.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:not(.inactive):hover,.button-group.button-panel input[type=submit]:not(.inactive):hover,.button-group.button-panel a:not(.inactive):hover,.button-group.operators>span:not(.inactive):hover,.button-group.operators input[type=submit]:not(.inactive):hover,.button-group.operators a:not(.inactive):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}.button-group.button-panel>span:first-child,.button-group.button-panel input[type=submit]:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators input[type=submit]:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel input[type=submit]:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators input[type=submit]:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a{margin-top:0;width:auto;min-width:auto}.button-group.button-panel>span>span.check,.button-group.button-panel input[type=submit]>span.check,.button-group.button-panel a>span.check{font-family:"FontAwesome";white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel input[type=submit]>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel input[type=submit]>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel input[type=submit]>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px;font-size:1px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:"FontAwesome";white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px;font-size:1px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana,tahoma,arial,Helvetica,sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100vh}body{position:relative;min-height:100vh;font-size:12pt;margin:0;padding:0}a:visited{color:#e55d00}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color .3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}a[onclick$="return PArok(this,false)"]{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$="return PArok(this,false)"]>span:nth-child(1n+2){display:none}a[onclick$="return PArok(this,false)"]>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}.hljs{display:block;padding:.5em}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}#search{position:relative;margin-bottom:30px;overflow:visible}#search div.matchinfo{display:none}#search>ol{overflow-x:hidden;overflow-y:visible;width:auto;text-indent:0;list-style-type:none;margin:0;padding:0;border:1px solid #87888a;font-size:10pt}#search>ol>li{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;align-content:stretch;border-style:solid;border-color:#f6a800;border-width:0}#search>ol>li .button-group.button-view{display:none}#search>ol>li:nth-of-type(even) div.match-main div.match-wrap{background-color:#fefefe}#search>ol>li p.ref{display:none}#search>ol>li div.meta,#search>ol>li div.match-main{position:relative;cursor:pointer}#search>ol>li div.match-main{display:block;flex:7 0;z-index:4;overflow:hidden}#search>ol>li div.match-main>div.match-wrap{width:99999%;margin-left:-49999.5%;background-color:#d9dadb;overflow-x:hidden;overflow-y:visible;white-space:normal}#search>ol>li div.meta{flex:1 0;min-width:12em;max-width:15em;text-align:left;width:2px;z-index:5;overflow-y:hidden;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#949597;color:#fefefe;font-size:75%;padding:0 5pt;border-color:#616263;border-style:solid;border-width:2px 1px 0 0}#search>ol>li div.meta:before{content:" ";display:inline-block;height:100%;vertical-align:middle}#search>ol>li div.meta:empty{border-width:0 1px 0 0}#search>ol>li div.meta.flip{background-color:#b3b4b5}#search>ol>li:first-of-type div.meta{border-top-width:0}#search>ol>li:last-of-type div.meta{border-bottom-width:0}div.snippet{text-overflow:ellipsis;text-indent:0;text-shadow:1px 1px rgba(255,255,255,.5);font-size:0;white-space:nowrap !important}div.snippet>span,div.snippet mark{padding:5pt 0 6pt 0;font-size:10pt}div.snippet>mark,div.snippet>span.match{font-weight:bold;color:#333;text-shadow:none;padding-left:4pt;padding-right:2pt}div.snippet>span.match>span.cutted::after{font-family:"FontAwesome";white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.snippet.startMore:before,div.snippet.endMore:after{content:"…";padding-left:2pt;padding-right:2pt}div.snippet div.flag{position:absolute;height:100%;top:0;left:0;width:11px;background-color:#f6a800;border-right:1px solid #e55d00}body.no-js #search>ol>li:active,#search>ol>li.active,#search>ol>li:target{position:relative;display:block;background-color:#f6a800;text-align:left;border-width:2px;white-space:normal;height:auto;width:auto;overflow:hidden}body.no-js #search>ol>li:active div.matchinfo,#search>ol>li.active div.matchinfo,#search>ol>li:target div.matchinfo{display:block}body.no-js #search>ol>li:active+li.active,#search>ol>li.active+li.active,#search>ol>li:target+li.active{border-top:2px solid #d9dadb;padding-top:6px}body.no-js #search>ol>li:active+li.active .button-group.button-view,#search>ol>li.active+li.active .button-group.button-view,#search>ol>li:target+li.active .button-group.button-view{padding-top:6px}body.no-js #search>ol>li:active .snippet,#search>ol>li.active .snippet,#search>ol>li:target .snippet{white-space:normal !important;padding:2pt 0 5pt 5pt;background-color:#f4eebb;margin-top:0;margin-right:20px;margin-bottom:0;margin-left:0}body.no-js #search>ol>li:active .snippet span,#search>ol>li.active .snippet span,#search>ol>li:target .snippet span{display:inline !important}body.no-js #search>ol>li:active .snippet>*,#search>ol>li.active .snippet>*,#search>ol>li:target .snippet>*{background-color:transparent}body.no-js #search>ol>li:active .snippet div.flag,#search>ol>li.active .snippet div.flag,#search>ol>li:target .snippet div.flag{display:none}body.no-js #search>ol>li:active .snippet>span,#search>ol>li.active .snippet>span,#search>ol>li:target .snippet>span{line-height:1.4em;width:auto}body.no-js #search>ol>li:active .snippet>span.context-left,#search>ol>li.active .snippet>span.context-left,#search>ol>li:target .snippet>span.context-left{margin-left:0;display:inline;overflow:visible;text-align:left;width:auto}body.no-js #search>ol>li:active .button-group.button-view,#search>ol>li.active .button-group.button-view,#search>ol>li:target .button-group.button-view{display:block}body.no-js #search>ol>li:active div.match-main,#search>ol>li.active div.match-main,#search>ol>li:target div.match-main{display:block;width:100%}body.no-js #search>ol>li:active div.match-main div.match-wrap,#search>ol>li.active div.match-main div.match-wrap,#search>ol>li:target div.match-main div.match-wrap{cursor:default;min-height:20pt;background-color:#f6a800;width:100%;margin-left:0;overflow-x:visible;white-space:normal}body.no-js #search>ol>li:active div.meta,#search>ol>li.active div.meta,#search>ol>li:target div.meta{display:none}body.no-js #search>ol>li:active p.ref,#search>ol>li.active p.ref,#search>ol>li:target p.ref{display:block;color:#fefefe;padding:3pt 10pt 3pt 3pt;padding-right:20px;margin:0pt;width:100%;bottom:0;z-index:30}body.no-js #search>ol>li:active p.ref>span.sigle,#search>ol>li.active p.ref>span.sigle,#search>ol>li:target p.ref>span.sigle{font-size:75%;vertical-align:top;color:#f4eebb;float:right}#search ol span.context-left{display:inline-block;width:50.01%;text-align:right}#search ol.align-right{text-align:right}#search ol.align-right div.match-main span.context-right{display:inline-block;width:49.915%;text-align:left}#search ol.align-center div.match-main{width:100% !important}#search ol.align-center div.match-main>.match-wrap{position:relative;margin-left:0}#search ol.align-center li:not(.active) div.snippet{white-space:normal;text-align:center;width:100000pt;margin-left:-50000pt}#search ol.align-center li:not(.active) div.snippet span.context-left{display:inline-block;text-align:right;width:40000pt;margin-left:70vw}#search ol.align-center li:not(.active) div.snippet span.context-right{display:inline-block;text-align:left;width:40000pt}#search ol span.context-left:empty::after,#search ol span.context-right:empty::after{content:" ";display:inline-block}mark{background-color:inherit;color:inherit}mark>mark,em,.level-0{border-bottom-width:2px;border-bottom-style:solid;padding-bottom:0px !important;font-style:normal}mark>mark>mark,em>em,.level-1{padding-bottom:3px !important}mark>mark>mark>mark,em>em>em,.level-2{padding-bottom:6px !important}#search>ol>li:not(.active) mark>mark>mark>mark,#search>ol>li:not(.active) em>em>em{line-height:180%}#search>ol>li.active mark>mark>mark>mark,#search>ol>li.active em>em>em{line-height:250%}.class-1{border-color:#c1002b}.class-2{border-color:#009ee0}.class-3{border-color:#f6a800}.class-4{border-color:#9bad0b}.logo::after{content:"" !important}.logo>*{background-repeat:no-repeat;background-size:90%;background-position:50% 50%}.logo>*>span{position:absolute;margin-left:-3000px;font-size:1px}h1{position:absolute;margin:0;margin-left:10pt;left:0;top:0;width:7.8em;height:2.4em;z-index:105;background-size:78% !important;background-image:url("../img/korap-logo.svg")}aside.active~header h1{position:fixed}#overview{text-align:center;width:100%}div.matchtable>div{z-index:20;margin-left:179px;margin-right:20px;padding:0;overflow-x:auto;overflow-y:visible;width:auto}div.matchtable table{display:table;border-collapse:separate;border-spacing:0px}div.matchtable th{color:#fefefe}div.matchtable td,div.matchtable tbody th,div.matchtable thead th:not(:nth-child(1)):not(:nth-child(2)):not(.cutted){cursor:pointer}div.matchtable td:empty{cursor:default}div.matchtable td:empty::after{content:" ";white-space:pre}div.matchtable td.matchkeyvalues{padding:0}div.matchtable td.matchkeyvalues>div{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}div.matchtable td.matchkeyvalues>div>span{color:#e55d00;text-align:right;padding-right:.5em}div.matchtable td.matchkeyvalues>div>span::after{content:":"}div.matchtable tr{outline:none}div.matchtable tr td.chosen,div.matchtable tr th.chosen,div.matchtable tr div.chosen{background-color:#9bad0b !important;color:#fefefe}div.matchtable tr>th:nth-of-type(1),div.matchtable tr>th:nth-of-type(2){border-top:2px solid #ff8000;width:88px;position:absolute;z-index:80;vertical-align:middle;left:0px}div.matchtable tr>th:nth-of-type(2){left:90px}div.matchtable tr>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;border:1px solid #f6a800}div.matchtable tr>td{background-color:#ffd080;white-space:nowrap;vertical-align:top;text-align:center}div.matchtable tr>td.mark{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td{background-color:#f4eebb}div.matchtable tr:nth-child(even)>td.mark{background-color:#ffd080}div.matchtable thead th{background-color:#ff8000;border-top-width:0px !important;text-align:center}div.matchtable thead th:nth-of-type(1),div.matchtable thead th:nth-of-type(2){text-align:left}div.matchtable thead th.mark{background-color:#e55d00}div.matchtable thead th.cutted{background-color:#f4eebb}div.matchtable thead th.cutted::after{font-family:"FontAwesome";white-space:nowrap;content:"";color:#9bad0b;padding-left:4pt;padding-right:4pt}div.matchtable tbody>tr:nth-of-type(1)>th{border-top-color:transparent}path.edge{stroke:#ff8000;stroke-width:2px;fill:none}g.arc.infocus>path.edge{stroke:#636f07}marker#arr{overflow:visible}marker#arr path{stroke:#e55d00;fill:#e55d00;fill-opacity:1;stroke-width:2}path.anchor{stroke:#e55d00;stroke-width:3;stroke-linecap:round;z-index:20}g.root rect.empty{stroke:#ff8000;fill:#ff8000;stroke-width:2px}g.middle rect,g.label rect{stroke:#ff8000;stroke-width:2px;fill:#ffd080}g.label.infocus rect{stroke:#636f07;fill:#dce883}g.middle.mark rect{fill:#ff8000}g.middle.mark>text{fill:#f4eebb}g.middle.mark>text>tspan{stroke:#f4eebb}g.leaf.mark text>tspan{font-weight:bold}g.leaf>rect{display:none}g>text>tspan{text-anchor:middle;font-size:9pt}g.leaf>text>tspan,text.leaf>tspan{font-size:10pt;overflow:visible}div.matchtree{overflow-x:hidden;overflow-y:visible;padding:0;margin-top:1pt}div.matchtree h6{display:inline;font-size:inherit;color:#fefefe;margin:0;padding:0 !important;float:left}div.matchtree h6>span{border-top:2px solid #ff8000;width:88px;text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px;display:inline-block !important;margin:0}div.matchtree h6>span:nth-of-type(2){margin-left:2px}div.matchtree>div{position:unset;z-index:4;overflow-x:auto;margin:2px;margin-left:180px;margin-right:20px;background-color:#f4eebb}div.metatable>dl{margin-right:20px;margin-top:2px}div.metatable>dl>div{border-color:#f6a800}div.metatable>dl>div>*{padding:.2em}div.metatable>dl>div>dt{background:#ff8000;color:#fefefe;width:12.5em}div.metatable>dl>div>dd{background-color:#f4eebb;cursor:pointer}div.metatable>dl>div>dd.metakeyvalues{padding:0}div.metatable>dl>div>dd.metakeyvalues>div{padding:.2em}div.metatable>dl>div>dd.metakeyvalues>div::before{content:"• ";color:#f6a800}div.metatable>dl>div>dd.chosen,div.metatable>dl>div>dd>div.chosen{background-color:#9bad0b !important;color:#fefefe}div.metatable>dl>div>dd[data-type="type:store"],div.metatable>dl>div>dd[data-type="type:attachement"]{background-color:#ffd080;cursor:default}div.metatable>dl>div>dd[data-type="type:store"] a,div.metatable>dl>div>dd[data-type="type:attachement"] a{color:inherit}div.metatable>dl.cbm-disabled>div>dd{cursor:default !important}div.matchinfo{position:relative;width:100%;padding-top:2px;height:auto;font-size:10pt;text-align:left}div.matchinfo:empty{display:none !important}div.matchinfo .view+.view{margin-top:8px !important}div.metatable,div.matchtable,div.matchtree{position:relative;background-color:#f6a800}div.button-group.button-panel.button-matchinfo{display:inline-block;margin-right:.5em}div.button-group.button-panel.button-matchinfo>span{position:relative;box-shadow:none}#pagination{position:fixed;font-size:0;right:10px;bottom:20px;z-index:35;padding:0;height:auto;line-height:0}#pagination>*{font-size:10pt !important;line-height:2em;vertical-align:bottom}#pagination>*:not(:link):not([rel=self]){color:#87888a}#pagination>*.ellipsis>span,#pagination>*[rel=prev]>span,#pagination>*[rel=next]>span{position:absolute;margin-left:-3000px;font-size:1px}#pagination>*.ellipsis::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}#pagination>*[rel=self]{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;border-left-width:2px;border-right-width:2px;border-left-style:solid;border-right-style:solid}#pagination>*[rel=prev]::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}#pagination>*[rel=next]::after{font-family:"FontAwesome";white-space:nowrap;content:"";line-height:1em}pre.query{overflow-x:hidden;padding:.5em;color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;border-width:2px;border-style:solid;border-radius:6px;box-shadow:2px 2px 2px rgba(0,0,0,.2)}pre.query:not(.unsupported){cursor:pointer}pre.query:not(.unsupported):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}pre.query:not(.unsupported):active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}pre.query.unsupported span{vertical-align:super;color:#009ee0;font-size:90%;font-weight:bold;cursor:help}#resultinfo{clear:both;text-align:right;line-height:1.5em;min-height:1.5em;margin-top:.4em;font-size:10pt}#resultinfo p.found{display:inline;padding:0;margin:0;text-align:right}#resultinfo.found{position:relative;margin-bottom:0px}#resultinfo.found .button-group>span{margin-bottom:0;border-bottom-width:0;box-shadow:none}#resultinfo.found .button-group>span:first-child{border-bottom-left-radius:0}#resultinfo.found .button-group>span:last-child{border-bottom-right-radius:0}div.result.panel .view{border:1px solid #87888a;background-color:#f6a800}.result.button-group.button-panel{display:inline-block;width:auto;vertical-align:bottom;line-height:1.5em}.result.button-group.button-panel>span{line-height:1.5em;border-width:1px 0}.result.button-group.button-panel>span:first-child{border-left-width:1px}.result.button-group.button-panel>span:last-child{border-right-width:1px}#total-results{color:#9bad0b;font-weight:bold}.no-results{margin:0 auto;text-align:center}.no-results code{font-weight:bold}.button-icon.align.left::after{content:""}.button-icon.align.right::after{content:""}.button-icon.align.center::after{content:""}.button-icon.show-kq::after{content:""}#tutorial{position:fixed;z-index:9999;top:5%;bottom:5%;left:2%;right:2%;padding-right:20px;background-color:#fefefe;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-width:4px;border-color:#616263;border-style:solid;border-radius:6px}#tutorial .button-group.button-view{background-color:#87888a;display:block;height:100%}#tutorial iframe{border-width:0;width:100%;min-height:100.1%;background-image:url("../img/korap-bg.svg");background-repeat:no-repeat;background-position:center center;background-size:15%}p.bibentry{font-size:80%;margin-left:3em;margin-bottom:3em;text-indent:-1.5em}p.bibentry cite{font-weight:bold}body.embedded{background-color:#fefefe}body.embedded aside{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding-top:0;background-color:#87888a}body.embedded aside>div{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}main.tutorial a.embedded-link::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}#koralquery{white-space:pre}#koralquery>div{background-color:#fefefe;overflow-x:auto;font-size:85%;margin-top:2pt;margin-right:20px;margin-bottom:2pt;margin-left:2pt}.alertify,.alertify-show,.alertify-log{-webkit-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-ms-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:all 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)}.alertify-hide{-webkit-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 250ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-log-hide{-webkit-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-moz-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-ms-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);-o-transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045);transition:all 500ms cubic-bezier(0.6, -0.28, 0.735, 0.045)}.alertify-cover{position:fixed;z-index:99999;top:0;right:0;bottom:0;left:0;background-color:#fff;filter:opacity(0);opacity:0}.alertify-cover-hidden{display:none}.alertify{position:fixed;z-index:99999;top:50px;left:50%;width:550px;margin-left:-275px;opacity:1}.alertify-hidden{-webkit-transform:translate(0, -150px);-moz-transform:translate(0, -150px);-ms-transform:translate(0, -150px);-o-transform:translate(0, -150px);transform:translate(0, -150px);opacity:0;display:none}:root *>.alertify-hidden{display:block;visibility:hidden}.alertify-logs{position:fixed;z-index:5000;bottom:10px;right:10px;width:300px}.alertify-logs-hidden{display:none}.alertify-log{display:block;margin-top:10px;position:relative;right:-300px;opacity:0}.alertify-log-show{right:0;opacity:1}.alertify-log-hide{-webkit-transform:translate(300px, 0);-moz-transform:translate(300px, 0);-ms-transform:translate(300px, 0);-o-transform:translate(300px, 0);transform:translate(300px, 0);opacity:0}.alertify-dialog{padding:25px}.alertify-resetFocus{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.alertify-inner{text-align:center}.alertify-text{margin-bottom:15px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:100%}.alertify-button,.alertify-button:hover,.alertify-button:active,.alertify-button:visited{background:none;text-decoration:none;border:none;line-height:1.5;font-size:100%;display:inline-block;cursor:pointer;margin-left:5px}@media only screen and (max-width: 680px){.alertify,.alertify-logs{width:90%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.alertify{left:5%;margin:0}}.alertify,.alertify-log{font-family:sans-serif}.alertify{background:#fff;border:10px solid #333;border:10px solid rgba(0,0,0,.7);border-radius:8px;box-shadow:0 3px 3px rgba(0,0,0,.3);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding-box}.alertify-text{border:1px solid #ccc;padding:10px;border-radius:4px}.alertify-button{border-radius:4px;color:#fff;font-weight:bold;padding:6px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,.5);box-shadow:inset 0 1px 0 0 rgba(255,255,255,.5);background-image:-webkit-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-ms-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:-o-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0));background-image:linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0))}.alertify-button:hover,.alertify-button:focus{outline:none;background-image:-webkit-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-moz-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-ms-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:-o-linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));background-image:linear-gradient(top, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0))}.alertify-button:focus{box-shadow:0 0 15px #2b72d5}.alertify-button:active{position:relative;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.alertify-button-cancel,.alertify-button-cancel:hover,.alertify-button-cancel:focus{background-color:#fe1a00;border:1px solid #d83526}.alertify-button-ok,.alertify-button-ok:hover,.alertify-button-ok:focus{background-color:#5cb811;border:1px solid #3b7808}.alertify-log{background:#1f1f1f;background:#000;padding:15px;border-radius:4px;color:#fff}.alertify-log-success{background:#5cb811;background:#5cb811}article.alertify-log-warn{background-color:#f6a800}article.alertify-log-warn code.src{color:#e55d00}article.alertify-log code.src{display:block;color:#000;font-size:70%}.alertify-log-error{background-color:#fe1a00}#notifications{display:none}div.notify{position:relative;margin:.5em auto;display:block;padding:.5em;border-radius:6px;max-width:30em;background-color:#fe1a00;color:#fefefe}div.notify.notify-success{background-color:#636f07}div.notify.notify-warn{background-color:#f29400}div.intro a:visited{color:#e55d00}div.intro div.announcement{background-color:#f4eebb;padding:8px;border:5px dashed #f6a800;border-radius:1em;width:90%;margin:auto}aside.active~main div.intro{margin-left:198px}div.panel{position:relative;width:100%;display:block}div.view{position:relative;padding-top:2px;display:block;width:100%}div.view:not(.show){display:none}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.introjs-overlay{position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;z-index:999999;opacity:0;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-showElement{z-index:9999999 !important}tr.introjs-showElement>td{z-index:9999999 !important;position:relative}tr.introjs-showElement>th{z-index:9999999 !important;position:relative}.introjs-disableInteraction{z-index:99999999 !important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition{position:relative}.introjs-helperLayer{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;z-index:9999998;border-radius:4px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer *:before{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer *:after{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-tooltipReferenceLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer *{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif}.introjs-helperNumberLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;color:#9e9e9e;text-align:center;padding-top:10px;padding-bottom:10px}.introjs-arrow{border:5px solid transparent;content:"";position:absolute}.introjs-arrow.top{top:-10px;left:10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;left:10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:visible;background-color:#fff;min-width:250px;max-width:300px;border-radius:5px;-webkit-box-shadow:0 3px 30px rgba(33,33,33,.3);box-shadow:0 3px 30px rgba(33,33,33,.3);-webkit-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltiptext{padding:20px}.introjs-tooltip-title{font-size:18px;margin:0;padding:0;font-weight:700;float:left;line-height:32px}.introjs-tooltip-header{padding-left:20px;padding-right:20px;padding-top:10px}.introjs-tooltip-header:after{content:".";visibility:hidden;display:block;height:0;clear:both}.introjs-tooltipbuttons{border-top:1px solid #e0e0e0;padding:10px;text-align:right;white-space:nowrap}.introjs-tooltipbuttons:after{content:"";visibility:hidden;display:block;height:0;clear:both}.introjs-button{-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.5rem 1rem;border:1px solid #bdbdbd;text-decoration:none;text-shadow:1px 1px 0 #fff;font-size:14px;color:#424242;white-space:nowrap;cursor:pointer;outline:none;background-color:#f4f4f4;border-radius:.2em;zoom:1;*display:inline}.introjs-button:hover{outline:none;text-decoration:none;border-color:#9e9e9e;background-color:#e0e0e0;color:#212121}.introjs-button:focus{outline:none;text-decoration:none;background-color:#eee;-webkit-box-shadow:0 0 0 .2rem rgba(158,158,158,.5);box-shadow:0 0 0 .2rem rgba(158,158,158,.5);border:1px solid #616161;color:#212121}.introjs-button:active{outline:none;text-decoration:none;background-color:#e0e0e0;border-color:#9e9e9e;color:#212121}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{-webkit-box-sizing:content-box;box-sizing:content-box;color:#616161;float:right;font-size:20px;cursor:pointer;font-weight:bold;line-height:1;text-align:center;padding:7px 10px}.introjs-skipbutton:hover,.introjs-skipbutton:focus{color:#212121;outline:none;text-decoration:none}.introjs-prevbutton{float:left}.introjs-nextbutton{float:right}.introjs-disabled{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-disabled:hover,.introjs-disabled:focus{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center;padding-top:10px;padding-bottom:10px}.introjs-bullets ul{-webkit-box-sizing:content-box;box-sizing:content-box;clear:both;margin:0 auto 0;padding:0;display:inline-block}.introjs-bullets ul li{-webkit-box-sizing:content-box;box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{-webkit-transition:width .1s ease-in;-o-transition:width .1s ease-in;transition:width .1s ease-in;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover,.introjs-bullets ul li a:focus{width:15px;background:#999;text-decoration:none;outline:none}.introjs-bullets ul li a.active{width:15px;background:#999}.introjs-progress{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:hidden;height:10px;margin:10px;border-radius:4px;background-color:#e0e0e0}.introjs-progressbar{-webkit-box-sizing:content-box;box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-pulse{-webkit-box-sizing:content-box;box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;animation:none}.introjs-hint-dot{-webkit-box-sizing:content-box;box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:transparent;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}.introjs-helperLayer{background-color:transparent}.introjs-tooltip{max-width:500px;min-width:400px}.customTooltip .introjs-tooltip-title{font-size:12pt;padding:20px;white-space:nowrap}.tgreeting{color:#e55d00}ul.client-list{padding-left:1.5em}ul.client-list li.client{list-style-type:none}ul.client-list li.client span.client-name::before{margin-left:-1.5em}ul.client-list li.client span.client-desc{font-size:70%;display:block}ul.client-list br{display:block;margin:3pt 0}span.client-name{font-weight:bold}span.client-name::before{font-family:"FontAwesome";white-space:nowrap;display:inline-block;width:1.5em;content:"";color:#009ee0;font-size:100%}li.token{list-style-type:none}label[for=token]{font-weight:bold}label[for=token]::before{font-family:"FontAwesome";white-space:nowrap;font-feature-settings:"ss01" on;margin-left:-1.5em;display:inline-block;width:1.5em;content:"";color:#009ee0 !important;font-size:100%;font-weight:900}section#news{background-color:#e3e8a3;mix-blend-mode:soft-light;padding:1em;padding-right:2em;border-radius:6px;border-left:5px solid #636f07}section#news dt{float:left;clear:left;width:15ex;text-align:right;font-weight:bold}section#news dd.maintenance>h4::after{font-family:"FontAwesome";white-space:nowrap;color:#c1002b;content:" "}section#news dd{margin:0 1ex 0 16ex;padding:0 0 .5em 1em}section#news dd>p{max-width:80ex;margin-block-start:0ex}section#news dd>h4{margin-block-start:0ex;margin-block-end:.33ex}@media all and (max-width: 42.5em){section#news dt{text-align:left;float:none;width:auto;padding-bottom:.2em}section#news dd{margin-left:1em}}div.view.widget{padding-right:20px}div.view.widget>iframe{margin:0;box-sizing:border-box;padding:0;width:100%;overflow-x:auto}div.panel.result>div>div.widget>iframe{background-color:#fefefe}main{padding-bottom:115pt;margin-left:40px;margin-right:20px}main.embedded{margin-left:14px;margin-right:14px}main p{text-align:justify;hyphens:auto}main h2#page-top{margin-top:0;padding-top:1em}main.page{margin-left:245px}main.page p code,main.page li code,main.page dd code,main.page dt code{background-color:#d9dadb;color:#87888a;padding:0 .5em;border-radius:6px}main p.hint{margin:0 auto;text-align:center}ul.menu.hint{display:inline-block;white-space:normal;text-align:left;max-width:23em !important;top:0}ul.menu.hint>li:first-of-type{border-top-width:1px;border-top-left-radius:0;border-top-right-radius:0}div.alert.hint{position:absolute;background-color:#fe1a00;color:#fefefe;padding:3pt 6pt;margin-top:8px;box-shadow:2px 2px 2px rgba(0,0,0,.2);width:auto;min-width:10em;max-width:23em !important;transition:opacity .2s ease 0s;border-radius:6px;border-top-left-radius:0}div.alert.hint::before{position:absolute;content:"";display:block;top:-12px;left:0;width:0;white-space:normal;border-width:0 8px 12px 0;border-style:solid;border-color:#fe1a00 transparent}.hint.mirror{position:absolute;display:block;left:0;top:0;z-index:90;white-space:pre-wrap;height:0}.hint.mirror>span{opacity:0;white-space:pre-wrap;overflow:hidden}.hint.mirror>div{position:absolute;display:block;cursor:pointer;transition:left .2s ease 0s;top:0;left:0;text-align:left;padding:0;border-top:5px solid #f6a800;height:10px;width:1.2em}.hint.mirror>div:hover:not(.active){border-top:10px solid #f6a800}.hint.mirror>div.active{border-top-width:0;height:0;width:23em}#q-field{display:block;margin-bottom:3px;width:100%;margin:0}#q-field::-webkit-search-cancel-button{display:none}#q-field.loading{background-color:#f4eebb;background-image:none}#searchbar{position:relative;width:100%;padding:0;padding-right:70px;margin-top:7pt}#searchbar button[type=submit]{position:absolute;padding:0;right:40px}#searchbar button[type=submit]:not(.loading)::after{content:""}.query.panel{padding-right:70px}.query.button-group.button-panel{display:block;width:auto;text-align:right;vertical-align:top;line-height:1.3em}.query.button-group.button-panel>span{box-shadow:none}.vc{margin-top:4pt}.vc .builder{position:initial}.vc .docGroup{position:relative;display:inline-block;margin-left:4em;padding:4pt 2pt 4pt 0pt;border-radius:12px;border-style:solid;border-width:0 .4em}.vc .docGroup .docGroup{display:block}.vc .docGroup[data-operation]>.doc:first-child::before,.vc .docGroup[data-operation]>.docGroup:first-child::before{content:none}.vc .docGroup[data-operation]>.doc::before,.vc .docGroup[data-operation]>.docGroup::before{position:absolute;display:inline-block;text-align:right;width:4em;margin-left:-4.5em;line-height:1.5em;border-top:2px solid transparent}.vc .docGroup[data-operation]>.docGroup::before{margin-left:-4.9em}.vc .docGroup[data-operation=or]>.doc::before,.vc .docGroup[data-operation=or]>.docGroup::before{content:"or"}.vc .docGroup[data-operation=and]>.doc::before,.vc .docGroup[data-operation=and]>.docGroup::before{content:"and"}.vc .docGroup>.operators{position:absolute;display:block;vertical-align:middle;top:10px;left:3px;margin-left:100%;padding:0}.vc .docGroup>.operators>span:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.vc .doc{line-height:170%;padding-left:4em}.vc .doc>span+span,.vc .doc>span+div+span,.vc .doc>span+ul+span{margin-left:5pt}.vc .doc>span.key,.vc .doc>span.value{font-weight:bold}.vc .doc>span.value[data-type=regex]{font-style:italic}.vc .doc>span.value[data-type=regex]::after,.vc .doc>span.value[data-type=regex]::before{content:"/"}.vc .doc>span.key{position:relative}.vc .doc>span.key>ul{margin:0;margin-left:3.3em}.vc .doc>span.key.fixed{color:#9bad0b}.vc .doc.unspecified>span,.vc .doc span.unspecified{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding:0 4px;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-style:solid;border-width:2px;border-radius:6px}.vc .doc>.operators{display:inline-block;margin-left:10px}.vc .rewritten .rewrite{display:inline-block;margin-left:4pt;color:#f6a800}.vc .rewritten .rewrite::after{font-family:"FontAwesome";white-space:nowrap;font-style:normal;font-weight:normal;content:"";text-decoration:underline}.vc .rewritten .rewrite>span{display:none}.vc .operators{opacity:0;white-space:nowrap;padding:0;font-size:0;line-height:0;text-align:center}.vc>.docGroup{margin-left:0}.vc .menu{display:inline-block}.vc .menu li[data-type=ref]::before,.vc span.key.ref::before{font-family:"FontAwesome";white-space:nowrap;content:"";padding-right:4pt;font-style:normal;font-weight:normal}.vc div.value{position:absolute;display:inline-block;min-width:max-content;z-index:8000;padding:4pt;margin-top:-6pt;border-radius:6px;border-width:2px;border-style:solid}.vc div.value input{border-width:0;outline-width:0}.vc div.value>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);display:inline-block;padding:0 4pt;margin-left:4pt;font-size:80%;font-style:italic;border-width:2px;border-style:solid;border-radius:6px}.vc div.value.regex>input{font-style:italic}.vc div.value.regex>div{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}.vc:not(.fragment) .docGroup,.vc:not(.fragment) .doc{color:#616263}.vc:not(.fragment) .docGroup:hover{background-color:rgba(255,255,255,.3)}.vc:not(.fragment) .doc>span:not(.fixed){cursor:pointer}.vc:not(.fragment) .doc>span:not(.fixed):hover{color:#f6a800}.vc:not(.fragment) .doc.unspecified>span:hover,.vc:not(.fragment) span.unspecified:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.vc:not(.fragment) .doc:hover>.operators,.vc:not(.fragment) .docGroup:hover>.operators{opacity:1}.vc:not(.fragment) .docGroup[data-operation]>.doc::before,.vc:not(.fragment) .docGroup[data-operation]>.docGroup::before{color:#f6a800}.vc:not(.fragment) .docGroup[data-operation=or]{border-color:#f6a800}.vc:not(.fragment) div.value{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2)}.vc:not(.fragment) div.value>div{cursor:pointer}.vc:not(.fragment) div.value>div:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}.docGroup>.operators{z-index:30}.docGroup .docGroup>.operators{z-index:31}.docGroup .docGroup .docGroup>.operators{z-index:32}.docGroup .docGroup .docGroup .docGroup>.operators{z-index:33}.docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:34}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:35}.docGroup .docGroup .docGroup .docGroup .docGroup .docGroup .docGroup>.operators{z-index:36}.vc.fragment>div>div.docGroup{margin-left:0}.vc.fragment .doc{margin-right:2em}#collection{line-height:1em;border-radius:6px}#vc-choose>span.rewritten::after{font-family:"FontAwesome";white-space:nowrap;color:#f6a800;padding:0;padding-left:4px;content:"";text-decoration:underline;font-style:normal;font-weight:normal}div#vc-view{position:relative}div#vc-view>div.vc{display:none;margin:1.3em 0 .5em 0;border:2px solid #636f07;background-color:#fefefe}div#vc-view>div.vc.active{display:block}div#vc-view>div.vc>div:first-child{padding:1.3em}div.panel.vcinfo{padding:3pt 0pt 3pt 3pt;background-color:#636f07}div.panel.vcinfo div.button-group>span{box-shadow:none}div.stattable{display:flex;flex-direction:row;margin-right:20px}div.stattable>dl{margin-bottom:4px}div.stattable>dl>div{border-color:#636f07}div.stattable>dl>div>dt{background-color:#8a9a0a;width:15em;margin:0}div.stattable>dl>div>dt::after{content:":"}div.stattable>dl>div>dd{background-color:#dce883;color:#616263}div.stattable.stdisabled dt,div.stattable.stdisabled dd{background-color:#b9c46a;color:#636f07;text-shadow:none}div.reloadStatB>span.refresh{margin-left:2pt}span.refresh::after{vertical-align:sub;content:""}@media(min-width: 1680px){div.stattable dl.flex>div{width:inherit}}div.datepicker{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:absolute;display:inline-block;z-index:90;font-size:80%;padding:4pt;box-shadow:2px 2px 2px rgba(0,0,0,.2);border-width:2px;border-style:solid;border-radius:6px}div.datepicker>div{font-size:120%;width:45%}div.datepicker>div.month{float:right}div.datepicker>div>span{display:inline-block;overflow:hidden;white-space:nowrap}div.datepicker>div>span:first-child,div.datepicker>div>span:last-child{width:15%}div.datepicker>div>span:first-child::before,div.datepicker>div>span:last-child::before{font-family:"FontAwesome";white-space:nowrap;display:inline-block;text-align:center;cursor:pointer;min-width:14px}div.datepicker>div>span:first-child::before{content:""}div.datepicker>div>span:last-child::before{content:""}div.datepicker>div>span:nth-child(2){display:inline-block;cursor:pointer;width:70%;text-align:center;text-overflow:ellipsis;border-radius:6px;border-style:solid;border-width:2px;border-color:transparent}div.datepicker>div>span:nth-child(2):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker>div>span:nth-child(2).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker table{border-collapse:separate;border-spacing:1px}div.datepicker input{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);padding-left:.4em;padding-right:.4em;background-color:#fefefe;width:100%;border-style:solid;border-width:1px}div.datepicker td{padding-left:.4em;padding-right:.4em;text-align:center;border-style:solid;border-width:1px}div.datepicker td:not(.out){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);cursor:pointer;background-color:#fefefe}div.datepicker td:not(.out).today{background-color:#bce4f7;color:#009ee0;text-shadow:none}div.datepicker td:not(.out).selected{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}div.datepicker td:not(.out):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}div.datepicker td.out{border-color:transparent}#ql-field{position:relative;background-color:#9bad0b;cursor:pointer;margin:0;outline:none;border:none;display:inline-block;color:#fff;border-width:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#ql-field:checked{outline:none}#ql-field>option{padding:0pt 2pt;outline:none}#ql-field:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}input.pipe{display:none}header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;background-color:#9bad0b;padding:8px 0 0 8px;font-size:10pt;color:#fefefe}header span.select{display:inline-block;cursor:pointer;line-height:1.8em;border-width:0;border-bottom-width:3px;border-style:solid;border-color:transparent}header span.select>span{font-weight:bold}header span.select:hover{color:#636f07;border-color:#636f07}header span.select::after{font-family:"FontAwesome";white-space:nowrap;pointer-events:none;text-align:center;content:"";padding-left:4pt;padding-right:4pt}header span.select.active{border-color:#f6a800}header span.select.active::after{content:""}header form{position:relative;display:block;padding-left:230px;min-height:2.7em;margin:0px}header input{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0}header .button{color:#fefefe;line-height:2em;margin-right:40px}header .button.right{float:right;display:inline-block}header .button.top{position:absolute;display:block;top:0;right:0;margin-right:0;width:20px;background-color:#636f07;text-align:center;height:100%;z-index:20}header .button.top>a:hover{color:#fefefe}header .button>a{color:#fefefe;cursor:pointer;position:relative;font-size:120%}header .button>a>span{position:absolute;margin-left:-3000px;font-size:1px}header .button>a::after{font-family:"FontAwesome";white-space:nowrap}header .button>a.tutorial::after{content:""}header .button>a.question::after{content:""}header .button>a.login::after{content:""}header .button>a.logout::after{content:""}.query.button-group>span{border-top-width:0;border-color:#fff}.query.button-group>span:first-child{border-top-left-radius:0}.query.button-group>span:last-child{border-top-right-radius:0}footer{background-color:#616263;position:absolute;bottom:0;padding-bottom:2px;font-size:70%;width:100%;text-align:right;display:flex;align-items:center;height:100pt}footer nav{margin-left:30px;padding:3pt 6pt;text-align:left;flex-grow:2}footer nav a{white-space:nowrap}footer div.logos{font-size:0;flex-grow:1}footer a{font-size:10pt}footer a:link{color:#d9dadb}footer a:visited{color:#d9dadb}footer a:hover{color:#fefefe}footer a[href^="http://"]::after,footer a[href^="https://"]::after{content:none}footer span.separator:after{font-size:bold;content:" | ";color:#f6a800}#logos{margin-right:40px}#ids-logo{display:inline-block;width:21.0333333333em;height:6.6666666667em;background-image:url("../img/ids-institute-for-the-german-language-white.svg")}aside.active~footer{padding-left:230px;transition:all .3s ease-in-out}aside{background-color:#636f07;color:#fefefe;width:230px;position:fixed;display:block;transition:all .3s ease-in-out;outline:none;font-size:10pt;z-index:100;top:0;left:0;height:100%;padding-top:65px}aside>div{overflow-y:auto;overflow-x:visible;max-height:100%}aside>*{opacity:1}aside::after{font-family:"FontAwesome";white-space:nowrap;position:absolute;display:block;opacity:0;cursor:pointer;right:0;bottom:0;content:"";font-size:16pt;width:16pt;height:17pt;padding:6pt;background-color:#636f07;border-top-right-radius:6px;margin-right:-20px}aside.settings::after{content:""}aside h2,aside legend{line-height:2em;text-align:center;padding:0;margin:0;font-size:100%;font-weight:bold}aside ul.nav{list-style-type:none;margin:0;font-size:10pt;text-indent:0;padding:0}aside ul.nav li{padding:0}aside ul.nav li>a{padding:3pt 6pt}aside ul.nav li>a:visited{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}aside ul.nav li.folded.active>ul{display:block}aside ul.nav li.folded>ul{display:none}aside ul.nav li.folded>ul.active{display:block !important}aside ul.nav li.active>a:link{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}aside ul.nav li>a:link{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);display:block;border-right-width:2px;border-right-style:solid}aside ul.nav li>a:link:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}aside ul.nav li h3{padding:0;margin:0;font-weight:bold;font-size:100%}aside ul.nav li>a{padding-left:6pt}aside ul.nav li li>a{padding-left:18pt}aside ul.nav li li li>a{padding-left:36pt}aside nav>ul>li>a{font-weight:bold}aside fieldset{position:relative;border-width:0}aside fieldset legend{display:none}aside fieldset input[type=text],aside fieldset input[type=password]{outline:none;font-size:11pt;border:2px solid #fefefe;padding:2px;margin:0;width:100%}aside fieldset>form>div{position:relative;width:100%;margin-top:4px;padding-right:30px}aside fieldset>p{color:#9bad0b}aside fieldset>p.announcement{color:#fefefe}aside fieldset>p.announcement>time{display:block;font-size:70%}aside fieldset hr{border:none;border-top:2px solid #d9dadb}aside fieldset ul{display:block;font-size:80%;text-align:right;padding:0;margin-top:0}aside fieldset ul>li{display:inline}aside fieldset ul>li:first-child::after{content:" | "}aside fieldset button{position:absolute;top:0;right:0}aside fieldset button::after{content:""}aside.off,aside:not(:focus):not(.active){margin-left:-210px}aside.off::after,aside:not(:focus):not(.active)::after{opacity:1}aside.off>*,aside:not(:focus):not(.active)>*{opacity:0;transition-property:opacity;transition-duration:.3s}aside.off::after{display:none}body.no-js #notifications{display:block !important}body.no-js aside{position:relative;display:block;transition:none;margin-left:0 !important;padding-top:0;width:100%;top:0}body.no-js aside>*{opacity:1 !important;transition:none}body.no-js aside form.login>input,body.no-js aside form.login>div{width:auto;margin-top:0}body.no-js aside form.login>input:first-of-type,body.no-js aside form.login>div:first-of-type{float:left;margin-right:1em}body.no-js aside form.login button{height:100%}body.no-js aside p,body.no-js aside::after{display:none}body.no-js main div.intro{margin-left:8px !important}#activate{text-align:right;background-color:#f6a800;margin-top:0;padding:8px;padding-right:40px;color:#fefefe;font-size:80%}@media all and (max-width: 42.5em){body,#search>ol,#search div.snippet>span,header,header input,div#resultinfo,#pagination>a{font-size:9pt}header{padding-right:8px}header form{padding-left:0;padding-top:33px}.vc{font-size:9pt}.vc .builder .doc{padding-left:3em}.vc .builder * .docGroup{margin-left:3em}.vc .builder>.doc{padding-left:.5em}.vc .builder>.docGroup{margin-left:.5em}h1{margin-left:0px;width:130px;height:40px;background-size:100%;background-position:50% 0;z-index:110;position:absolute !important}#searchbar{padding-right:30px;margin-top:0}#searchbar input{font-size:9pt}#searchbar button[type=submit]{right:0}.level-1{padding-bottom:2px}.level-2{padding-bottom:4px}main{margin-left:4px;margin-right:4px}header .button{margin-right:4px}header .button.top{height:auto}#search ol>li:target>div>div.snippet,#search ol>li.active>div>div.snippet{margin:2px 2em 2px 4px}#search ol>li div.meta{display:none}div.matchinfo{font-size:9pt}div.matchtable tr>*{padding:1pt 3pt}div.matchtree h6{display:block;float:none}div.matchtree>div{margin-left:2px}#logos{margin-left:0;margin-right:0}#logos>div{border-top-width:14px;padding-right:0}#logos>div .logo>*{background-size:60%;background-position:0 0}div.intro{width:100%}body.embedded aside>div{top:0;transform:translateY(0)}aside:not(:focus):not(.active){margin-left:-230px}aside:not(:focus):not(.active)::after{font-size:12pt;height:11pt;text-align:right;padding-right:3pt;padding-top:2pt}aside ul{font-size:9pt;line-height:1em}aside.active~main div.intro,aside.active~main.page{margin-left:4px !important}aside.active{position:relative;display:block;padding-top:0;width:100%;top:0;border-width:0}aside.active fieldset input{font-size:9pt}aside.active::after{display:none}aside.active p,aside.active hr{display:none}#tutorial{border-radius:0;border-width:0;right:0;left:0;bottom:0;top:0;padding:0}#tutorial iframe{border-radius:0}#tutorial>ul.action.right{height:1.5em;right:20px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}main.page{margin-right:20px}footer{padding-left:0 !important}}@media print{body,html,select,g>text{color:#000}header,aside{display:none}main.page{margin:1em}a.embedded-link{color:#000;text-decoration:underline}pre.query.tutorial{background-color:#fff;color:#000;margin-left:1em;margin-right:1em}blockquote.warning{background-color:gray;color:#fff;border-left-color:#000;border-left-width:1em}}
+
+/*# sourceMappingURL=kalamar-0.43.1.css.map */
\ No newline at end of file
diff --git a/public/css/kalamar-0.43.1.css.map b/public/css/kalamar-0.43.1.css.map
new file mode 100644
index 0000000..7777120
--- /dev/null
+++ b/public/css/kalamar-0.43.1.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fonts.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/flextable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/mixins.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/lengths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fragment.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/choose.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/colors.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/icons.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/load.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/form.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/view.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/menu.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/banner.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/showPWD.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/copyToClipboard.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/buttongroup.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/base.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/highlight.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/kwic.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/logos.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/tree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/matchtree.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/view/metatable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/matchinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/pagination.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/query.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/resultinfo.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/tutorial.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/koralquery.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-core.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify/alertify-default.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/alertify.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/intro.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/panel.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/introjs-ids.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/oauth.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/news.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/plugin.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/main/main.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/hint.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/searchbar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/vc.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/statistics.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/datepicker.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/querylanguage.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/pipe.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/header/header.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/footer/footer.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/sidebar/sidebar.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/no-js.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/media.scss"],"names":[],"mappings":"CAOA,WACE,0BACA,mDACA,wWACA,mBACA,kBCJF,QACE,aACA,mBACA,eACA,2BACA,oBACA,WACA,iBAEA,YACE,aACA,mBACA,kBACA,WACA,iBACA,mBACA,oBACA,cCXF,uBACA,mBACA,eACA,gBACA,gBACA,WDSE,eACE,gBACA,aACA,QE1BmB,QF2BnB,SAEF,eACE,gBACA,QE/BmB,QFgCnB,SACA,WACA,eACA,eACA,YE9BmB,IF+BnB,mBACA,gBACA,kBACA,uBAMN,yBACE,YACE,WAIJ,yBACE,YACE,sBAIJ,0BACE,YACE,WAIJ,0BACE,YACE,WG7DJ,8BCQE,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BF3Db,kBACA,2BAGE,aDNqB,ICOrB,mBACA,cDfqB,ICmBrB,YDXqB,MCYrB,gBACA,mBACA,aDPkB,KCUpB,gDE4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBDDE,eAIF,oEACE,iBACA,kBAIF,sEACE,oBAGF,4CACC,0BACA,QGhBe,IHiBd,kBACA,UACA,IDvCqB,IKPzB,YACE,wCACA,uBACA,sBACA,yBAGF,SAEI,2BACA,4BACA,+4BCRJ,YACE,cACA,UACA,cAEA,qBACE,aAGF,qBACE,eACA,UACA,eACA,yBACE,mBAIJ,mBACE,6BACA,cACA,iBACA,cNzBqB,IMiCvB,uBACE,cACA,gBAGF,gFAGE,eAIA,sCAEE,eACA,qBAEF,6CACE,YACA,MHzCS,QG2CX,+EACE,qBACA,SAEF,qCACE,sBAEF,0CACE,iBAIJ,oFAIE,cNtEqB,IMyEvB,uCAEE,aHpEW,QGqEX,iBHvBW,QGwBX,mBAGF,oFAIE,mBACA,qBACA,UACA,eACA,QNrFqB,IMwFvB,8BACE,eACA,iBACA,qBACA,WACA,eAGF,oEAEE,iBH/Ea,QGkFf,8BACE,aH7FW,QGgGb,4EAGE,qBACA,eACA,kBACA,kBACA,iBHlFa,QGmFb,aH1GW,QG4GX,MH5GW,QG+Gb,gCACE,yBAGF,wCACE,MHtHW,QGuHX,YAIJ,cACE,oCACA,yBACA,gCAGF,OACE,eAEA,cACE,QAGF,oBJlIA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BG8EX,mBACA,UACA,YACA,MACA,MNpJqB,KM8JrB,yBARA,wCPrJF,kBACA,oBACA,cOuJE,2BACE,0BAKF,oDJzIF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBI2IE,sCACE,YAGF,2BJ7HF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBIkIE,iCAEI,mBN9KiB,IM+KjB,yBACA,wBNvLiB,IMwLjB,2BNxLiB,IMkMzB,UACE,aAEA,gBACE,eAEA,qBACE,qBACA,kBACA,UACA,WACA,gBACA,sBACA,UACA,kBAEA,4BPtKJ,0BACA,mBOuKK,QF9LW,IEmMhB,oCACE,QFrMc,IGvBlB,aACE,iBJsDa,QKhDf,QACE,kBACA,UACA,SACA,cAEA,UAME,qBACA,4BANF,gBACE,UAQF,0CAEE,sBACA,iBACA,mBACA,YAGF,8CNfA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKlCb,6CNpBA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BK/BX,WN9BkB,2BM+BlB,eACA,QRtCqB,QQuCrB,mBAEE,aRnCmB,IQoCnB,wBACA,qBACA,mBAGJ,kBACE,cACA,cAGF,wBAEI,yBACA,aRjDmB,IQmDrB,QRzDqB,QQ0DrB,cACA,iBACA,6BACE,yBACA,cACA,kBAOJ,kBACE,kBACA,UACA,mBACA,6BACA,WACA,YACA,UACA,eACA,+BAEA,uBNpCF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBMmCI,kBACA,cACA,QACA,WACA,YAEC,kBACA,iBACA,mBAIH,8BNvEF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBMwEE,sBNtFF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKkCT,WN/FgB,2BMgGhB,kBACA,QACA,WACA,YAEE,kBACD,iBACA,mBAKL,0EAGE,4BACA,UAOF,mCAEE,oBAIA,yBAEG,iBR/HkB,IQgIlB,uBRvIkB,IQwIlB,wBRxIkB,IQ4IrB,wBAEG,oBRvIkB,IQwIlB,0BR/IkB,IQgJlB,2BRhJkB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,cACA,kBAEF,eACE,eACA,aACA,YACA,WACA,YAEF,sBACE,aAEF,cACE,cACA,gBACA,kBACA,aACA,UAEF,mBACE,QACA,UAEF,mBACE,sCACA,mCACA,kCACA,iCACA,8BACA,UAEF,iBACE,aAEF,qBACE,SACA,mBACA,WACA,YACA,gBACA,UACA,kBACA,UAEF,gBACE,kBAEF,eACE,mBACA,WACA,8BACA,2BACA,sBACA,eAIF,yFAIE,gBACA,qBACA,YAEA,gBACA,eACA,qBACA,eACA,gBAGF,0CACE,yBAEE,UACA,8BACA,2BACA,sBAEF,UACE,QACA,UCnIJ,wBAEE,uBAEF,UACE,gBACA,uBACA,iCACA,kBACA,oCACA,gCACA,6BACA,4BAEF,eACE,sBACA,aACA,kBAEF,iBACE,kBACA,WACA,iBACA,iBACA,qBACA,qCACA,gDACA,gGACA,6FACA,4FACA,2FACA,wFAEF,8CAEE,aACA,oFACA,iFACA,gFACA,+EACA,4EAEF,uBACE,4BAEF,wBACE,kBACA,qEAEF,oFAGE,yBACA,yBAEF,wEAGE,yBACA,yBAGF,cACE,mBAEA,gBACA,aACA,kBACA,WAUF,sBACE,mBAEA,mBC5EF,0BACE,iB1BDa,Q0BEb,mCACE,M1BmBa,Q0BfjB,8BACE,cACA,M1BgDW,K0B/CX,cAGF,oBACE,iB1B4CW,Q0BzCb,eACE,aAKF,WACE,kBACA,iBACA,cACA,aAEA,c7BjCuB,I6BkCvB,eACA,iB1B2BW,Q0B1BX,M1BiBa,Q0BhBb,0BACE,iB1B5BW,Q0B8Bb,uBACE,iB1BpCW,Q2BDb,oBACE,M3BqBa,Q2BlBf,2BACE,iB3Baa,Q2BZb,Q9BPqB,I8BQrB,0BACA,kBACA,UACA,YAIJ,4BACE,kBCjBF,UACE,kBACA,WACA,cAGF,SACE,kBACA,Y/BHuB,I+BIvB,cACA,WAGF,oBACE,aCfF,gCACE,GACE,2BACQ,mBACR,UACF,IACE,2BACQ,mBACR,WACF,IACE,6BACQ,qBACR,WACF,IACE,6BACQ,qBACR,WACF,KACE,2BACQ,mBACR,WACJ,wBACE,GACE,2BACQ,mBACR,UACF,IACE,2BACQ,mBACR,WACF,IACE,6BACQ,qBACR,WACF,IACE,6BACQ,qBACR,WACF,KACE,2BACQ,mBACR,WAEJ,iBACE,kBACA,+BACQ,uBACR,eACA,UACA,oCACA,+BACA,4BAEF,qBACE,2BAEF,0BACE,2BACA,kBAEF,0BACE,2BACA,kBAEF,4BACE,4BACA,kBACA,sBACA,UACA,wBAEF,0BACE,kBAEF,qBACE,+BACQ,uBACR,kBACA,gBACA,kBACA,oCACA,+BACA,4BACA,uBACE,+BACQ,uBACR,8BACE,+BACQ,uBACV,6BACE,+BACQ,uBAEd,+BACE,gGACA,+BACQ,uBACR,kBACA,kBACA,kBACA,6BACA,oCACA,+BACA,4BACA,iCACE,gGAEJ,2BACE,gGACA,cACA,kBACA,iBACA,oBAEF,eACE,6BACA,WACA,kBAEF,mBACE,UACA,UACA,yBAEF,yBACE,UACA,WACA,yBAEF,0BACE,UACA,SACA,iBACA,yBAEF,qBACE,YACA,SACA,uBAEF,4BACE,YACA,YACA,uBAEF,sBACE,aACA,UACA,sBAEF,4BACE,aACA,WACA,sBAEF,6BACE,aACA,SACA,iBACA,sBAEF,oBACE,WACA,SACA,wBAEF,2BACE,WACA,YACA,wBAEF,iBACE,+BACQ,uBACR,kBACA,mBACA,sBACA,gBACA,gBACA,kBACA,gDACQ,wCACR,wCACA,mCACA,gCAEF,qBACE,aAEF,uBACE,eACA,SACA,UACA,gBACA,WACA,iBAEF,wBACE,kBACA,mBACA,iBACA,8BACE,YACA,kBACA,cACA,SACA,WAEJ,wBACE,6BACA,aACA,iBACA,mBACA,8BACE,WACA,kBACA,cACA,SACA,WAEJ,gBACE,+BACQ,uBACR,kBACA,iBACA,qBACA,mBACA,yBACA,qBACA,2BACA,eACA,cACA,mBACA,eACA,aACA,yBACA,mBACA,OACA,gBACA,sBACE,aACA,qBACA,qBACA,yBACA,cACF,sBACE,aACA,qBACA,sBACA,oDACQ,4CACR,yBACA,cACF,uBACE,aACA,qBACA,yBACA,qBACA,cACF,kCACE,UACA,SAEJ,oBACE,+BACQ,uBACR,cACA,YACA,eACA,eACA,iBACA,cACA,kBACA,iBACA,oDACE,cACA,aACA,qBAEJ,oBACE,WAEF,oBACE,YAEF,kBACE,cACA,qBACA,wBACQ,gBACR,eACA,yBACA,sBACA,qBACA,gDACE,cACA,qBACA,wBACQ,gBACR,eACA,yBACA,sBACA,qBAEJ,gBACE,aAEF,iBACE,kBACA,iBACA,oBACA,oBACE,+BACQ,uBACR,WACA,gBACA,UACA,qBACA,uBACE,+BACQ,uBACR,gBACA,WACA,aACA,yBACE,qCACA,gCACA,6BACA,+BACQ,uBACR,cACA,UACA,WACA,gBACA,mBACA,qBACA,eACA,8DACE,WACA,gBACA,qBACA,aACJ,gCACE,WACA,gBAER,kBACE,+BACQ,uBACR,gBACA,YACA,YACA,kBACA,yBAEF,qBACE,+BACQ,uBACR,WACA,SACA,YACA,eACA,iBACA,kBACA,sBAEF,wBACE,kBACA,SACA,QACA,SACA,QAEF,sBACE,eAEF,cACE,+BACQ,uBACR,kBACA,uBACA,WACA,YACA,eACA,oBACE,SACA,UACF,wCACE,oCAEJ,kBACE,aAEF,mBACE,eAEF,oBACE,+BACQ,uBACR,WACA,YACA,oCACA,mBACA,uCACA,WACA,kBACA,oCACA,+BACA,4BAEF,wCACE,uBACQ,eAEV,kBACE,+BACQ,uBACR,wCACA,uBACA,mBACA,YACA,WACA,2CACQ,mCACR,2CACQ,mCACR,kBACA,UACA,WACA,UACA,UC7aF,qBACI,6BAGJ,iBACI,gBACA,gBAGJ,sCACI,eACA,aACA,mBAIJ,WACI,M9BOa,Q+BxBjB,eACE,mBAEA,yBACE,qBAEA,kDACE,mBAGF,0CACE,cACA,cAIJ,kBACI,cACA,aAIN,iBACE,iBAEA,yBnCiBA,0BACA,mBmChBE,qBACA,YACA,Q9BFc,I8BGd,M/BxBW,Q+ByBX,eAIJ,SACI,qBAIJ,iBACI,iBAEF,yBnCDA,0BACA,mBmCEE,gCACA,mBACA,qBACA,YACA,Q9BlBc,I8BmBd,yBACA,eACA,gBCvDJ,aACE,iBhCWa,QgCVb,0BACA,YACA,kBACA,cnCJuB,ImCKvB,8BAEA,gBACE,WACA,WACA,WACA,iBACA,iBAGF,sCpC6BA,0BACA,mBoC5BE,MhCLW,QgCMX,aAGF,gBACE,oBACA,qBACA,kBACE,eACA,uBAGF,mBACE,uBACA,uBAKN,mCAEI,gBACE,gBACA,WACA,WACA,oBAEF,gBACE,iBC5CN,gBACE,cpCaoB,KoCXpB,uBACE,SACA,sBACA,UACA,WACA,gBAIJ,uCACE,iBjCuCa,QkCnCf,KACE,qBAGE,YrCTkB,KqCUlB,kBAGF,cAEI,iBACA,kBAIJ,OACE,mBACA,aAGF,iBACE,aACA,gBAGF,UACE,kBAKE,uEACE,iBlC3CO,QkC4CP,MlC7CO,QkC8CP,eACA,crCrDiB,IqC0DvB,YACE,cACA,kBC1DJ,aACE,qBACA,mBACA,gBACA,0BACA,MAEA,8BAEI,qBACA,yBACA,0BAMN,eACE,kBACA,iBnCyCW,QmCxCX,MnC+Ba,QmC9Bb,QtCtBuB,QsCuBvB,eACA,WpClBoB,2BoCmBpB,WACA,eACA,0BACA,+BAGE,ctChCqB,IsCiCrB,yBAGF,uBACE,kBACA,WACA,cACA,UACA,OACA,QACA,mBAEE,0BACA,mBACA,iCAMN,aACE,kBACA,cACA,OACA,MACA,WACA,qBACA,SAEA,kBACE,UACA,qBACA,gBAIF,iBACE,kBACA,cACA,eACA,4BACA,MACA,OACA,gBACA,UACA,6BACA,YACA,YAEA,oCACE,8BAGF,wBACE,mBACA,SACA,WCtFN,SACE,cACA,kBACA,WACA,SAEA,uCACE,aAGF,iBAEI,iBpCOW,QoCNX,sBAMN,WACE,kBACA,WACA,UACA,mBACA,eAEA,+BACE,kBACA,UACA,MvCnBkB,KuCqBlB,oDACE,QnCxBY,ImC6BlB,aACE,mBAKF,iCACE,cACA,WACA,iBACA,mBACA,kBAEA,sCACE,gBC/CJ,IACE,eAEA,aACE,iBAGF,cACE,kBACA,qBACA,YAdW,IAeX,wBAOE,mBACA,mBACA,oBAPF,wBACE,cAWA,mHAEE,aAGF,2FAEE,kBACA,qBACA,iBACA,MAvCO,IAwCP,mBACA,kBACA,iCAGF,gDACE,mBAMF,iGAGE,aAMF,mGAGE,cAQJ,yBACE,kBACA,cACA,sBACA,SACA,SACA,iBACA,UAEA,0CAEI,yBACA,4BAUR,SACE,iBACA,aAhGW,IAoGT,gEAGE,gBAGF,sCAEE,iBAGF,qCACE,kBAEA,yFAEE,YAIJ,kBACE,kBAEA,qBACE,SACA,kBAGF,wBACE,MrClGO,QqCwGb,oDtC5HF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCyET,cACA,WtCvIgB,2BsC0Id,mBACA,axC3IiB,IwC4IjB,cxCnJiB,IwCwJrB,oBACE,qBACA,iBAIJ,wBACE,qBACA,gBACA,MrC7JW,QqC8JX,+BzCtHF,0BACA,mByCuHI,kBACA,mBACA,QpC1JY,IoC2JZ,0BAGF,6BACE,aAOJ,eACE,UACA,mBACA,UACA,YACA,cACA,kBAGF,cACE,cAGF,UACE,qBAIF,6DzCxJA,0BACA,mByC0JE,QpCzKc,IoC0Kd,kBAEE,kBACA,mBAIJ,cACE,kBACA,qBACA,sBACA,aACA,YACA,gBAGE,cxCxNmB,IwCyNnB,axClNmB,IwCmNnB,mBAGF,oBACE,eACA,gBAGF,kBtCpNF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCgKT,qBACA,cACA,gBAGE,cACA,kBAIA,axCvOiB,IwCwOjB,mBACA,cxChPiB,IwCqPnB,0BACE,kBAGF,wBtC3MJ,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBsCoNA,qDAEE,MrCnNW,QqC0Nb,mCACE,sCAGF,yCACE,eACA,+CACE,MrCjRS,QqCwRX,yFtCnQF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBsCsQE,uFACE,UAMA,yHAEE,MrCvSO,QqC0SX,gDACE,arC3SS,QqC+Sb,6BtCrSA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BqCiPX,WtC9SkB,2BsCgTlB,iCACE,eACA,uCtChSJ,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBsC0SA,qBACE,QAHQ,GAMR,+BACE,WAGA,yCACE,WAGA,mDACE,WAGA,6DACE,WAGA,uEACE,WAGA,iFACE,WAWd,8BACE,cAEF,kBACE,iBAIJ,YACE,gBACA,cxCpXuB,IwCuXzB,iCzC3UE,0BACA,mByC4UA,MrCrXa,QqCsXb,UACA,iBACA,QpChXgB,IoCiXhB,0BACA,kBACA,mBAGF,YACE,kBAEA,mBACE,aACA,sBACA,yBACA,iBrCpVW,QqCsVX,0BACE,cAGF,mCACE,cAKN,iBACE,wBACA,iBrC7Ya,QqC+Yb,uCACE,gBCtZJ,cACE,aACA,mBACA,azCQoB,KyCJpB,iBACE,kBAEA,qBACE,atCLS,QsCOT,wBACE,iBtCeS,QsCdT,WACA,SAEA,+BACE,YAGJ,wBACE,iBtCQS,QsCPT,MtCwBO,QsClBX,wDAEE,yBACA,MtC3BS,QsC4BT,iBAON,6BACE,gBAGF,oBACE,mBACA,QrCpBgB,IqCyBlB,0BACE,0BACE,eCrDJ,exCSE,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BuC7Db,kBACA,qBACA,WACA,cACA,YACA,WxCLoB,2BwCQlB,a1CRqB,I0CSrB,mBACA,c1CjBqB,I0CoBvB,mBACE,eACA,UAEA,yBACE,YAGF,wBACE,qBACA,gBACA,mBAEA,uEAEC,UACA,uF3CQL,0BACA,mB2CPO,qBACA,kBACA,eACA,eAIH,4CACC,QtCrCW,IsCwCZ,2CACC,QtCxCW,IsC2CZ,qCACC,qBACA,eACA,UACA,kBACA,uBAGE,c1C7DgB,I0C8DhB,mBACA,a1CxDgB,I0CyDhB,yBAGF,2CxC1CL,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBwC2CK,8CxCzBL,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBwC6BA,qBACE,yBACA,mBAGF,qBxCrEA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BJjCb,kBACA,mB2CkDE,iBvCjCW,QuCkCX,WAGE,mBACA,iBAIJ,kB3C5DA,kBACA,mB2C6DE,kBAGE,mBACA,iBAGF,4BxC1FF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BuCsCT,eACA,iBvCtDS,QuCwDT,kCACC,iBvCrGQ,QuCsGR,MvCvGQ,QuCwGR,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","file":"kalamar-0.43.1.css"}
\ No newline at end of file
diff --git a/public/css/kalamar-plugin-0.2.2.css b/public/css/kalamar-plugin-0.2.2.css
new file mode 100644
index 0000000..31ef8a5
--- /dev/null
+++ b/public/css/kalamar-plugin-0.2.2.css
@@ -0,0 +1,3 @@
+﻿@font-face{font-family:"FontAwesome";src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media(min-width: 640px){dl.flex>div{width:50%}}@media(min-width: 800px){dl.flex>div{width:33.3333333333%}}@media(min-width: 1200px){dl.flex>div{width:25%}}@media(min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:"FontAwesome";content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:":";color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:"*"}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px;font-size:1px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:"FontAwesome";white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.non-item:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.non-item:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}ul.menu>li,ul.menu>span.non-item:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu span.non-item.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu span.non-item:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu span.non-item{border-radius:6px;border-width:2px !important}ul.menu span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.entry:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.pref:not(:empty)~span.entry:not(:empty){bottom:-27px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:""}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}ul.containermenu>ul.menu.container{bottom:0;transform:translateY(100%);margin-bottom:-0.3em}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}input.show-pwd{padding-right:2em}a.show-pwd::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:-1.5em;margin-top:.6em;font-size:130%}a.show-pwd.hide::after{content:""}a.copy-to-clipboard::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:.4em;margin-top:.6em;font-size:130%}.button-group{font-size:0}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a,.button-group.operators>span,.button-group.operators input[type=submit],.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:not(.inactive):hover,.button-group.button-panel input[type=submit]:not(.inactive):hover,.button-group.button-panel a:not(.inactive):hover,.button-group.operators>span:not(.inactive):hover,.button-group.operators input[type=submit]:not(.inactive):hover,.button-group.operators a:not(.inactive):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}.button-group.button-panel>span:first-child,.button-group.button-panel input[type=submit]:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators input[type=submit]:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel input[type=submit]:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators input[type=submit]:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a{margin-top:0;width:auto;min-width:auto}.button-group.button-panel>span>span.check,.button-group.button-panel input[type=submit]>span.check,.button-group.button-panel a>span.check{font-family:"FontAwesome";white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel input[type=submit]>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel input[type=submit]>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel input[type=submit]>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px;font-size:1px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:"FontAwesome";white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px;font-size:1px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana,tahoma,arial,Helvetica,sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100vh}body{position:relative;min-height:100vh;font-size:12pt;margin:0;padding:0}a:visited{color:#e55d00}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color .3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}a[onclick$="return PArok(this,false)"]{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$="return PArok(this,false)"]>span:nth-child(1n+2){display:none}a[onclick$="return PArok(this,false)"]>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}body{margin:0;padding:0}body h1{font-size:110%;background-color:#f6a800;color:#fff;margin-top:0;padding:8px}body section{padding-left:8px;padding-bottom:8px}body section::before{content:""}
+
+/*# sourceMappingURL=kalamar-plugin-0.2.2.css.map */
\ No newline at end of file
diff --git a/public/css/kalamar-plugin-0.2.2.css.map b/public/css/kalamar-plugin-0.2.2.css.map
new file mode 100644
index 0000000..bd993a0
--- /dev/null
+++ b/public/css/kalamar-plugin-0.2.2.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fonts.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/flextable.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/mixins.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/lengths.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/fragment.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/choose.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/colors.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/icons.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/load.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/form.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/view.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/menu.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/banner.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/showPWD.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/copyToClipboard.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/buttongroup.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/base/base.scss","file:///C:/Users/marcr/Desktop/KorAp/Git/Kalamar/dev/scss/plugin.scss"],"names":[],"mappings":"CAOA,WACE,0BACA,mDACA,wWACA,mBACA,kBCJF,QACE,aACA,mBACA,eACA,2BACA,oBACA,WACA,iBAEA,YACE,aACA,mBACA,kBACA,WACA,iBACA,mBACA,oBACA,cCXF,uBACA,mBACA,eACA,gBACA,gBACA,WDSE,eACE,gBACA,aACA,QE1BmB,QF2BnB,SAEF,eACE,gBACA,QE/BmB,QFgCnB,SACA,WACA,eACA,eACA,YE9BmB,IF+BnB,mBACA,gBACA,kBACA,uBAMN,yBACE,YACE,WAIJ,yBACE,YACE,sBAIJ,0BACE,YACE,WAIJ,0BACE,YACE,WG7DJ,8BCQE,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BF3Db,kBACA,2BAGE,aDNqB,ICOrB,mBACA,cDfqB,ICmBrB,YDXqB,MCYrB,gBACA,mBACA,aDPkB,KCUpB,gDE4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBDDE,eAIF,oEACE,iBACA,kBAIF,sEACE,oBAGF,4CACC,0BACA,QGhBe,IHiBd,kBACA,UACA,IDvCqB,IKPzB,YACE,wCACA,uBACA,sBACA,yBAGF,SAEI,2BACA,4BACA,+4BCRJ,YACE,cACA,UACA,cAEA,qBACE,aAGF,qBACE,eACA,UACA,eACA,yBACE,mBAIJ,mBACE,6BACA,cACA,iBACA,cNzBqB,IMiCvB,uBACE,cACA,gBAGF,gFAGE,eAIA,sCAEE,eACA,qBAEF,6CACE,YACA,MHzCS,QG2CX,+EACE,qBACA,SAEF,qCACE,sBAEF,0CACE,iBAIJ,oFAIE,cNtEqB,IMyEvB,uCAEE,aHpEW,QGqEX,iBHvBW,QGwBX,mBAGF,oFAIE,mBACA,qBACA,UACA,eACA,QNrFqB,IMwFvB,8BACE,eACA,iBACA,qBACA,WACA,eAGF,oEAEE,iBH/Ea,QGkFf,8BACE,aH7FW,QGgGb,4EAGE,qBACA,eACA,kBACA,kBACA,iBHlFa,QGmFb,aH1GW,QG4GX,MH5GW,QG+Gb,gCACE,yBAGF,wCACE,MHtHW,QGuHX,YAIJ,cACE,oCACA,yBACA,gCAGF,OACE,eAEA,cACE,QAGF,oBJlIA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BG8EX,mBACA,UACA,YACA,MACA,MNpJqB,KM8JrB,yBARA,wCPrJF,kBACA,oBACA,cOuJE,2BACE,0BAKF,oDJzIF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBI2IE,sCACE,YAGF,2BJ7HF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBIkIE,iCAEI,mBN9KiB,IM+KjB,yBACA,wBNvLiB,IMwLjB,2BNxLiB,IMkMzB,UACE,aAEA,gBACE,eAEA,qBACE,qBACA,kBACA,UACA,WACA,gBACA,sBACA,UACA,kBAEA,4BPtKJ,0BACA,mBOuKK,QF9LW,IEmMhB,oCACE,QFrMc,IGvBlB,aACE,iBJsDa,QKhDf,QACE,kBACA,UACA,SACA,cAEA,UAME,qBACA,4BANF,gBACE,UAQF,0CAEE,sBACA,iBACA,mBACA,YAGF,8CNfA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKlCb,6CNpBA,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BK/BX,WN9BkB,2BM+BlB,eACA,QRtCqB,QQuCrB,mBAEE,aRnCmB,IQoCnB,wBACA,qBACA,mBAGJ,kBACE,cACA,cAGF,wBAEI,yBACA,aRjDmB,IQmDrB,QRzDqB,QQ0DrB,cACA,iBACA,6BACE,yBACA,cACA,kBAOJ,kBACE,kBACA,UACA,mBACA,6BACA,WACA,YACA,UACA,eACA,+BAEA,uBNpCF,MCpCa,QDqCb,iBCbe,QDcf,aCtCa,QDuCb,iBMmCI,kBACA,cACA,QACA,WACA,YAEC,kBACA,iBACA,mBAIH,8BNvEF,MC4Ba,QD3Bb,iBCtBa,QDuBb,aCFe,QDGf,iBMwEE,sBNtFF,MCsCa,QDrCb,iBCRa,QDSb,aCVa,QDWb,YCmDa,6BKkCT,WN/FgB,2BMgGhB,kBACA,QACA,WACA,YAEE,kBACD,iBACA,mBAKL,0EAGE,4BACA,UAOF,mCAEE,oBAIA,yBAEG,iBR/HkB,IQgIlB,uBRvIkB,IQwIlB,wBRxIkB,IQ4IrB,wBAEG,oBRvIkB,IQwIlB,0BR/IkB,IQgJlB,2BRhJkB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","file":"kalamar-plugin-0.2.2.css"}
\ No newline at end of file
diff --git a/public/css/kalamar-plugin-latest.css b/public/css/kalamar-plugin-latest.css
new file mode 100644
index 0000000..1a3dc27
--- /dev/null
+++ b/public/css/kalamar-plugin-latest.css
@@ -0,0 +1,3 @@
+﻿@font-face{font-family:"FontAwesome";src:url("../font/fontawesome-webfont.eot?v=4.3.0");src:url("../font/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../font/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../font/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../font/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../font/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}dl.flex{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;width:auto;padding-bottom:0}dl.flex>div{display:flex;flex-direction:row;text-align:center;width:100%;border-width:1px;border-style:solid;align-items:stretch}dl.flex>div>*{text-overflow:ellipsis;white-space:nowrap;max-width:25em;overflow:hidden;padding:1px 6px;margin:0px}dl.flex>div>dt{text-align:left;width:12.5em;padding:3pt 6pt;margin:0}dl.flex>div>dd{text-align:left;padding:3pt 6pt;margin:0;width:100%;max-width:none;max-height:6em;margin-left:2px;white-space:normal;overflow-y:auto;overflow-x:hidden;text-overflow:ellipsis}@media(min-width: 640px){dl.flex>div{width:50%}}@media(min-width: 800px){dl.flex>div{width:33.3333333333%}}@media(min-width: 1200px){dl.flex>div{width:25%}}@media(min-width: 1680px){dl.flex>div{width:20%}}.vc.fragment,p.query.fragment{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);position:relative;padding:4pt 6pt !important;border-width:2px;border-style:solid;border-radius:6px;margin-left:180px;margin-top:.5em;margin-bottom:.5em;margin-right:20px}.vc.fragment:hover,p.query.fragment:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;cursor:pointer}.vc.fragment>span:first-of-type,p.query.fragment>span:first-of-type{font-weight:bold;padding-right:4pt}.vc.fragment>span:nth-of-type(2),p.query.fragment>span:nth-of-type(2){padding-right:1.2em}.vc.fragment::after,p.query.fragment::after{font-family:"FontAwesome";content:"";position:absolute;right:4pt;top:2px}div.loading{background-color:transparent !important;height:16px !important;width:16px !important;margin:0 auto !important}.loading{background-position:center;background-repeat:no-repeat;background-image:url("data:image/gif;base64,R0lGODlhEAAQAIABAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48Hzh2UngyGvet6OpmKWmBb5TI+LlTOlAAACH5BAkEAAEALAAAAAAQABAAAAIohA+hu3gMnXyBqnkNw1XDnHThZ32bd6LUg0SOOIJsCaPmtOJvrctHAQAh+QQJBAABACwAAAAAEAAQAAACKYQPobt44QyM01VW0cVNPq48nxZKGLkxqGiungmyCXh9nRUleSZrO10AACH5BAkEAAEALAAAAAAQABAAAAIohA8RyKwN04pSWdumufp0niHghnkPyaWmqZLsKL3QWXUrJdpo66RKAQAh+QQJBAABACwAAAAAEAAQAAACJoQPEcisDdOKUlnbrp4IH989n1iBJUhK47itxkbGsEvRtXq/8B4UACH5BAkEAAEALAAAAAAQABAAAAIphA8RyKwN04pSWdvuNPto1HEX6G1YOYrain5im0pQ/GSnTIFr7eyhUQAAIfkECQQAAQAsAAAAABAAEAAAAiqMf6ALwWoelJFS5CbESTdeNUu3jWP4IWe2qS0TsmC8cuZFsrAkWrgtKQAAIfkECQQAAQAsAAAAABAAEAAAAiiMf6AL6LwMnDFQVG9SkrveWN6XjR82Mmi4cdMTvWsjnyIV4rIOgUwBACH5BAkEAAEALAAAAAAQABAAAAImjH+gC8HrXpNTxoeuzkltrkFg6BnMiJxpaYpWV76jDFKujV14LBUAIfkEAR4AAQAsAAAAABAAEAAAAiSEDxHIrA3TilJZ266eaN/8HJixdd4nailXgafrwSUVUqltQgUAOw==")}.form-table{display:block;padding:0;font-size:80%}.form-table>fieldset{margin-top:0}.form-table fieldset{border-width:0;padding:0;margin-top:1em}.form-table fieldset>div{white-space:nowrap}.form-table legend{background-color:transparent;margin-left:0;font-weight:bold;border-radius:6px}.form-table label[for]{display:block;text-align:left}.form-table label[for],.form-table input[type=submit],.form-table a.form-button{margin-top:2em}.form-table fieldset.form-line legend{font-size:100%;display:inline-block}.form-table fieldset.form-line legend::after{content:":";color:#e3e8a3}.form-table fieldset.form-line input,.form-table fieldset.form-line label[for]{display:inline-block;margin:0}.form-table fieldset.form-line input{vertical-align:bottom}.form-table fieldset.form-line label[for]{margin-right:2em}.form-table input,.form-table textarea,.form-table button,.form-table a.form-button{border-radius:6px}.form-table input,.form-table textarea{border-color:#d9dadb;background-color:#fefefe;border-style:solid}.form-table input,.form-table textarea,.form-table select,.form-table a.form-button{border-style:solid;display:inline-block;width:20%;min-width:20em;padding:8px}.form-table input[type=radio]{display:inline;text-align:right;background-color:red;width:auto;min-width:auto}.form-table input[readonly=readonly],.form-table textarea[readonly]{background-color:#f4eebb}.form-table .field-with-error{border-color:#c1002b}.form-table input[type=submit],.form-table button,.form-table a.form-button{display:inline-block;cursor:pointer;border-width:thin;text-align:center;background-color:#8a9a0a;border-color:#636f07;color:#636f07}.form-table a.form-button:hover{color:inherit !important}.form-table label.field-required::after{color:#009ee0;content:"*"}.button-abort{background-color:#ffd080 !important;color:#e55d00 !important;border-color:#e55d00 !important}button{cursor:pointer}button+button{right:0}button[type=submit]{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);font-weight:normal;padding:0;height:100%;top:0;width:30px;border:2px solid #fefefe}button[type=submit]>span:nth-of-type(1){position:absolute;margin-left:-3000px;font-size:1px}button[type=submit]::after{font-family:"FontAwesome"}button[type=submit]:hover,button[type=submit]:focus{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}button[type=submit]::-moz-focus-inner{border:none}button[type=submit]:active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}button[type=submit]:last-of-type{border-right-width:2px;border-right-style:solid;border-top-right-radius:6px;border-bottom-right-radius:6px}.checkbox{display:none}.checkbox+label{cursor:pointer}.checkbox+label span{display:inline-block;border-radius:4px;width:1em;height:1em;line-height:1em;vertical-align:middle;padding:0;margin-right:.2em}.checkbox+label span::after{font-family:"FontAwesome";white-space:nowrap;content:""}.checkbox:checked+label span::after{content:""}.result-view{background-color:#fefefe}ul.menu{position:absolute;padding:0;margin:0;text-indent:0;opacity:0;list-style-type:none;list-style-position:outside}ul.menu.visible{opacity:1}ul.menu,ul.menu>span.non-item:not(:empty){box-sizing:border-box;text-shadow:none;font-weight:normal;z-index:120}ul.menu>li,ul.menu>span.non-item:not(.active){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5)}ul.menu>li,ul.menu>span.non-item:not(:empty){color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);cursor:pointer;padding:3pt 6pt;white-space:normal;border-width:2px;border-bottom-width:0px;border-top-width:0px;border-style:solid}ul.menu span.desc{display:block;font-size:75%}ul.menu div.lengthField{border-color:transparent;border-width:2px;overflow:hidden;padding:3pt 6pt;padding-top:0;padding-bottom:0}ul.menu div.lengthField span{display:block !important;line-height:0;color:transparent}ul.menu>div.ruler{position:absolute;right:0px;margin-right:-14px;background-color:transparent;width:14px;height:100%;opacity:0;cursor:pointer;transition:opacity .5s ease 1s}ul.menu>div.ruler>span{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none;position:absolute;display:block;right:0;width:10px;z-index:115;border-radius:4px;border-width:2px;border-style:solid}ul.menu>div.ruler.active>span{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu>div.ruler>div{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);position:absolute;right:0;width:10px;height:100%;border-radius:4px;border-width:2px;border-style:solid}ul.menu:active>div.ruler,ul.menu:hover>div.ruler,ul.menu>div.ruler.active{transition:opacity .1s ease;opacity:1}ul.menu>li,ul.menu div.lengthField{padding-right:1.6em}ul.menu>li:first-of-type{border-top-width:2px;border-top-left-radius:6px;border-top-right-radius:6px}ul.menu>li:last-of-type{border-bottom-width:2px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}ul.menu>li mark{text-decoration:underline;background-color:transparent;color:inherit;font-weight:bold}ul.menu>li.active,ul.menu span.non-item.active{color:#636f07;background-color:#9bad0b;border-color:#636f07;text-shadow:none}ul.menu>li:hover,ul.menu span.non-item:hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none}ul.menu span.non-item{border-radius:6px;border-width:2px !important}ul.menu span.pref:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.entry:not(:empty){position:absolute;min-width:5px;font-size:80%;left:0;bottom:0;display:block;margin-bottom:-2.1em;padding:2px 6px}ul.menu span.pref:not(:empty)~span.entry:not(:empty){bottom:-27px}ul.menu.roll>li:first-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;top:.4em}ul.menu.roll>li:last-of-type:not(.no-more):before{position:absolute;font-family:"FontAwesome";content:"";right:.5em;bottom:.4em}ul.menu.roll:not(.visible){height:0}ul.menu.sort{position:relative;display:inline-block}ul.menu.sort>li::before{content:""}ul.menu.sort>li.active:hover{color:#fefefe;background-color:#c1002b;border-color:#000;text-shadow:none}span.menu.select>span{z-index:105}span.menu.select>ul.menu.roll{display:none;z-index:-100}span.menu.select>ul.menu.roll.visible{display:block;z-index:110}ul.containermenu>ul.menu.container{bottom:0;transform:translateY(100%);margin-bottom:-0.3em}.banner{position:fixed;width:10em;height:10em;overflow:hidden;margin:0;padding:0;right:0px;margin-right:-2.4em;top:0}.banner::after{content:attr(data-note);display:block;overflow:hidden;width:12em;font-size:10pt;font-weight:bold;word-spacing:2px;text-decoration:none;position:relative;left:2em;top:-1.6em;line-height:2em;text-align:center;-moz-transform-origin:0 0;-moz-transform:rotate(45deg);-webkit-transform-origin:0 0;-webkit-transform:rotate(45deg);-ms-transform-origin:0 0;-ms-transform:rotate(45deg);transform-origin:0 0;transform:rotate(45deg);background-color:#f4eebb;color:#f6a800;border:1px solid #f6a800}input.show-pwd{padding-right:2em}a.show-pwd::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:-1.5em;margin-top:.6em;font-size:130%}a.show-pwd.hide::after{content:""}a.copy-to-clipboard::after{position:absolute;font-family:"FontAwesome";white-space:nowrap;width:1em;content:"";cursor:pointer;margin-left:.4em;margin-top:.6em;font-size:130%}.button-group{font-size:0}.button-group>span{cursor:pointer}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a,.button-group.operators>span,.button-group.operators input[type=submit],.button-group.operators a{color:#616263;background-color:#d9dadb;border-color:#87888a;text-shadow:1px 1px rgba(255,255,255,.5);box-shadow:2px 2px 2px rgba(0,0,0,.2);font-size:9pt;font-weight:normal;line-height:1.5em;padding:0 4px;display:inline-block;border-style:solid;border-width:2px 0}.button-group.button-panel>span:not(.inactive):hover,.button-group.button-panel input[type=submit]:not(.inactive):hover,.button-group.button-panel a:not(.inactive):hover,.button-group.operators>span:not(.inactive):hover,.button-group.operators input[type=submit]:not(.inactive):hover,.button-group.operators a:not(.inactive):hover{color:#fefefe;background-color:#f6a800;border-color:#ff8000;text-shadow:none;transition:none}.button-group.button-panel>span:first-child,.button-group.button-panel input[type=submit]:first-child,.button-group.button-panel a:first-child,.button-group.operators>span:first-child,.button-group.operators input[type=submit]:first-child,.button-group.operators a:first-child{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px}.button-group.button-panel>span:last-child,.button-group.button-panel input[type=submit]:last-child,.button-group.button-panel a:last-child,.button-group.operators>span:last-child,.button-group.operators input[type=submit]:last-child,.button-group.operators a:last-child{border-right-width:2px;border-top-right-radius:6px;border-bottom-right-radius:6px}.button-group.button-panel>span,.button-group.button-panel input[type=submit],.button-group.button-panel a{margin-top:0;width:auto;min-width:auto}.button-group.button-panel>span>span.check,.button-group.button-panel input[type=submit]>span.check,.button-group.button-panel a>span.check{font-family:"FontAwesome";white-space:nowrap;width:1em;display:inline-block;text-align:left}.button-group.button-panel>span>span.check:not(.checked)::after,.button-group.button-panel input[type=submit]>span.check:not(.checked)::after,.button-group.button-panel a>span.check:not(.checked)::after{content:""}.button-group.button-panel>span>span.check.checked::after,.button-group.button-panel input[type=submit]>span.check.checked::after,.button-group.button-panel a>span.check.checked::after{content:""}.button-group.button-panel>span>span.check>span,.button-group.button-panel input[type=submit]>span.check>span,.button-group.button-panel a>span.check>span{position:absolute;margin-left:-3000px;font-size:1px}.button-group.button-view{position:absolute;display:block;right:0;top:0;z-index:20;margin:0;padding:0;width:20px;font-size:10pt;color:#fefefe}.button-group.button-view>span:first-child{margin-top:2px}.button-group.button-view>span{display:block !important;border-width:0;text-decoration:none;text-align:center;font-style:normal}.button-group.button-view>span.download::after{content:""}.button-group.button-view>span.close::after{content:""}.button-group.button-view>span.minimize::after{content:""}.button-group.button-view>span.plugin::after{content:""}ul.menu.button-group-list{border-top-right-radius:8px;position:fixed;font-size:10pt;left:0;text-align:left;margin:-2px;margin-top:0}ul.menu.button-group-list>li:first-of-type{border-top-right-radius:5px}.button-icon{font-family:"FontAwesome";white-space:nowrap;line-height:1.3}.button-icon>span{position:absolute;margin-left:-3000px;font-size:1px}.button-icon[data-icon]::after{content:attr(data-icon)}.button-panel .button-icon{line-height:.7}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html,select,g>text{font-family:verdana,tahoma,arial,Helvetica,sans-serif;color:#616263;margin:0}g>text{fill:#616263}html{height:100vh}body{position:relative;min-height:100vh;font-size:12pt;margin:0;padding:0}a:visited{color:#e55d00}a:link{text-decoration:none;color:#f6a800}a:link:hover{color:#e55d00;transition:color .3s ease 0s}a[href^="http://"]::after,a[href^="https://"]::after{font-family:"FontAwesome";white-space:nowrap;content:" ";font-size:75%}a[onclick$="return PArok(this,false)"]{unicode-bidi:bidi-override;direction:rtl;text-align:left}a[onclick$="return PArok(this,false)"]>span:nth-child(1n+2){display:none}a[onclick$="return PArok(this,false)"]>span:nth-child(1)::after{content:"@"}.clear{clear:both}iframe{border-width:0}blockquote{border-radius:6px;padding:2pt 5pt 2pt 20pt;margin:0;border-left:5px solid #009ee0;background-color:#bce4f7;color:#009ee0;mix-blend-mode:soft-light}blockquote.bug,blockquote.missing,blockquote.warning{border-left-color:#000;background-color:#c1002b;color:#fefefe;mix-blend-mode:multiply}dl{margin:0;padding-bottom:.5em}dl dt{font-weight:bold}dl dt abbr{border-width:0}dl dt abbr[data-type=token]::after{color:#009ee0}dl dt abbr[data-type=span]::after{color:#c1002b}dl dt abbr::after{content:" (" attr(title) ")";vertical-align:bottom;font-style:italic;font-weight:normal;font-size:80%}body{margin:0;padding:0}body h1{font-size:110%;background-color:#f6a800;color:#fff;margin-top:0;padding:8px}body section{padding-left:8px;padding-bottom:8px}body section::before{content:""}
+
+/*# sourceMappingURL=kalamar-plugin-0.2.2.css.map */
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..6b10334
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/font/FontAwesome.otf b/public/font/FontAwesome.otf
new file mode 100644
index 0000000..f7936cc
--- /dev/null
+++ b/public/font/FontAwesome.otf
Binary files differ
diff --git a/public/font/fontawesome-webfont.eot b/public/font/fontawesome-webfont.eot
new file mode 100644
index 0000000..33b2bb8
--- /dev/null
+++ b/public/font/fontawesome-webfont.eot
Binary files differ
diff --git a/public/font/fontawesome-webfont.svg b/public/font/fontawesome-webfont.svg
new file mode 100644
index 0000000..1ee89d4
--- /dev/null
+++ b/public/font/fontawesome-webfont.svg
@@ -0,0 +1,565 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="2304" d="M1509 107q0 -14 -12 -29q-52 -59 -147.5 -83t-196.5 -24q-252 0 -346 107q-12 15 -12 29q0 17 12 29.5t29 12.5q15 0 30 -12q58 -49 125.5 -66t159.5 -17t160 17t127 66q15 12 30 12q17 0 29 -12.5t12 -29.5zM978 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5 t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM1622 498q0 -61 -43 -104t-104 -43q-60 0 -104.5 43.5t-44.5 103.5q0 61 44 105t105 44t104 -44t43 -105zM415 793q-39 27 -88 27q-66 0 -113 -47t-47 -113q0 -72 54 -121q53 141 194 254zM2020 382q0 222 -249 387 q-128 85 -291.5 126.5t-331.5 41.5t-331.5 -41.5t-292.5 -126.5q-249 -165 -249 -387t249 -387q129 -85 292.5 -126.5t331.5 -41.5t331.5 41.5t291.5 126.5q249 165 249 387zM2137 660q0 66 -47 113t-113 47q-50 0 -93 -30q140 -114 192 -256q61 48 61 126zM1993 1335 q0 49 -34.5 83.5t-82.5 34.5q-49 0 -83.5 -34.5t-34.5 -83.5q0 -48 34.5 -82.5t83.5 -34.5q48 0 82.5 34.5t34.5 82.5zM2220 660q0 -65 -33 -122t-89 -90q5 -35 5 -66q0 -139 -79 -255.5t-208 -201.5q-140 -92 -313.5 -136.5t-354.5 -44.5t-355 44.5t-314 136.5 q-129 85 -208 201.5t-79 255.5q0 36 6 71q-53 33 -83.5 88.5t-30.5 118.5q0 100 71 171.5t172 71.5q91 0 159 -60q265 170 638 177l144 456q10 29 40 29q24 0 384 -90q24 55 74 88t110 33q82 0 141 -59t59 -142t-59 -141.5t-141 -58.5q-83 0 -141.5 58.5t-59.5 140.5 l-339 80l-125 -395q349 -15 603 -179q71 63 163 63q101 0 172 -71.5t71 -171.5z" />
+<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf218;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf222;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h416q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-419 -420q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5 t431 200.5q144 12 276.5 -30.5t236.5 -129.5l419 419h-261q-14 0 -23 9t-9 23v64zM704 -128q117 0 223.5 45.5t184 123t123 184t45.5 223.5t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123 t223.5 -45.5z" />
+<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="&#xf229;" horiz-adv-x="1792" d="M1728 1536q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-229 -230l156 -156q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-156 157l-99 -100q87 -104 129.5 -236.5t30.5 -276.5q-22 -250 -200.5 -431t-428.5 -206q-163 -17 -314 39.5 t-256.5 162t-162 256.5t-39.5 314q25 250 206 428.5t431 200.5q144 12 276.5 -30.5t236.5 -129.5l99 99l-156 156q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l156 -156l229 229h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM1280 448q0 117 -45.5 223.5t-123 184t-184 123 t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5z" />
+<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M2029 685q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-131q-12 -119 -67 -226t-139 -183.5t-196.5 -121.5t-234.5 -45q-180 0 -330.5 91t-234.5 247 t-74 337q8 162 94 300t226.5 219.5t302.5 85.5q166 4 310.5 -71.5t235.5 -208.5t107 -296h131v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM640 128q104 0 198.5 40.5t163.5 109.5t109.5 163.5 t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
+<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
+<glyph unicode="&#xf23b;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf23e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/public/font/fontawesome-webfont.ttf b/public/font/fontawesome-webfont.ttf
new file mode 100644
index 0000000..ed9372f
--- /dev/null
+++ b/public/font/fontawesome-webfont.ttf
Binary files differ
diff --git a/public/font/fontawesome-webfont.woff b/public/font/fontawesome-webfont.woff
new file mode 100644
index 0000000..8b280b9
--- /dev/null
+++ b/public/font/fontawesome-webfont.woff
Binary files differ
diff --git a/public/font/fontawesome-webfont.woff2 b/public/font/fontawesome-webfont.woff2
new file mode 100644
index 0000000..3311d58
--- /dev/null
+++ b/public/font/fontawesome-webfont.woff2
Binary files differ
diff --git a/public/img/apple-touch-icon.png b/public/img/apple-touch-icon.png
new file mode 100644
index 0000000..40190ba
--- /dev/null
+++ b/public/img/apple-touch-icon.png
Binary files differ
diff --git a/public/img/ids-institute-for-the-german-language-white.svg b/public/img/ids-institute-for-the-german-language-white.svg
new file mode 100644
index 0000000..ca58d22
--- /dev/null
+++ b/public/img/ids-institute-for-the-german-language-white.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="225.15" width="709.9" data-name="Ebene 1"><path d="M137.27 78.42c-.38 1.5-1.12 2.25-2.12 2.25a4.43 4.43 0 0 1-2-.4 28.77 28.77 0 0 0-9.38-1.65 20.51 20.51 0 0 0-10.78 2.82 19.92 19.92 0 0 0-7.35 7.6 21.13 21.13 0 0 0-1.13 17.86 19.38 19.38 0 0 0 3.93 6 30.81 30.81 0 0 0 4.88 4.13c1.6 1.07 4.07 2.56 7.4 4.49a43.87 43.87 0 0 1 10.82 8 14.45 14.45 0 0 1 3.55 10.1 15.74 15.74 0 0 1-1.22 6 11.23 11.23 0 0 1-4.41 5.09 15.22 15.22 0 0 1-8.46 2.09 17.85 17.85 0 0 1-11.95-4.14c-3.273-2.754-5.474-6.82-6.6-12.2h-.8v18.33h.8a22.87 22.87 0 0 1 .83-3.24 1.25 1.25 0 0 1 1.29-.74 7.27 7.27 0 0 1 1.94.49 37.93 37.93 0 0 0 6.69 2.72 26.82 26.82 0 0 0 7.58 1 21.82 21.82 0 0 0 11.46-2.79 18.11 18.11 0 0 0 6.9-7.15 19.17 19.17 0 0 0 2.29-9c-.007-5.126-1.42-9.152-4.24-12.08a54.3 54.3 0 0 0-11.88-8.85c-3.05-1.8-5.47-3.28-7.26-4.46a27.7 27.7 0 0 1-4.66-3.81 13.72 13.72 0 0 1-3-4.71 17.24 17.24 0 0 1-1-6.11 17.58 17.58 0 0 1 1.7-7.87 13.31 13.31 0 0 1 4.8-5.43 14 14 0 0 1 17 2 16.31 16.31 0 0 1 4.41 9.34h.75l-.03-15.68h-.75zM0 80v.85a8.26 8.26 0 0 1 5.21 1.69c1.46 1.127 2.19 3.22 2.19 6.28v55.73c0 2.893-.73 4.96-2.19 6.2A7.75 7.75 0 0 1 0 152.62v.8h22v-.8a7.81 7.81 0 0 1-5.13-1.94c-1.54-1.28-2.32-3.33-2.32-6.15V88.82c0-2.86.73-4.9 2.17-6.13A7.88 7.88 0 0 1 22 80.85V80H0zm29.12 0v.85h.94a6.37 6.37 0 0 1 3.25.84 5.91 5.91 0 0 1 2.34 2.75 11.17 11.17 0 0 1 .87 4.68v55.43a10.34 10.34 0 0 1-1.6 5.48 5.33 5.33 0 0 1-4.86 2.59h-.94v.77h31.15a42.19 42.19 0 0 0 11.73-1.3 31.24 31.24 0 0 0 7.69-3.39 36.57 36.57 0 0 0 6.85-5.68 33.74 33.74 0 0 0 5.07-7 35.24 35.24 0 0 0 3.25-8.39 39.7 39.7 0 0 0 1.13-9.57 41.08 41.08 0 0 0-1.15-9.77 37.45 37.45 0 0 0-3.47-9 36.75 36.75 0 0 0-5.61-7.75 30 30 0 0 0-4.61-4.11 35.84 35.84 0 0 0-6.48-3.71A42.1 42.1 0 0 0 66.18 81a49.05 49.05 0 0 0-10.34-1H29.12zm26.11 2.29a33.23 33.23 0 0 1 15.15 3.19 28 28 0 0 1 10.3 8.82A35.21 35.21 0 0 1 86 105.69a48.72 48.72 0 0 1 1.7 12.93 40.73 40.73 0 0 1-2.21 14.13 30.93 30.93 0 0 1-5.75 9.87c-3.206 3.613-6.54 5.947-10 7a44.68 44.68 0 0 1-12.76 1.52 40 40 0 0 1-8-.6 6 6 0 0 1-4-2.62c-.866-1.34-1.3-3.44-1.3-6.3V83.49a69.75 69.75 0 0 1 11.55-1.2z" style="fill:#fff;fill-opacity:1"/><path d="M181.48 0v225.15m0-225.15s0 .87.08 2.52.12 4.07.21 7.15c.13 6.16.4 15 .57 25.51.08 5.27.16 11 .25 17s.14 12.42.21 19c.07 6.58.08 13.42.12 20.34.04 6.92 0 14 .06 21s0 14.07-.05 21-.09 13.74-.13 20.34c-.11 13.19-.27 25.5-.46 36.06-.19 10.56-.44 19.35-.57 25.5-.09 3.08-.16 5.5-.21 7.15-.05 1.65-.08 2.53-.08 2.53s0-.88-.08-2.53-.12-4.07-.21-7.15c-.13-6.15-.41-14.95-.57-25.5-.16-10.55-.36-22.87-.46-36.06 0-6.6-.09-13.41-.13-20.34-.04-6.93 0-14 0-21v-21c0-6.93.09-13.74.13-20.34.04-6.6.14-13 .2-19s.18-11.77.26-17c.17-10.56.44-19.35.57-25.51.09-3.08.16-5.5.21-7.15.05-1.65.08-2.52.08-2.52z" style="fill:#f07d00;fill-opacity:1"/><path d="M587.5 76a1.41 1.41 0 0 0-.91.45 1.37 1.37 0 0 0-.44 1 1.46 1.46 0 0 0 .43 1 1.43 1.43 0 0 0 1 .44 1.38 1.38 0 0 0 1-.44 1.45 1.45 0 0 0 .42-1 1.47 1.47 0 0 0-1.47-1.42l-.03-.03zm-6.1.03a1.45 1.45 0 0 0-.95.42 1.33 1.33 0 0 0-.44 1 1.4 1.4 0 0 0 .44 1 1.36 1.36 0 0 0 1 .44 1.31 1.31 0 0 0 1-.44 1.44 1.44 0 0 0 .4-1 1.36 1.36 0 0 0-.42-1 1.34 1.34 0 0 0-1-.42h-.03zM434 79.81v5.43h.24c.12-1.45.55-2.39 1.28-2.81a5.25 5.25 0 0 1 2.71-.65h4.42v18.67a2.24 2.24 0 0 1-.69 1.86 2.73 2.73 0 0 1-1.68.58v.24h7.08v-.24a2.19 2.19 0 0 1-2.42-2.44V81.78h4.42a5.29 5.29 0 0 1 2.72.65c.73.42 1.16 1.36 1.27 2.81h.24v-5.43h-.24a2.63 2.63 0 0 1-2.24 1.1h-14.39a7.77 7.77 0 0 1-.91-.05 2.59 2.59 0 0 1-.68-.19 1.29 1.29 0 0 1-.46-.31 3.92 3.92 0 0 1-.43-.55H434zm38.22 0v5.43h.24c.12-1.45.54-2.39 1.27-2.81a5.28 5.28 0 0 1 2.71-.65h4.42v18.67a2.27 2.27 0 0 1-.68 1.86 2.74 2.74 0 0 1-1.69.58v.24h7.08v-.24a2.18 2.18 0 0 1-2.41-2.44V81.78h4.42a5.28 5.28 0 0 1 2.71.65c.74.42 1.16 1.36 1.27 2.81h.24v-5.43h-.24a2.61 2.61 0 0 1-2.23 1.1h-14.4a7.9 7.9 0 0 1-.91-.05 2.41 2.41 0 0 1-.67-.19 1.33 1.33 0 0 1-.47-.31 3.33 3.33 0 0 1-.42-.55h-.24zm48.78 0v5.43h.3c.12-1.45.54-2.39 1.27-2.81a5.28 5.28 0 0 1 2.71-.65h4.42v18.67a2.27 2.27 0 0 1-.68 1.86 2.74 2.74 0 0 1-1.69.58v.24h7.08v-.24a2.18 2.18 0 0 1-2.41-2.44V81.78h4.4a5.28 5.28 0 0 1 2.71.65c.74.42 1.16 1.36 1.27 2.81h.24l-.04-5.43h-.24a2.61 2.61 0 0 1-2.23 1.1h-14.4a7.9 7.9 0 0 1-.91-.05 2.41 2.41 0 0 1-.67-.19 1.33 1.33 0 0 1-.47-.31 3.33 3.33 0 0 1-.42-.55H521zm-92.75.7c-.12.45-.35.67-.68.67a1.51 1.51 0 0 1-.65-.12 9.7 9.7 0 0 0-3-.49 6.9 6.9 0 0 0-3.45.86 6.29 6.29 0 0 0-2.36 2.3 6 6 0 0 0-.83 3 5.84 5.84 0 0 0 .47 2.4 5.7 5.7 0 0 0 1.26 1.82 9.28 9.28 0 0 0 1.56 1.25c.51.36 1.3.78 2.37 1.36a14 14 0 0 1 3.46 2.43 4.21 4.21 0 0 1 1.14 3 4.54 4.54 0 0 1-.39 1.81 3.44 3.44 0 0 1-1.41 1.54 5.1 5.1 0 0 1-2.71.63 5.91 5.91 0 0 1-3.82-1.25 6.29 6.29 0 0 1-2.11-3.7h-.26v5.57h.26a5.93 5.93 0 0 1 .27-1 .39.39 0 0 1 .41-.22 2.44 2.44 0 0 1 .62.15 13.19 13.19 0 0 0 2.14.82 9.41 9.41 0 0 0 2.43.29 7.35 7.35 0 0 0 3.67-.84 5.76 5.76 0 0 0 2.21-2.17 5.54 5.54 0 0 0 .73-2.74 4.84 4.84 0 0 0-1.36-3.65 16.73 16.73 0 0 0-3.8-2.68c-.98-.55-1.75-1-2.32-1.36a8.23 8.23 0 0 1-1.5-1.15 4.25 4.25 0 0 1-1-1.42 5.54 5.54 0 0 1 .22-4.24 4.12 4.12 0 0 1 1.54-1.64 4.34 4.34 0 0 1 2.28-.61 4.24 4.24 0 0 1 3.16 1.22 4.82 4.82 0 0 1 1.41 2.83h.24l.04-4.67h-.24zm67.23.38v.25c1 .08 1.64.35 1.9.8a3.27 3.27 0 0 1 .41 1.68v11.04a20.62 20.62 0 0 0 .16 2.65 7.06 7.06 0 0 0 .8 2.45 7.18 7.18 0 0 0 2.79 2.79 8.08 8.08 0 0 0 4.26 1.13 8.25 8.25 0 0 0 4-1 6.52 6.52 0 0 0 2.89-3.29l.07.06v3.68h4.67l-.04-.23a6.51 6.51 0 0 1-1.28-.34 1.58 1.58 0 0 1-.81-.72 2.72 2.72 0 0 1-.3-1.38V83.62a3.29 3.29 0 0 1 .48-1.62c.31-.52 1-.86 2-.86v-.25h-7.11v.25c1.06.1 1.72.38 2 .85a3.14 3.14 0 0 1 .42 1.63v12.27c0 2.74-.92 4.74-2.76 6a6.16 6.16 0 0 1-2 .9 7.63 7.63 0 0 1-1.83.27 5.82 5.82 0 0 1-3.29-1 5.72 5.72 0 0 1-2.17-2.64 13 13 0 0 1-.68-4.9v-10.9a3.1 3.1 0 0 1 .42-1.59 2.55 2.55 0 0 1 2-.89v-.25h-7zm78 0v.25c1.01.08 1.65.35 1.91.8a3.27 3.27 0 0 1 .4 1.68v11.04a20.59 20.59 0 0 0 .17 2.65 7.06 7.06 0 0 0 .8 2.45 7.22 7.22 0 0 0 2.78 2.79 8.11 8.11 0 0 0 4.27 1.13 8.28 8.28 0 0 0 4-1 6.52 6.52 0 0 0 2.89-3.29l.07.06v3.68h4.66l-.02-.26a6.59 6.59 0 0 1-1.27-.34 1.58 1.58 0 0 1-.81-.72 2.72 2.72 0 0 1-.3-1.38V83.59a3.29 3.29 0 0 1 .44-1.59c.31-.52 1-.86 2-.86v-.25h-7.11v.25c1 .1 1.72.38 2 .85a3.14 3.14 0 0 1 .42 1.63v12.27c0 2.74-.92 4.74-2.76 6a6.12 6.12 0 0 1-2 .9 7.49 7.49 0 0 1-1.82.27 5.79 5.79 0 0 1-3.29-1 5.72 5.72 0 0 1-2.17-2.64 13 13 0 0 1-.68-4.9v-10.9a3.1 3.1 0 0 1 .42-1.59 2.53 2.53 0 0 1 2-.89v-.25h-7zM222 80.91v.25a2.78 2.78 0 0 1 1.66.58 2.29 2.29 0 0 1 .71 1.93v16.78a2.45 2.45 0 0 1-.63 1.8 2 2 0 0 1-1.44.64h-.3v.28h13.22l.84-3.65h-.26a8 8 0 0 1-.89 1.75 2.52 2.52 0 0 1-1.18.92 5.24 5.24 0 0 1-2 .31h-1.92a3.92 3.92 0 0 1-2.36-.56 2.38 2.38 0 0 1-.73-2V83.72a2.25 2.25 0 0 1 .73-2 2.9 2.9 0 0 1 1.65-.56v-.25H222zm18.53 0v.25h.3a1.75 1.75 0 0 1 1.61.76 3.42 3.42 0 0 1 .46 1.78v16.68a2.33 2.33 0 0 1-.68 1.87 2.15 2.15 0 0 1-1.39.57h-.3v.24h13.29l.77-3.48h-.21a6.28 6.28 0 0 1-.75 1.49 2.89 2.89 0 0 1-1.22 1 4.78 4.78 0 0 1-2 .35h-3.3c-.83 0-1.35-.22-1.58-.65a3.27 3.27 0 0 1-.34-1.54v-7.89h4.27a6.9 6.9 0 0 1 1.13.09 1.81 1.81 0 0 1 .66.151 2.07 2.07 0 0 1 .75.61 2.77 2.77 0 0 1 .51 1.32h.23v-5h-.23a1.93 1.93 0 0 1-1.09 1.789 5.44 5.44 0 0 1-2.16.4h-4.07V81.6h4.63c2.5 0 3.75.936 3.75 2.81h.21v-3.5h-13.25zm27 0-7 .04v.25a2.79 2.79 0 0 1 1.67.52 2.2 2.2 0 0 1 .7 1.9v16.83a2.28 2.28 0 0 1-.7 1.88 2.57 2.57 0 0 1-1.67.56v.24h7v-.24a2.58 2.58 0 0 1-1.65-.58 2.22 2.22 0 0 1-.74-1.86V83.58a2.24 2.24 0 0 1 .7-1.86 2.61 2.61 0 0 1 1.69-.56v-.25zm6.35 0v.25h.27a1.93 1.93 0 0 1 1.54.66 2.78 2.78 0 0 1 .56 1.85v16.78a2.48 2.48 0 0 1-.61 1.83 2 2 0 0 1-1.46.61h-.3v.24h8.32a9.22 9.22 0 0 0 4.48-.84 6.47 6.47 0 0 0 2-1.9 5 5 0 0 0 .9-3 5.82 5.82 0 0 0-.83-3 6.26 6.26 0 0 0-1-1.19 6 6 0 0 0-1.39-1 7 7 0 0 0-1.66-.59 18.55 18.55 0 0 0-1.91-.32v-.06a7.77 7.77 0 0 0 3.48-1.84 4.3 4.3 0 0 0 1.3-3.26 4.55 4.55 0 0 0-.45-2 5.52 5.52 0 0 0-1.29-1.66 6.08 6.08 0 0 0-2.05-1.15 8.21 8.21 0 0 0-2.64-.41h-7.26zm38.31 0v.25a2.76 2.76 0 0 1 1.73.53 2.09 2.09 0 0 1 .68 1.29 15.81 15.81 0 0 1 .13 2.41v14.36l-16.81-18.83h-4.18v.25a5.48 5.48 0 0 1 1.46.45 5.94 5.94 0 0 1 1.57 1.4l.74.83v14.5a13.37 13.37 0 0 1-.22 2.85 2 2 0 0 1-.74 1.29 2.75 2.75 0 0 1-1.45.4v.24h5.57v-.24a2.37 2.37 0 0 1-1.95-.84 3 3 0 0 1-.39-1.19 17.23 17.23 0 0 1-.14-2.54V84.69l17.07 19h.15V84.2a5 5 0 0 1 .27-1.85 1.52 1.52 0 0 1 .76-.86 4.66 4.66 0 0 1 1.34-.33v-.25h-5.59zm18.92 0-7.05.04v.25a2.79 2.79 0 0 1 1.67.52 2.23 2.23 0 0 1 .7 1.9v16.83a2.32 2.32 0 0 1-.7 1.88 2.57 2.57 0 0 1-1.67.56v.24h7.05v-.24a2.58 2.58 0 0 1-1.65-.58 2.22 2.22 0 0 1-.74-1.86V83.58a2.24 2.24 0 0 1 .7-1.86 2.61 2.61 0 0 1 1.69-.56v-.25zm6.97 0v4.07h.25a4.75 4.75 0 0 1 .72-1.93 2.6 2.6 0 0 1 1.33-1 6.45 6.45 0 0 1 2.16-.3h10.63l-15.36 20.96v.46h18.12l1-3.71h-.24a8 8 0 0 1-.91 1.57 3.22 3.22 0 0 1-1.44.94 8.17 8.17 0 0 1-2.78.38h-10.67l15.39-21v-.44h-18.2zm44.3 0-7 .04v.25a2.74 2.74 0 0 1 1.66.52 2.2 2.2 0 0 1 .7 1.9v16.87a2.28 2.28 0 0 1-.7 1.88 2.53 2.53 0 0 1-1.66.56v.24h7v-.24a2.57 2.57 0 0 1-1.64-.58 2.2 2.2 0 0 1-.74-1.86V83.62a2.27 2.27 0 0 1 .69-1.9 2.63 2.63 0 0 1 1.69-.56v-.25zm22.9 0v.25a2.78 2.78 0 0 1 1.73.53 2.08 2.08 0 0 1 .67 1.29 15.81 15.81 0 0 1 .13 2.41v14.36L391 80.92h-4.17v.25a5.56 5.56 0 0 1 1.47.45 6.27 6.27 0 0 1 1.57 1.4l.74.83v14.5a14.07 14.07 0 0 1-.22 2.85 2 2 0 0 1-.74 1.29 2.78 2.78 0 0 1-1.46.4v.24h5.57v-.24a2.38 2.38 0 0 1-1.95-.84 3 3 0 0 1-.39-1.19 17.23 17.23 0 0 1-.14-2.54V84.69l17.07 19h.15V84.2a5 5 0 0 1 .27-1.85 1.56 1.56 0 0 1 .76-.86 4.75 4.75 0 0 1 1.34-.33v-.25h-5.59zm61.17 0-7.05.04v.25a2.77 2.77 0 0 1 1.67.52 2.2 2.2 0 0 1 .7 1.9v16.83a2.28 2.28 0 0 1-.7 1.88 2.55 2.55 0 0 1-1.67.56v.24h7.05v-.24a2.6 2.6 0 0 1-1.65-.58 2.22 2.22 0 0 1-.74-1.86V83.58a2.27 2.27 0 0 1 .7-1.86 2.61 2.61 0 0 1 1.69-.56v-.25zm88.14 0v.25l.27-.06a2.28 2.28 0 0 1 1.45.52 2.39 2.39 0 0 1 .65 2v16.79a2.6 2.6 0 0 1-.59 1.76 1.9 1.9 0 0 1-1.51.68h-.3v.24h7.17v-.24h-.32a2 2 0 0 1-1.52-.67 2.47 2.47 0 0 1-.63-1.77v-8.1h5a2.55 2.55 0 0 1 2 .61 2.71 2.71 0 0 1 .62 1.56h.24v-5h-.24a3.08 3.08 0 0 1-.66 1.61 2.57 2.57 0 0 1-1.93.58h-5V81.6h5.34a2.82 2.82 0 0 1 2.3.83 3.27 3.27 0 0 1 .76 1.86h.24v-3.38h-13.34zm46.11 0v.31h.3a2.17 2.17 0 0 1 1.41.53 2.32 2.32 0 0 1 .65 1.87v16.83a2.65 2.65 0 0 1-.34 1.44 1.87 1.87 0 0 1-.85.76 3.53 3.53 0 0 1-1.18.24v.24h7.08v-.24a2.19 2.19 0 0 1-2.42-2.44v-8.13a9.06 9.06 0 0 1 1.37.089 4.64 4.64 0 0 1 1.31.451 6.28 6.28 0 0 1 1.56 1.2 11.23 11.23 0 0 1 1.63 2.18l2.66 4.39a5.2 5.2 0 0 1 .36.52c.19.31.34.54.44.69l.48.65c.15.21.31.42.49.64h4v-.24a3.22 3.22 0 0 1-1.62-.68 10.46 10.46 0 0 1-2.18-2.88l-2-3.39a9.36 9.36 0 0 0-3.68-3.84v-.06a6.1 6.1 0 0 0 2.62-1.08 5 5 0 0 0 1.55-1.91 5.48 5.48 0 0 0 .51-2.32 6.59 6.59 0 0 0-.31-1.93 5.73 5.73 0 0 0-1-1.86 5.21 5.21 0 0 0-2-1.46 7.73 7.73 0 0 0-3.14-.57h-7.7zm6.624.587a5.78 5.78 0 0 1 2.737.834 4.68 4.68 0 0 1 1.75 2.068 6.51 6.51 0 0 1 .51 2.51 5.47 5.47 0 0 1-.571 2.611 3.78 3.78 0 0 1-1.85 1.63 7.88 7.88 0 0 1-3.27.58h-1.27v-10.1a6 6 0 0 1 1.39-.13 5.78 5.78 0 0 1 .574-.003zm-326.804.152a4.17 4.17 0 0 1 1.81.39 4.54 4.54 0 0 1 1.44 1.09 4.94 4.94 0 0 1 .92 1.59 5.69 5.69 0 0 1 .31 1.901 4.71 4.71 0 0 1-.46 2.15 4.14 4.14 0 0 1-1 1.33 5.82 5.82 0 0 1-1 .67 6.39 6.39 0 0 1-2.54.36h-1.45l-.03-9.15a7 7 0 0 1 2-.33zm81.69 9.84v1.23h8v-1.23h-8zm-81.39.3a8.15 8.15 0 0 1 2.57.44 5.55 5.55 0 0 1 1.95 1.08 4.87 4.87 0 0 1 1.23 1.711 6.11 6.11 0 0 1-.45 5.45 4.76 4.76 0 0 1-4.36 2 4.56 4.56 0 0 1-2.19-.4 1.64 1.64 0 0 1-.86-.92 4.68 4.68 0 0 1-.16-1.34v-8h2.27v-.02zm40.82 26.991v8.07h.34c.18-2.18.82-3.55 1.82-4.18a7.26 7.26 0 0 1 3.87-1h6.31v27.72a3.42 3.42 0 0 1-1 2.77 3.83 3.83 0 0 1-2.39.86v.36h10.09v-.36c-2.29-.07-3.44-1.29-3.44-3.63v-27.76h6.31a7.31 7.31 0 0 1 3.87 1c1.05.63 1.65 2.03 1.81 4.18h.34l-.04-8.03h-.34a3.66 3.66 0 0 1-3.19 1.63h-20.43a9.88 9.88 0 0 1-1.3-.07 4.18 4.18 0 0 1-1-.27 2.41 2.41 0 0 1-.66-.46 4.82 4.82 0 0 1-.61-.83h-.36zm76.02.65a15.77 15.77 0 0 0-8.46 2.41 17.62 17.62 0 0 0-6.18 6.55 18.54 18.54 0 0 0-1.18 15.2 16.82 16.82 0 0 0 3.23 5.45 15.43 15.43 0 0 0 5.22 3.85 16.14 16.14 0 0 0 6.84 1.42 14.39 14.39 0 0 0 5.93-1.07 25.4 25.4 0 0 0 5.24-3.39v-1.28a13.55 13.55 0 0 1-5.21 3.4 16 16 0 0 1-5.3 1 12.08 12.08 0 0 1-5.25-1.12 11.94 11.94 0 0 1-4.16-3.31 15.18 15.18 0 0 1-2.74-5.16 21.48 21.48 0 0 1-.94-6.45 22.13 22.13 0 0 1 1-6.65 16.11 16.11 0 0 1 2.72-5.25 12.24 12.24 0 0 1 4.14-3.39 11.31 11.31 0 0 1 5.13-1.2 13.74 13.74 0 0 1 4.31.77 10.94 10.94 0 0 1 4.08 2.46 7.14 7.14 0 0 1 2.18 4.11h.37l.26-7.88h-.34a1.83 1.83 0 0 1-.43.93 1.74 1.74 0 0 1-1.12.26 5.59 5.59 0 0 1-1.1-.14l-2.24-.65a22.84 22.84 0 0 0-6-.87zm237.19 0a15.77 15.77 0 0 0-8.46 2.41 17.46 17.46 0 0 0-6.18 6.55 18.54 18.54 0 0 0-1.18 15.2 16.82 16.82 0 0 0 3.23 5.45 15.43 15.43 0 0 0 5.22 3.85 16.12 16.12 0 0 0 6.83 1.42 14.41 14.41 0 0 0 5.94-1.07 25.4 25.4 0 0 0 5.24-3.39v-1.28a13.55 13.55 0 0 1-5.21 3.4 16 16 0 0 1-5.3 1 11.71 11.71 0 0 1-9.42-4.43 15.16 15.16 0 0 1-2.73-5.16 21.48 21.48 0 0 1-.94-6.45 22.13 22.13 0 0 1 1-6.65 16.29 16.29 0 0 1 2.71-5.25 12.37 12.37 0 0 1 4.15-3.39 11.31 11.31 0 0 1 5.13-1.2 13.74 13.74 0 0 1 4.31.77 11 11 0 0 1 4.08 2.46 7.14 7.14 0 0 1 2.18 4.11h.37l.26-7.88h-.34a1.83 1.83 0 0 1-.43.93 1.74 1.74 0 0 1-1.12.26 5.59 5.59 0 0 1-1.1-.14l-2.24-.65a22.84 22.84 0 0 0-6-.87zm-261.94.26c-.2.67-.53 1-1 1a2.18 2.18 0 0 1-.93-.17 13.18 13.18 0 0 0-4.28-.75 9.57 9.57 0 0 0-4.93 1.29 9.28 9.28 0 0 0-3.88 11.47 8.74 8.74 0 0 0 1.8 2.7 13.81 13.81 0 0 0 2.23 1.86c.73.46 1.86 1.14 3.38 2a19.78 19.78 0 0 1 4.94 3.61 6.43 6.43 0 0 1 1.63 4.54 7.05 7.05 0 0 1-.56 2.69 5.11 5.11 0 0 1-2 2.29 7 7 0 0 1-3.86.94 8.26 8.26 0 0 1-5.45-1.86 9.47 9.47 0 0 1-3-5.5h-.35v8.28h.37a9.73 9.73 0 0 1 .38-1.46.57.57 0 0 1 .59-.33 3.24 3.24 0 0 1 .88.22 17.57 17.57 0 0 0 3.06 1.22 12.48 12.48 0 0 0 3.46.44 10.07 10.07 0 0 0 5.24-1.26 8.28 8.28 0 0 0 3.15-3.21 8.65 8.65 0 0 0 1-4.08 7.46 7.46 0 0 0-1.93-5.44 25 25 0 0 0-5.43-4c-1.39-.8-2.5-1.47-3.31-2a12.48 12.48 0 0 1-2.14-1.72 6 6 0 0 1-1.36-2.11 7.58 7.58 0 0 1-.47-2.75 7.76 7.76 0 0 1 .78-3.55 6.09 6.09 0 0 1 2.19-2.44 6.47 6.47 0 0 1 7.77.9 7.33 7.33 0 0 1 2 4.21h.34l.03-7.03h-.34zm142.51 0c-.2.67-.53 1-1 1a2.18 2.18 0 0 1-.93-.17 13.18 13.18 0 0 0-4.28-.75 9.57 9.57 0 0 0-4.93 1.29 9.13 9.13 0 0 0-3.36 3.43 9 9 0 0 0-1.18 4.46 8.93 8.93 0 0 0 .67 3.58 8.54 8.54 0 0 0 1.79 2.7 13.81 13.81 0 0 0 2.23 1.86c.73.46 1.86 1.14 3.38 2a19.78 19.78 0 0 1 4.94 3.61 6.43 6.43 0 0 1 1.63 4.54 7.05 7.05 0 0 1-.56 2.69 5.11 5.11 0 0 1-2 2.29 7 7 0 0 1-3.86.94 8.26 8.26 0 0 1-5.45-1.86 9.47 9.47 0 0 1-3-5.5h-.37v8.28h.37a9.73 9.73 0 0 1 .38-1.46.57.57 0 0 1 .59-.33 3.24 3.24 0 0 1 .88.22 17.57 17.57 0 0 0 3.06 1.22 12.48 12.48 0 0 0 3.46.44 10.07 10.07 0 0 0 5.24-1.26 8.28 8.28 0 0 0 3.15-3.21 8.65 8.65 0 0 0 1-4.08 7.46 7.46 0 0 0-1.93-5.44 25 25 0 0 0-5.43-4c-1.39-.8-2.5-1.47-3.31-2a12.48 12.48 0 0 1-2.14-1.72 6 6 0 0 1-1.36-2.11 7.58 7.58 0 0 1-.47-2.75 7.76 7.76 0 0 1 .78-3.55 6 6 0 0 1 2.2-2.44 6.46 6.46 0 0 1 7.76.9 7.33 7.33 0 0 1 2 4.21h.34l.05-7.03h-.34zm85.85.28-2.51.04-9.69 28.45a9.3 9.3 0 0 1-1.8 3.37 4.12 4.12 0 0 1-2.76 1.27v.36h8.06v-.36a3.77 3.77 0 0 1-2.05-.46 2 2 0 0 1-.72-1.85 8.69 8.69 0 0 1 .56-2.67l2.72-8.12h11.97l3 8.77a.6.6 0 0 0 .1.27 6.76 6.76 0 0 1 .44 2c0 .933-.31 1.504-.93 1.71a8.73 8.73 0 0 1-2.66.31v.36h11.15v-.36a6 6 0 0 1-1.69-.35 3.39 3.39 0 0 1-1.38-1.24 13.73 13.73 0 0 1-1.54-3.19l-10.27-28.31zm-186.52.38v.38c2.26 0 3.38 1.23 3.38 3.68v25a3.84 3.84 0 0 1-.87 2.68 3.25 3.25 0 0 1-2.51.95v.36h10.1v-.36a3.39 3.39 0 0 1-2.51-.95 3.69 3.69 0 0 1-.93-2.68v-12.93h18.17v13a3.63 3.63 0 0 1-.92 2.68 3.41 3.41 0 0 1-2.53.91v.36h10.1v-.36c-2.266 0-3.4-1.21-3.4-3.63v-25a4.13 4.13 0 0 1 .81-2.65 3.14 3.14 0 0 1 2.59-1v-.38h-10.1v.38a3.17 3.17 0 0 1 2.61 1 4 4 0 0 1 .84 2.64v11.06l-18.17-.05v-11.06a4 4 0 0 1 .83-2.65 3.16 3.16 0 0 1 2.61-1v-.38h-10.1zm237.38 0v.38c2.26 0 3.38 1.23 3.38 3.68v25a3.84 3.84 0 0 1-.87 2.68 3.25 3.25 0 0 1-2.51.95v.36h10.1v-.36a3.39 3.39 0 0 1-2.51-.95 3.69 3.69 0 0 1-.93-2.68v-12.93H677v13a3.63 3.63 0 0 1-.92 2.68 3.41 3.41 0 0 1-2.53.91v.36h10.1v-.36c-2.266 0-3.4-1.21-3.4-3.63v-25a4.07 4.07 0 0 1 .82-2.65 3.1 3.1 0 0 1 2.58-1v-.38h-10.1v.38a3.17 3.17 0 0 1 2.61 1 4 4 0 0 1 .84 2.64v11.06l-18.21-.05v-11.06a4 4 0 0 1 .83-2.65 3.16 3.16 0 0 1 2.61-1v-.38h-10.1zm-431.48.02v.38h.43a2.91 2.91 0 0 1 1.49.39 2.6 2.6 0 0 1 1.06 1.23 4.9 4.9 0 0 1 .4 2.11v24.97a4.52 4.52 0 0 1-.73 2.459 2.45 2.45 0 0 1-2.22 1.172h-.43v.36h14.23a20 20 0 0 0 5.36-.58 14.42 14.42 0 0 0 3.51-1.53 16.23 16.23 0 0 0 3.13-2.56 15.44 15.44 0 0 0 2.32-3.151 15.68 15.68 0 0 0 1.53-3.8 17.73 17.73 0 0 0 .51-4.31 18.26 18.26 0 0 0-.53-4.39 16.54 16.54 0 0 0-4.14-7.54 14.11 14.11 0 0 0-2.11-1.86 16.08 16.08 0 0 0-3-1.66 19.44 19.44 0 0 0-3.88-1.23 23.11 23.11 0 0 0-4.72-.46h-12.21zm36.68 0v.38h.5a2.43 2.43 0 0 1 2.29 1.13 5.1 5.1 0 0 1 .66 2.64v24.88a3.53 3.53 0 0 1-1 2.78 3 3 0 0 1-2 .85h-.43v.36h18.9l1.1-5.18h-.3a9.17 9.17 0 0 1-1.07 2.22 4.21 4.21 0 0 1-1.73 1.43 6.51 6.51 0 0 1-2.8.52h-4.72c-1.17 0-1.92-.36-2.24-1a5 5 0 0 1-.49-2.29v-11.74h6.09a9.48 9.48 0 0 1 1.62.14 2.39 2.39 0 0 1 .93.22 3 3 0 0 1 1.07.91 4.17 4.17 0 0 1 .73 2h.32v-7.42h-.32a2.89 2.89 0 0 1-1.55 2.67 7.69 7.69 0 0 1-3.08.58H264v-15h6.59c3.56 0 5.34 1.39 5.34 4.17h.3v-5.25h-18.9zm26.7 0v.38c1.44.12 2.35.52 2.73 1.19a5 5 0 0 1 .57 2.49v16.45a31.19 31.19 0 0 0 .24 3.93 10.49 10.49 0 0 0 5.11 7.8 11.28 11.28 0 0 0 6.08 1.68 11.53 11.53 0 0 0 5.74-1.54 9.62 9.62 0 0 0 4.12-4.89l.11.09v5.47h6.65l.06-.4a8.67 8.67 0 0 1-1.82-.52 2.38 2.38 0 0 1-1.159-1.06 4.23 4.23 0 0 1-.422-2.05v-25a5 5 0 0 1 .621-2.36c.42-.77 1.36-1.2 2.82-1.28v-.38h-10.14v.38c1.5.14 2.44.56 2.85 1.26a4.8 4.8 0 0 1 .6 2.42v18.07c0 4.128-1.314 7.128-3.94 9a8.72 8.72 0 0 1-2.82 1.35 10.25 10.25 0 0 1-2.61.4 8.13 8.13 0 0 1-4.69-1.41 8.59 8.59 0 0 1-3.1-3.93 20.3 20.3 0 0 1-1-7.29v-16.19a4.67 4.67 0 0 1 .6-2.349c.41-.7 1.34-1.15 2.8-1.33v-.381h-10zm169.86 0v.38h.49a2.42 2.42 0 0 1 2.29 1.13 5.1 5.1 0 0 1 .66 2.64v24.88a3.53 3.53 0 0 1-1 2.78 3 3 0 0 1-2 .85h-.43v.36h18.9l1.1-5.18h-.3a9.16 9.16 0 0 1-1.06 2.22 4.31 4.31 0 0 1-1.74 1.43 6.48 6.48 0 0 1-2.8.52h-4.71c-1.18 0-1.93-.334-2.25-1a5 5 0 0 1-.49-2.29v-11.74h6.1a9.36 9.36 0 0 1 1.61.14 2.48 2.48 0 0 1 .94.22 3 3 0 0 1 1.06.91 4.17 4.17 0 0 1 .74 2h.31v-7.42h-.32a2.91 2.91 0 0 1-1.55 2.67 7.76 7.76 0 0 1-3.08.58h-5.82v-15h6.61c3.56 0 5.34 1.39 5.34 4.17h.3v-5.25h-18.9zm71.98 0v.38l.48-.01.79.21a3.14 3.14 0 0 1 1 .48 2.61 2.61 0 0 1 .81 1.09 4.61 4.61 0 0 1 .34 1.9v25a3.5 3.5 0 0 1-.95 2.74 3.74 3.74 0 0 1-2.45.89v.359h10.1v-.36c-2.3-.07-3.45-1.288-3.45-3.628v-11.4c1.68.18 2.82.269 3.41.269a15 15 0 0 0 4.9-.74 9.59 9.59 0 0 0 3.45-2 7.61 7.61 0 0 0 1.92-2.85 9 9 0 0 0 .62-3.33 8.85 8.85 0 0 0-.66-3.38 8.4 8.4 0 0 0-2-2.88 9.53 9.53 0 0 0-3.32-2 13.15 13.15 0 0 0-4.59-.74h-10.4zm27.43 0v.47h.43a3 3 0 0 1 2.02.81 3.54 3.54 0 0 1 .93 2.78v25a4 4 0 0 1-.49 2.14 2.7 2.7 0 0 1-1.21 1.12 4.61 4.61 0 0 1-1.68.37v.36h10.11v-.36c-2.3-.07-3.45-1.29-3.45-3.63v-12.1a12.19 12.19 0 0 1 1.95.14 6.3 6.3 0 0 1 1.86.67 9.3 9.3 0 0 1 2.23 1.78 16.75 16.75 0 0 1 2.35 3.19l3.79 6.53a7.9 7.9 0 0 1 .5.769c.28.44.49.78.64 1l.69 1c.21.35.44.67.69 1h5.76v-.36a4.51 4.51 0 0 1-2.31-1 16 16 0 0 1-3.11-4.279l-2.86-5.05c-1.606-2.84-3.36-4.74-5.26-5.7v-.09a8.3 8.3 0 0 0 3.74-1.62 7.32 7.32 0 0 0 2.21-2.84 8.3 8.3 0 0 0 .73-3.44 10 10 0 0 0-.44-2.87 8.64 8.64 0 0 0-1.47-2.77 7.39 7.39 0 0 0-2.86-2.16 10.64 10.64 0 0 0-4.49-.86h-11zm136.55 0v.38h.53a2.42 2.42 0 0 1 2.29 1.13 5.1 5.1 0 0 1 .66 2.64v24.88a3.53 3.53 0 0 1-1 2.78 3 3 0 0 1-2 .85h-.43v.36h18.9l1.1-5.18h-.3a9.16 9.16 0 0 1-1.06 2.22 4.31 4.31 0 0 1-1.74 1.43 6.48 6.48 0 0 1-2.8.52h-4.71c-1.18 0-1.93-.334-2.25-1a5 5 0 0 1-.49-2.29v-11.74h6.1a9.28 9.28 0 0 1 1.61.14 2.44 2.44 0 0 1 .94.22 2.87 2.87 0 0 1 1.06.91 4.17 4.17 0 0 1 .74 2h.27v-7.42h-.32a2.91 2.91 0 0 1-1.55 2.67 7.72 7.72 0 0 1-3.08.58h-5.82v-15h6.61c3.56 0 5.34 1.39 5.34 4.17h.3v-5.25h-18.9zm-127.702.873a8 8 0 0 1 4.563 1.246 6.93 6.93 0 0 1 2.488 3.07 10.2 10.2 0 0 1 .73 3.74 8.39 8.39 0 0 1-.82 3.872 5.53 5.53 0 0 1-2.638 2.44 11.12 11.12 0 0 1-4.66.849H560l-.02-15.01a8.33 8.33 0 0 1 2-.2 8 8 0 0 1 .168-.007zm-26.359.033a6.88 6.88 0 0 1 5.49 2.383 9.41 9.41 0 0 1 1.881 6c0 2.98-.72 5.011-2.14 6.121a8.36 8.36 0 0 1-5.22 1.64 17.58 17.58 0 0 1-3.28-.31v-15.57a16.89 16.89 0 0 1 3.04-.25 6.88 6.88 0 0 1 .23-.014zm-303.219.104a15.31 15.31 0 0 1 6.92 1.43 12.69 12.69 0 0 1 4.7 4 15.8 15.8 0 0 1 2.44 5.13 21.77 21.77 0 0 1 .79 5.82 18.06 18.06 0 0 1-1 6.35 13.84 13.84 0 0 1-2.62 4.44 10.33 10.33 0 0 1-4.59 3.15 20.63 20.63 0 0 1-5.81.709 18.54 18.54 0 0 1-3.66-.27 2.76 2.76 0 0 1-1.84-1.18 5.24 5.24 0 0 1-.6-2.839v-26.18a32.26 32.26 0 0 1 5.27-.56zm366.14 1.71h.1l5.58 15.68h-10.92l5.24-15.68z" style="fill:#fff;fill-opacity:1"/></svg>
\ No newline at end of file
diff --git a/public/img/ids-institute-for-the-german-language.svg b/public/img/ids-institute-for-the-german-language.svg
new file mode 100644
index 0000000..1e5561d
--- /dev/null
+++ b/public/img/ids-institute-for-the-german-language.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="921.02118"
+   height="188.88087"
+   id="ids-logo"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="ids-institute-for-german-language.svg">
+  <metadata
+     id="metadata13">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs11" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="640"
+     inkscape:window-height="480"
+     id="namedview9"
+     showgrid="false"
+     fit-margin-top="6"
+     fit-margin-left="6"
+     fit-margin-right="6"
+     fit-margin-bottom="6"
+     inkscape:zoom="0.31792439"
+     inkscape:cx="460.5106"
+     inkscape:cy="94.440451"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="ids-logo" />
+  <g
+     transform="translate(-98.260005,-64.863418)"
+     id="g3">
+    <path
+       d="m 161.11341,247.35043 c -20.8071,-1.77127 -34.04259,-6.70601 -40.81803,-15.21865 -11.43519,-14.36713 -16.07421,-35.68467 -16.03513,-73.68579 0.0473,-46.0156 8.63296,-71.977422 26.57478,-80.358492 20.96891,-9.79509 62.07198,-9.59699 82.37268,0.39702 18.60282,9.15813 27.47875,39.739092 25.96564,89.461472 -1.47023,48.3134 -11.20278,68.97665 -35.72556,75.84923 -11.67266,3.2713 -28.78653,4.70851 -42.33438,3.55521 z m 25.24242,-3.92684 c 30.26812,-3.18804 40.00574,-11.33592 45.49778,-38.06993 5.45958,-26.57594 4.36332,-80.57293 -2.03849,-100.40767 -7.72656,-23.939242 -19.77288,-30.064292 -58.83723,-29.916292 -21.39655,0.0811 -29.8958,1.4443 -40.13648,6.43768 -6.88335,3.35634 -10.06408,6.94981 -14.36959,16.2342 -5.63065,12.141952 -7.1403,22.981212 -7.69421,55.244412 -0.5425,31.5991 0.65286,46.59777 4.79193,60.12618 5.90897,19.31324 14.15581,26.0343 35.90835,29.26478 15.38451,2.28475 23.29082,2.51772 36.87794,1.08664 z m -3.83421,-30.4776 -0.0199,-11 3.31612,5.96064 c 2.49209,4.47948 4.39189,6.52953 7.64536,8.25 8.01354,4.23767 16.29962,2.42333 19.47288,-4.26381 2.10749,-4.44121 1.38176,-9.69801 -1.77448,-12.85346 -1.20105,-1.20075 -6.50151,-4.72416 -11.7788,-7.82981 -5.2773,-3.10565 -11.06274,-7.31821 -12.85656,-9.36125 -3.07959,-3.50746 -3.23906,-4.0666 -2.85959,-10.02616 0.30318,-4.76135 0.94338,-6.88793 2.60656,-8.6583 1.21256,-1.29071 2.20466,-2.65525 2.20466,-3.0323 0,-0.37705 -7.0875,-0.6646 -15.75,-0.63899 l -15.75,0.0466 4.6519,2.42275 c 9.86801,5.13935 14.54227,14.94648 13.55232,28.43437 -1.00868,13.74314 -6.02672,22.44663 -15.48137,26.85153 -5.39214,2.51218 -6.70525,2.68221 -22.72285,2.94236 -16.83038,0.27335 -16.96508,0.25845 -13.5,-1.49341 l 3.5,-1.76951 0,-27.4906 0,-27.49061 -4.17396,-1.0073 c -2.29568,-0.55401 -4.39513,-1.22901 -4.66545,-1.5 -0.27032,-0.27098 6.78297,-0.54023 15.67396,-0.59832 15.36268,-0.10037 31.82553,-2.15446 33.90092,-4.22985 0.43645,-0.43645 0.67452,-14.93952 0.52904,-32.22904 l -0.26449,-31.435532 -4.17396,-1.0073 c -2.29568,-0.55401 -4.39568,-1.22901 -4.66667,-1.5 -0.27099,-0.27098 5.9573,-0.4927 13.84063,-0.4927 7.88333,0 14.11162,0.22172 13.84063,0.4927 -0.27099,0.27099 -2.37099,0.94599 -4.66667,1.5 l -4.17396,1.0073 -0.26407,31.769402 -0.26408,31.7694 2.76408,1.13496 c 1.52024,0.62423 8.61407,1.19962 15.76407,1.27865 7.15,0.079 14.4172,0.50676 16.14933,0.95051 2.70074,0.69189 3.24449,0.507 3.81739,-1.29805 1.40339,-4.4217 2.53328,-1.79237 2.53328,5.89513 0,4.4 -0.3375,7.9879 -0.75,7.9731 -0.4125,-0.0148 -1.80902,-1.74525 -3.10337,-3.84545 -3.16194,-5.13053 -6.84027,-7.12765 -13.12785,-7.12765 -4.38378,0 -5.61841,0.44578 -8.0957,2.92308 -2.35338,2.35337 -2.92308,3.78882 -2.92308,7.36514 0,6.09388 2.26977,8.60357 12.73812,14.08453 9.99902,5.23523 11.84463,6.63314 15.78491,11.95583 5.65111,7.63375 3.03173,17.74322 -5.89762,22.7618 -5.35835,3.01156 -15.79442,3.7215 -22.27017,1.51499 -2.66232,-0.90714 -4.97261,-1.25327 -5.13397,-0.76917 -0.16137,0.4841 -0.93786,1.73149 -1.72553,2.77199 -1.27102,1.67899 -1.43437,0.65435 -1.45201,-9.10819 z m -28.33864,2.29859 c 8.97125,-4.21698 12.30514,-11.8704 12.27295,-28.17432 -0.0305,-15.45093 -2.69672,-20.97809 -11.66184,-24.17546 -4.79512,-1.71015 -16.49418,-1.87083 -18.1162,-0.24881 -1.75964,1.75964 -1.71195,54.40536 0.05,55.18997 2.37437,1.05732 13.07127,-0.53074 17.45509,-2.59138 z"
+       style="fill:#000000"
+       id="path5"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 688.96875,72.625 c -1.25007,8.3e-5 -2.42804,0.474258 -3.3125,1.34375 -0.62289,0.612419 -0.9591,1.398713 -1.15625,2.21875 l -0.21875,0 0,1 0,1.03125 0.1875,0 c 0.18633,0.853108 0.55586,1.650508 1.1875,2.25 l 0,0.03125 c 0.88048,0.804924 2.04602,1.187571 3.3125,1.1875 1.27418,7.2e-5 2.4762,-0.427253 3.375,-1.25 0.89166,-0.846356 1.37495,-2.016631 1.375,-3.25 -5e-5,-1.224343 -0.49978,-2.358207 -1.40625,-3.21875 -0.90652,-0.860393 -2.09371,-1.343667 -3.34375,-1.34375 z m 13.40625,0 c -1.25007,8.3e-5 -2.43726,0.483328 -3.34375,1.34375 -0.64727,0.614445 -0.98392,1.386995 -1.1875,2.21875 l -0.21875,0 0,1 0,1.03125 0.1875,0 c 0.19777,0.840723 0.54333,1.629207 1.1875,2.21875 0.89876,0.82278 2.10078,1.250072 3.375,1.25 1.27416,7.2e-5 2.43487,-0.416877 3.3125,-1.25 0.87759,-0.833007 1.37495,-2.006983 1.375,-3.25 -5e-5,-1.215352 -0.49662,-2.355047 -1.375,-3.21875 -0.8845,-0.86946 -2.06247,-1.343667 -3.3125,-1.34375 z m -375.71875,10.5625 0,2.6875 0,54.09375 0,1.03125 0,1 2.03125,0 3.75,0 1.03125,0 0,-1 0,-40.0625 37.625,42.28125 1.78125,2.03125 0,-2.71875 0,-54.4375 0,-1 -1.03125,0 -4.71875,0 -1.03125,0 0,1 0,39.3125 -37.65625,-42.21875 -1.78125,-2 z m 71.71875,2.625 c -4.45121,5.6e-5 -8.20277,1.275442 -11.09375,3.8125 l -0.0312,0 c -2.8659,2.539096 -4.31251,5.938525 -4.3125,9.9375 -10e-6,3.22047 0.99274,6.08334 3,8.40625 2.03794,2.35854 5.85644,4.84957 11.5,7.6875 0.009,0.005 0.0218,-0.005 0.0312,0 4.31571,2.18104 7.07668,4.14312 8.1875,5.5625 l 0.0312,0 c 1.18705,1.48828 1.78122,3.34643 1.78125,5.71875 -3e-5,3.29782 -0.89161,5.70779 -2.65625,7.46875 -1.76304,1.75933 -4.19663,2.65625 -7.53125,2.65625 -2.60537,0 -4.77779,-0.65749 -6.59375,-1.9375 -1.79589,-1.31131 -3.05528,-3.10535 -3.8125,-5.53125 l -0.375,-1.15625 -1.0625,0.53125 -4.28125,2.1875 -0.0625,0.0312 -0.875,0.375 0.0312,0.0625 -0.0625,0.0312 0.4375,0.84375 0.46875,0.96875 0.0625,-0.0312 c 1.49243,3.06913 3.40638,5.57498 5.90625,7.25 l 0.0312,0 c 2.79622,1.82965 6.12442,2.75 9.9375,2.75 5.21141,0 9.4944,-1.46587 12.625,-4.4375 l 0,-0.0312 c 3.12685,-2.99396 4.68747,-7.07712 4.6875,-12.03125 -3e-5,-3.67115 -0.84167,-6.75388 -2.59375,-9.15625 -1.77373,-2.45863 -5.03073,-4.82727 -9.84375,-7.34375 l -0.0312,0 0,-0.0312 c -0.61753,-0.31747 -1.48693,-0.76459 -2.65625,-1.34375 -3.15107,-1.56619 -5.48273,-3.15615 -6.96875,-4.75 -1.48602,-1.59385 -2.125,-3.13044 -2.125,-4.6875 -1e-5,-2.387096 0.68388,-4.088836 2.09375,-5.40625 l 0,-0.03125 c 1.41454,-1.342688 3.29635,-2.031203 5.84375,-2.03125 1.89552,4.8e-5 3.48341,0.392869 4.78125,1.09375 1.32572,0.70391 2.30804,1.679807 3.03125,3.03125 l 0.5,0.9375 0.90625,-0.53125 3.9375,-2.25 0.875,-0.5 -0.5,-0.875 c -1.37629,-2.382191 -3.21331,-4.236415 -5.46875,-5.4375 l 0,0.03125 c -2.22674,-1.226396 -4.82084,-1.843693 -7.75,-1.84375 z m -90.75,1.28125 0,1 0,51.875 0,1.03125 0,1 1.03125,0 1,0 4.0625,0 1,0 0,-1 0,-52.90625 0,-1 -1,0 -5.0625,0 -1.03125,0 z m 110.53125,0 0,1 0,4.53125 0,1.03125 1.03125,0 14.3125,0 0,46.3125 0,1.03125 0,1 2.0625,0 4.03125,0 1,0 0,-1 0,-47.34375 14.375,0 1,0 0,-1.03125 0,-4.53125 0,-1 -1,0 -35.78125,0 -1.03125,0 z m 44.25,0 0,1 0,51.875 0,1.03125 0,1 1.03125,0 1.03125,0 4.03125,0 1.03125,0 0,-1 0,-52.90625 0,-1 -1.03125,0 -5.0625,0 -1.03125,0 z m 13.59375,0 0,1 0,4.53125 0,1.03125 1.03125,0 14.3125,0 0,46.3125 0,1.03125 0,1 2.03125,0 4.03125,0 1.03125,0 0,-1 0,-47.34375 14.34375,0 1.03125,0 0,-1.03125 0,-4.53125 0,-1 -1.03125,0 -35.75,0 -1.03125,0 z m 44.03125,0 0,2.03125 0,31.96875 c -10e-6,7.31196 1.72685,12.92838 5.3125,16.71875 l 0,0.0312 c 3.58863,3.76775 8.99978,5.59375 16,5.59375 6.97546,0 12.38096,-1.82695 15.96875,-5.59375 l 0,-0.0312 c 3.5856,-3.79037 5.28121,-9.4068 5.28125,-16.71875 l 0,-33 0,-1 -1.03125,0 -5.03125,0 -1.03125,0 0,1 0,34.53125 c -4e-5,5.06103 -1.20285,8.66577 -3.46875,10.96875 -2.2668,2.2821 -5.75814,3.46875 -10.6875,3.46875 -5.008,0 -8.54941,-1.19034 -10.8125,-3.46875 -2.26596,-2.30298 -3.46876,-5.90773 -3.46875,-10.96875 l 0,-34.53125 0,-1 -1.03125,0 -3.96875,0 -1,0 -1.03125,0 z m 48.65625,0 0,1 0,4.53125 0,1.03125 1.03125,0 14.3125,0 0,46.3125 0,1.03125 0,1 1.03125,0 1.03125,0 4.03125,0 1.03125,0 0,-1 0,-47.34375 14.34375,0 1,0 0,-1.03125 0,-4.53125 0,-1 -1,0 -35.78125,0 -1.03125,0 z m 66.78125,0 0,1 0,51.875 0,1.03125 0,1 1.03125,0 1.03125,0 4.03125,0 1.03125,0 0,-1 0,-26.28125 20.65625,0 1.03125,0 0,-1.03125 0,-4.53125 0,-1.03125 -1.03125,0 -20.65625,0 0,-14.46875 21.5,0 1.03125,0 0,-1.03125 0,-4.53125 0,-1 -1.03125,0 -27.59375,0 -1.03125,0 z m 38.90625,0 0,2.03125 0,31.96875 c -10e-6,7.31196 1.69559,12.92837 5.28125,16.71875 l 0,0.0312 c 3.58863,3.76775 9.03103,5.59375 16.03125,5.59375 6.97546,0 12.34971,-1.82695 15.9375,-5.59375 l 0,-0.0312 c 3.5856,-3.79037 5.31246,-9.4068 5.3125,-16.71875 l 0,-33 0,-1 -1.03125,0 -5.0625,0 -1,0 0,1 0,34.53125 c -4e-5,5.06103 -1.2341,8.66577 -3.5,10.96875 -2.26726,2.27095 -5.73932,3.46875 -10.65625,3.46875 -5.008,0 -8.54941,-1.19034 -10.8125,-3.46875 -2.26595,-2.30298 -3.46877,-5.90773 -3.46875,-10.96875 l 0,-34.53125 0,-1 -1.03125,0 -3.96875,0 -2.03125,0 z m 54.09375,0 0,1 0,52.90625 0,1 1.03125,0 5.0625,0 1.03125,0 0,-1 0,-24.1875 1.5,0 19.25,24.8125 0.3125,0.375 0.5,0 5.65625,0 0.34375,0.4375 0.5625,-0.4375 0.625,0 0,-0.5 0.4375,-0.34375 -0.4375,-0.53125 0,-0.65625 -0.53125,0 -18.46875,-23.3125 c 3.75591,-0.3228 6.92086,-1.48225 9.28125,-3.65625 2.80705,-2.56004 4.21872,-6.1361 4.21875,-10.46875 -3e-5,-5.035335 -1.64592,-9.031001 -4.90625,-11.625 l 0,-0.03125 c -0.007,-0.0054 -0.0245,0.0053 -0.0312,0 -3.25587,-2.582225 -7.99637,-3.781197 -14.15625,-3.78125 l -10.25,0 -1.03125,0 z m 7.125,6.21875 4.0625,0 c 4.4768,4.8e-5 7.53855,0.800694 9.15625,2.09375 1.62054,1.295446 2.49997,3.514034 2.5,6.96875 -3e-5,3.25706 -0.87252,5.32677 -2.4375,6.53125 -1.52434,1.15688 -4.62128,1.90628 -9.21875,1.90625 l -4.0625,0 0,-17.5 z m 113.4375,70.75 -0.9375,2.15625 -24.21875,54.375 -0.34375,0 0,0.78125 -0.34375,0.75 0.34375,0.15625 0,0.375 0.84375,0 0.6875,0.3125 0.15625,-0.3125 4.46875,0 0.6875,0 0.25,-0.65625 7.15625,-17.28125 21.34375,0 L 866,222 l 0.25,0.65625 0.6875,0 5.53125,0 1.53125,0 -0.59375,-1.4375 -23.4375,-54.96875 -0.9375,-2.1875 z m -340.75,2.375 c -4.45122,4e-5 -8.23401,1.27545 -11.125,3.8125 -2.8659,2.5391 -4.34375,5.93853 -4.34375,9.9375 0,3.22047 1.024,6.08334 3.03125,8.40625 2.04134,2.36246 5.84088,4.84363 11.5,7.6875 4.33212,2.18686 7.10548,4.14 8.21875,5.5625 1.18706,1.48827 1.81247,3.34642 1.8125,5.71875 -3e-5,3.29782 -0.92286,5.70779 -2.6875,7.46875 -1.76301,1.75932 -4.19664,2.6875 -7.53125,2.6875 -2.61637,0 -4.77299,-0.67796 -6.59375,-1.96875 -1.78609,-1.31022 -3.05786,-3.11364 -3.8125,-5.53125 l -0.34375,-1.15625 -1.09375,0.5625 -4.28125,2.15625 -0.0625,0.0312 -0.875,0.375 0.0312,0.0625 -0.0625,0.0312 0.4375,0.84375 0.5,1 0.0625,-0.0312 c 1.49049,3.05162 3.41637,5.55041 5.90625,7.21875 2.79622,1.82963 6.15567,2.75 9.96875,2.75 5.21141,0 9.4944,-1.46586 12.625,-4.4375 3.12687,-2.99395 4.68746,-7.10839 4.6875,-12.0625 -4e-5,-3.67115 -0.84166,-6.75387 -2.59375,-9.15625 -1.77373,-2.45863 -5.06198,-4.82727 -9.875,-7.34375 -0.61753,-0.31747 -1.51818,-0.76459 -2.6875,-1.34375 -3.15107,-1.56618 -5.45148,-3.1874 -6.9375,-4.78125 C 500.67028,183.3437 500,181.80706 500,180.25 c -10e-6,-2.38709 0.71513,-4.08884 2.125,-5.40625 1.41453,-1.34269 3.29636,-2.0312 5.84375,-2.03125 1.89552,5e-5 3.45218,0.36162 4.75,1.0625 1.32571,0.70391 2.3393,1.67981 3.0625,3.03125 l 0.5,0.9375 0.90625,-0.53125 3.90625,-2.21875 0.90625,-0.53125 -0.53125,-0.875 c -1.3763,-2.3822 -3.18206,-4.20516 -5.4375,-5.40625 -2.22674,-1.22639 -4.82084,-1.84371 -7.75,-1.84375 z m 211.40625,0 c -4.45121,4e-5 -8.20277,1.27545 -11.09375,3.8125 l -0.0312,0 c -2.8659,2.53909 -4.31251,5.93852 -4.3125,9.9375 -10e-6,3.22048 0.99274,6.08334 3,8.40625 2.03794,2.35854 5.85644,4.84956 11.5,7.6875 0.009,0.005 0.0218,-0.005 0.0312,0 4.31571,2.18104 7.07667,4.14312 8.1875,5.5625 l 0.0312,0 c 1.18705,1.48828 1.78122,3.34642 1.78125,5.71875 -3e-5,3.29782 -0.89161,5.70779 -2.65625,7.46875 -1.76302,1.75933 -4.19664,2.6875 -7.53125,2.6875 -2.6,0 -4.78014,-0.66275 -6.59375,-1.9375 -0.012,-0.009 -0.0194,-0.0225 -0.0312,-0.0312 -1.77681,-1.30916 -3.02908,-3.12151 -3.78125,-5.53125 l -0.375,-1.15625 -1.0625,0.5625 -4.28125,2.15625 -0.0625,0.0312 -0.875,0.375 0.0312,0.0625 -0.0625,0.0312 0.4375,0.84375 0.46875,1 0.0937,-0.0312 c 1.49033,3.0502 3.38591,5.55095 5.875,7.21875 l 0.0312,0 c 2.79622,1.82963 6.12441,2.75 9.9375,2.75 5.21141,0 9.4944,-1.46586 12.625,-4.4375 3.12686,-2.99395 4.68746,-7.10839 4.6875,-12.0625 -4e-5,-3.67115 -0.84167,-6.75388 -2.59375,-9.15625 -1.77373,-2.45863 -5.06198,-4.82727 -9.875,-7.34375 -0.61753,-0.31747 -1.48693,-0.76459 -2.65625,-1.34375 -3.15107,-1.56618 -5.48272,-3.1874 -6.96875,-4.78125 -1.48603,-1.59385 -2.12501,-3.13044 -2.125,-4.6875 -2e-5,-2.38709 0.68388,-4.08884 2.09375,-5.40625 1.41454,-1.3427 3.29635,-2.0312 5.84375,-2.03125 1.89552,5e-5 3.48341,0.36162 4.78125,1.0625 1.32571,0.70391 2.30805,1.67981 3.03125,3.03125 l 0.5,0.9375 0.90625,-0.53125 3.9375,-2.21875 0.875,-0.53125 -0.5,-0.875 c -1.37629,-2.3822 -3.21331,-4.20516 -5.46875,-5.40625 -2.22674,-1.22639 -4.82083,-1.84371 -7.75,-1.84375 z m -158.5,0.0937 c -4.10066,6e-5 -8.05892,0.71084 -11.875,2.125 -3.78979,1.41418 -7.06306,3.37619 -9.78125,5.90625 -2.79436,2.57747 -4.93733,5.63997 -6.4375,9.1875 l 0,0.0312 c -1.4743,3.54865 -2.21875,7.36536 -2.21875,11.4375 0,4.14007 0.70587,7.96435 2.15625,11.46875 1.45015,3.50393 3.59155,6.60317 6.40625,9.25 2.74282,2.57855 6.05098,4.58475 9.84375,6 3.79343,1.41552 7.75632,2.125 11.90625,2.125 3.09244,0 6.21435,-0.4526 9.34375,-1.34375 3.15312,-0.86576 6.12194,-2.11676 8.9375,-3.75 l 0.53125,-0.3125 0,-0.5625 0,-5.65625 0,-2.03125 -1.65625,1.21875 c -2.63434,1.96306 -5.40444,3.4377 -8.34375,4.4375 -2.94055,1.0002 -5.94572,1.50001 -9.03125,1.5 -3.18299,1e-5 -6.13599,-0.53266 -8.90625,-1.59375 -2.74495,-1.06068 -5.17443,-2.59546 -7.3125,-4.625 -2.15287,-2.0665 -3.75083,-4.41619 -4.8125,-7.0625 -0.004,-0.009 0.004,-0.0223 0,-0.0312 -1.03117,-2.65171 -1.56251,-5.65793 -1.5625,-9.03125 -10e-6,-6.73846 2.11351,-12.07486 6.40625,-16.21875 4.31881,-4.1456 9.87621,-6.18745 16.875,-6.1875 3.0804,5e-5 6.00556,0.52251 8.78125,1.5625 2.6351,0.98742 5.2195,2.52437 7.78125,4.5625 l 0,0.5 0.6875,0 0.5,0.4375 0.34375,-0.40625 0.53125,0 0.0312,-0.6875 0.40625,-0.5 -0.40625,-0.3125 0.0625,-4.84375 0,-0.53125 -0.40625,-0.3125 c -2.58214,-1.92575 -5.47167,-3.36457 -8.625,-4.3125 -3.12781,-0.97298 -6.51433,-1.43744 -10.15625,-1.4375 z m 339.09375,0 c -4.10066,6e-5 -8.05893,0.71084 -11.875,2.125 l -0.0312,0 c -3.7898,1.41418 -7.0318,3.37619 -9.75,5.90625 -2.79437,2.57747 -4.96859,5.63997 -6.46875,9.1875 l 0,0.0312 c -1.47431,3.54865 -2.21876,7.36536 -2.21875,11.4375 -10e-6,4.14007 0.73712,7.96435 2.1875,11.46875 1.45016,3.50393 3.59155,6.60317 6.40625,9.25 2.74283,2.57855 6.01974,4.58475 9.8125,6 3.79343,1.41552 7.78758,2.125 11.9375,2.125 3.08258,0 6.19317,-0.45825 9.3125,-1.34375 0.01,-0.003 0.0217,0.003 0.0312,0 3.1426,-0.86547 6.13044,-2.12169 8.9375,-3.75 l 0.5,-0.3125 0,-0.5625 0,-5.65625 0,-2.03125 -1.625,1.21875 c -2.63434,1.96306 -5.40444,3.4377 -8.34375,4.4375 -2.94055,1.0002 -5.94572,1.50001 -9.03125,1.5 -3.18299,1e-5 -6.16723,-0.53266 -8.9375,-1.59375 -2.74495,-1.06068 -5.17445,-2.59546 -7.3125,-4.625 -2.15286,-2.0665 -3.75083,-4.41619 -4.8125,-7.0625 -0.004,-0.009 0.004,-0.0223 0,-0.0312 -1.03115,-2.65169 -1.5625,-5.65797 -1.5625,-9.03125 0,-6.73846 2.14476,-12.07486 6.4375,-16.21875 4.31882,-4.1456 9.84497,-6.18745 16.84375,-6.1875 3.08041,5e-5 6.00554,0.52251 8.78125,1.5625 2.64723,0.99196 5.23927,2.54129 7.8125,4.59375 l 0,0.46875 0.65625,0 0.53125,0.4375 0.34375,-0.40625 0.53125,0 0,-0.6875 0.40625,-0.5 -0.40625,-0.34375 0.0937,-4.8125 0,-0.53125 -0.4375,-0.3125 c -2.58215,-1.92575 -5.44042,-3.36457 -8.59375,-4.3125 -3.12781,-0.97298 -6.51433,-1.43744 -10.15625,-1.4375 z m -592.65625,1.1875 0,1.03125 0,51.84375 0,1.03125 0,1.03125 2.03125,0 7.65625,0 1.71875,0 c 6.91185,0 11.92423,-0.36917 15.1875,-1.15625 3.21431,-0.77529 6.10193,-2.09716 8.625,-3.9375 3.19275,-2.32354 5.65533,-5.41864 7.34375,-9.25 1.68796,-3.85557 2.5312,-8.23289 2.53125,-13.09375 -5e-5,-4.86081 -0.84223,-9.22951 -2.53125,-13.0625 -1.68835,-3.83115 -4.17322,-6.99739 -7.40625,-9.4375 -2.46259,-1.85473 -5.3816,-3.1568 -8.75,-3.90625 -3.41575,-0.75987 -8.9496,-1.0937 -16.71875,-1.09375 l -8.65625,0 -1.03125,0 z m 54.34375,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 1,0 1.03125,0 26.5625,0 1.03125,0 0,-1.03125 0,-4.53125 0,-1 -1.03125,0 -21.5,0 0,-20.75 21.5,0 1.03125,0 0,-1.03125 0,-4.5 0,-1.03125 -1.03125,0 -21.5,0 0,-14.5 21.5,0 1.03125,0 0,-1.03125 0,-4.5 0,-1.03125 -1.03125,0 -27.59375,0 -1,0 z m 39.78125,0 0,2.03125 0,31.96875 c -10e-6,7.31196 1.72684,12.95963 5.3125,16.75 3.58862,3.76775 8.99978,5.59375 16,5.59375 6.97546,0 12.38096,-1.82695 15.96875,-5.59375 3.5856,-3.79037 5.31246,-9.43805 5.3125,-16.75 l 0,-32.96875 0,-1.03125 -1.03125,0 -5.0625,0 -1.03125,0 0,1.03125 0,34.53125 c -4e-5,5.06104 -1.20285,8.63453 -3.46875,10.9375 -2.2668,2.28211 -5.75814,3.5 -10.6875,3.5 -5.00799,0 -8.51816,-1.22158 -10.78125,-3.5 -2.26595,-2.30297 -3.46877,-5.87647 -3.46875,-10.9375 l 0,-34.53125 0,-1.03125 -1.03125,0 -3.96875,0 -1.03125,0 -1.03125,0 z m 48.6875,0 0,1.03125 0,4.5 0,1.03125 1.03125,0 14.28125,0 0,46.3125 0,1.03125 0,1.03125 2.0625,0 4.03125,0 1.03125,0 0,-1.03125 0,-47.34375 14.34375,0 1.03125,0 0,-1.03125 0,-4.5 0,-1.03125 -1.03125,0 -35.75,0 -1.03125,0 z m 138.78125,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 1,0 1.03125,0 4.03125,0 1.03125,0 0,-1.03125 0,-26.28125 28.28125,0 0,26.28125 0,1.03125 1.03125,0 5.0625,0 1.03125,0 0,-1.03125 0,-52.875 0,-1.03125 -1.03125,0 -5.0625,0 -1.03125,0 0,1.03125 0,20.40625 -28.28125,0 0,-20.40625 0,-1.03125 -1.03125,0 -5.0625,0 -1,0 z m 54.3125,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 1.03125,0 1.03125,0 26.5625,0 1.03125,0 0,-1.03125 0,-4.53125 0,-1 -1.03125,0 -21.5,0 0,-20.75 21.5,0 1.03125,0 0,-1.03125 0,-4.5 0,-1.03125 -1.03125,0 -21.5,0 0,-14.5 21.5,0 1.03125,0 0,-1.03125 0,-4.5 0,-1.03125 -1.03125,0 -27.59375,0 -1.03125,0 z m 101.375,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 2.0625,0 4.03125,0 1.03125,0 0,-1.03125 0,-22.71875 4.84375,0 c 6.54255,2e-5 11.43696,-1.16068 14.6875,-3.71875 l 0.0312,0 c 3.24614,-2.58095 4.81247,-6.67176 4.8125,-11.90625 -3e-5,-2.68162 -0.50117,-5.13624 -1.53125,-7.375 -1.0314,-2.24135 -2.49943,-4.06332 -4.40625,-5.375 l -0.0312,0 c -1.51719,-1.02114 -3.27138,-1.75499 -5.28125,-2.1875 -2.02575,-0.44167 -5.01945,-0.62495 -9.0625,-0.625 l -10.15625,0 -1.03125,0 z m 38.96875,0 0,1.03125 0,52.875 0,1.03125 1.03125,0 5.0625,0 1.03125,0 0,-1.03125 0,-24.1875 1.5,0 19.25,24.8125 0.3125,0.40625 0.5,0 5.6875,0 0.3125,0.40625 0.5,-0.40625 0.6875,0 0,-0.53125 0.4375,-0.34375 -0.4375,-0.53125 0,-0.65625 -0.53125,0 -18.5,-23.3125 c 3.7697,-0.3187 6.94565,-1.47628 9.3125,-3.65625 2.80704,-2.56003 4.21871,-6.1361 4.21875,-10.46875 -4e-5,-5.05337 -1.65368,-9.06296 -4.9375,-11.65625 -3.2564,-2.59329 -7.98365,-3.7812 -14.15625,-3.78125 l -10.25,0 -1.03125,0 z m 145.4375,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 1.03125,0 1.03125,0 4.03125,0 1.03125,0 0,-1.03125 0,-26.28125 28.25,0 0,26.28125 0,1.03125 1.03125,0 5.0625,0 1.03125,0 0,-1.03125 0,-52.875 0,-1.03125 -1.03125,0 -5.0625,0 -1.03125,0 0,1.03125 0,20.40625 -28.25,0 0,-20.40625 0,-1.03125 -1.03125,0 -5.0625,0 -1.03125,0 z m 54.34375,0 0,1.03125 0,51.84375 0,1.03125 0,1.03125 2.03125,0 26.5625,0 1.0312,0 0,-1.03125 0,-4.53125 0,-1 -1.0312,0 -21.5,0 0,-20.75 21.5,0 1.0312,0 0,-1.03125 0,-4.5 0,-1.03125 -1.0312,0 -21.5,0 0,-14.5 21.5,0 1.0312,0 0,-1.03125 0,-4.5 0,-1.03125 -1.0312,0 -27.5625,0 -1.03125,0 z m -668.9375,6.03125 3.53125,0 0.9375,0 c 6.35923,5e-5 10.81643,0.32692 13.1875,0.90625 2.42962,0.59374 4.45025,1.59601 6.09375,3 2.22294,1.86057 3.89446,4.21764 5.03125,7.15625 l 0,0.0312 c 1.16127,2.93964 1.74996,6.37001 1.75,10.3125 -4e-5,3.84592 -0.57968,7.21152 -1.71875,10.15625 -1.13897,2.94431 -2.79033,5.38303 -5,7.34375 -1.54519,1.3556 -3.44187,2.31473 -5.71875,2.90625 -2.22357,0.55544 -6.27724,0.87501 -12,0.875 l -6.09375,0 0,-42.6875 z m 437.3125,0.21875 2.4375,0 c 4.02234,5e-5 6.86478,0.20866 8.375,0.59375 1.55185,0.3958 2.69426,1.07245 3.53125,1.96875 0.87343,0.93825 1.53252,1.98894 1.96875,3.1875 0.43534,1.17459 0.65622,2.47764 0.65625,3.9375 -3e-5,3.51186 -0.94608,5.70489 -2.75,6.96875 -1.72179,1.20118 -5.72405,2.00003 -11.78125,2 l -2.4375,0 0,-18.65625 z m 38.96875,0 4.0625,0 c 4.4768,5e-5 7.53856,0.76944 9.15625,2.0625 1.62054,1.29544 2.49997,3.51404 2.5,6.96875 -3e-5,3.25707 -0.87253,5.32678 -2.4375,6.53125 -1.51799,1.16459 -4.60329,1.90628 -9.21875,1.90625 l -4.0625,0 0,-17.46875 z m 57.65625,5.25 8,19.34375 -16.3125,0 8.3125,-19.34375 z"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path7"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/public/img/ids-leibniz-institute-for-the-german-language.svg b/public/img/ids-leibniz-institute-for-the-german-language.svg
new file mode 100644
index 0000000..a32196f
--- /dev/null
+++ b/public/img/ids-leibniz-institute-for-the-german-language.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 630.75 200"
+   height="200"
+   width="630.75"
+   xml:space="preserve"
+   version="1.1"
+   id="svg2"><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><clipPath
+       id="clipPath16"
+       clipPathUnits="userSpaceOnUse"><path
+         style="clip-rule:evenodd"
+         id="path18"
+         d="m 0,0.1 595.2,0 0,841.8 L 0,841.9 0,0.1 Z" /></clipPath></defs><g
+     transform="matrix(1.25,0,0,-1.25,-76.375,1036.125)"
+     id="g10"><g
+       id="g4314"><path
+         d="m 218.9,755.8 0.2,0 c 0.3,0 0.5,0.1 0.7,0.2 0.1,0.1 0.2,0.1 0.3,0.3 0.1,0 0.2,0.2 0.2,0.3 0.2,0.2 0.3,0.5 0.3,0.8 0,0.1 0,0.1 0,0.1 l 0,12 c 0,0 0,0.1 0,0.2 0,0.3 -0.1,0.5 -0.2,0.8 -0.1,0.1 -0.2,0.2 -0.3,0.4 -0.1,0 -0.2,0.1 -0.2,0.1 -0.4,0.2 -0.6,0.3 -1,0.3 l 0,0.1 5.1,0 0,-0.1 c -0.4,-0.1 -0.7,-0.1 -1,-0.3 -0.1,0 -0.2,-0.1 -0.2,-0.1 -0.2,-0.2 -0.3,-0.3 -0.3,-0.4 -0.2,-0.3 -0.3,-0.5 -0.3,-0.8 0,-0.1 0,-0.2 0.1,-0.3 l 0,-11.5 c -0.1,-0.1 -0.1,-0.1 -0.1,-0.2 0,-0.3 0.1,-0.6 0.3,-0.9 0,-0.1 0.2,-0.2 0.3,-0.3 0,0 0,0 0,0 0.5,-0.3 0.9,-0.4 1.4,-0.4 0.1,0 0.2,0 0.2,0 l 1.4,0 c 0.1,0 0.1,0 0.2,0 0.4,0 0.8,0 1.3,0.2 0,0 0.1,0.1 0.2,0.1 0.3,0.2 0.4,0.3 0.6,0.6 0.1,0.1 0.1,0.2 0.2,0.3 0.2,0.3 0.3,0.6 0.4,0.9 l 0.2,0 -0.6,-2.6 -9.4,0 0,0.2 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path22" /><path
+         d="m 232.1,771.3 0,0.1 9.4,0 0,-2.4 -0.1,0 c 0,1.3 -0.9,2 -2.7,2 l -3.3,0 0,-7.2 2.9,0 c 0,0 0,0 0.1,0 0.5,0 1,0 1.4,0.2 0.1,0.1 0.1,0.1 0.1,0.1 0.3,0.1 0.4,0.3 0.5,0.5 0.1,0.2 0.2,0.4 0.2,0.7 l 0,0 0.2,0 0,-3.5 -0.2,0 c 0,0.2 -0.1,0.5 -0.3,0.7 0,0.1 0,0.2 -0.1,0.2 -0.1,0.2 -0.2,0.3 -0.4,0.4 0,0 0,0 -0.1,0 -0.1,0.1 -0.3,0.1 -0.5,0.2 -0.2,0 -0.5,0 -0.7,0 l 0,0 -3.1,0 0,-5.6 0,0 c 0,0 0,-0.1 0,-0.1 0,-0.4 0.1,-0.7 0.2,-1 0.2,-0.3 0.6,-0.5 1.1,-0.5 l 2.4,0 c 0.1,0 0.1,0 0.1,0 0.5,0 0.9,0.1 1.3,0.3 l 0,0 c 0.1,0 0.2,0.1 0.2,0.1 0.3,0.1 0.5,0.3 0.7,0.6 l 0,0 c 0.1,0.1 0.1,0.2 0.2,0.3 0.1,0.2 0.3,0.5 0.3,0.8 l 0.2,0 -0.6,-2.5 -9.4,0 0,0.2 0.2,0 c 0.3,0 0.5,0 0.7,0.2 0.1,0 0.2,0.1 0.3,0.2 0.1,0.1 0.2,0.2 0.2,0.3 0.2,0.3 0.3,0.5 0.3,0.8 0,0.1 0,0.1 0,0.2 l 0,11.9 0,0 c 0,0 0,0 0,0 0,0.4 -0.1,0.8 -0.4,1.2 l 0,0 c -0.1,0.2 -0.2,0.3 -0.4,0.4 -0.2,0.1 -0.4,0.2 -0.6,0.2 0,0 -0.1,0 -0.1,0 l -0.2,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path24" /><path
+         d="m 251.3,771.4 0,-0.1 c 0,0 -0.1,0 -0.1,0 -0.3,0 -0.6,-0.1 -0.9,-0.3 -0.1,0 -0.1,-0.1 -0.2,-0.1 l 0,0 c -0.1,-0.1 -0.3,-0.2 -0.3,-0.4 -0.2,-0.2 -0.2,-0.5 -0.2,-0.8 0,0 0,-0.1 0,-0.2 l 0,-12 c 0,0 0,-0.1 0,-0.1 0,-0.3 0,-0.6 0.2,-0.8 0.1,-0.1 0.2,-0.3 0.3,-0.4 0.1,-0.1 0.1,-0.1 0.2,-0.1 0.3,-0.2 0.6,-0.3 1,-0.3 l 0,0 0,-0.2 -5,0 0,0.2 0,0 c 0,0 0,0 0,0 0.4,0 0.7,0.1 0.9,0.3 0.1,0 0.2,0 0.3,0.1 l 0,0 c 0.1,0.1 0.2,0.2 0.2,0.4 0.2,0.2 0.3,0.5 0.3,0.8 0,0 0,0.1 0,0.1 l 0,12 0,0 c 0,0.1 0,0.1 0,0.2 0,0.3 -0.1,0.6 -0.2,0.8 -0.1,0.2 -0.2,0.3 -0.3,0.4 l 0,0 c -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.2 -0.6,0.2 -1,0.2 l 0,0 0,0.2 5,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path26" /><path
+         d="m 261.7,755.6 -5.9,0 0,0.2 0.2,0 0,0 c 0.3,0 0.5,0.1 0.7,0.2 0.1,0.1 0.2,0.1 0.3,0.2 l 0,0 c 0.1,0.1 0.2,0.2 0.2,0.3 0.2,0.3 0.3,0.6 0.3,0.9 0,0 0,0.1 0,0.1 l 0,12 0,0 c 0,0 0,0 0,0.1 0,0.4 -0.1,0.7 -0.3,1 0,0.1 -0.1,0.1 -0.2,0.2 0,0.1 -0.2,0.2 -0.3,0.3 -0.2,0.1 -0.4,0.2 -0.7,0.2 0,0 0,0 0,0 l -0.2,0 0,0.1 5.1,0 c 0.1,0 0.1,0 0.1,0 0.6,0 1.2,0 1.8,-0.2 0.3,-0.2 0.6,-0.3 0.9,-0.4 0.2,-0.1 0.4,-0.3 0.6,-0.5 0.3,-0.3 0.6,-0.6 0.8,-1 0.1,0 0.1,-0.1 0.1,-0.2 l 0,0 c 0.2,-0.4 0.3,-0.8 0.3,-1.3 0,-0.1 0,-0.1 0,-0.1 l 0,0 c 0,0 0,-0.1 0,-0.1 0,-0.5 -0.1,-1 -0.4,-1.5 -0.1,-0.3 -0.3,-0.5 -0.5,-0.7 l 0,0 c -0.3,-0.3 -0.6,-0.5 -1,-0.7 -0.5,-0.3 -0.9,-0.5 -1.5,-0.6 l 0,-0.1 c 0.5,0 0.9,-0.1 1.4,-0.2 l 0,0 c 0.4,-0.1 0.8,-0.2 1.2,-0.4 l 0,0 c 0,0 0.1,-0.1 0.1,-0.1 0.4,-0.2 0.6,-0.4 0.9,-0.6 0.2,-0.3 0.4,-0.5 0.7,-0.9 0,0 0,0 0,0 0.4,-0.7 0.6,-1.3 0.6,-2.1 l 0,0 c 0,0 0,0 0,-0.1 0,-0.6 -0.2,-1.2 -0.5,-1.8 -0.1,0 -0.1,-0.1 -0.2,-0.2 -0.4,-0.6 -0.8,-1 -1.4,-1.4 l 0,0 c -0.9,-0.4 -1.8,-0.6 -2.8,-0.6 -0.1,0 -0.3,0 -0.4,0 z m -2.6,8.6 1,0 0,0 c 0.1,0 0.2,0 0.3,0 0.6,0 1,0 1.5,0.2 l 0,0 c 0.1,0 0.1,0.1 0.2,0.1 0.2,0.1 0.4,0.3 0.6,0.4 0.2,0.2 0.4,0.5 0.6,0.7 0,0.1 0,0.2 0.1,0.3 0.2,0.4 0.3,0.9 0.3,1.4 0,0 0,0.1 0,0.1 l 0,0 c 0,0.5 -0.1,0.9 -0.2,1.3 l 0,0 c -0.1,0.3 -0.2,0.4 -0.3,0.6 -0.1,0.2 -0.2,0.4 -0.4,0.6 l 0,0 c -0.2,0.2 -0.5,0.4 -0.8,0.6 -0.1,0.1 -0.1,0.1 -0.2,0.2 -0.4,0.1 -0.8,0.2 -1.3,0.2 l 0,0 c -0.5,0 -0.9,0 -1.4,-0.2 l 0,-6.5 z m 1.6,-0.5 -1.6,0 0,-5.7 0,0 c 0,0 0,-0.1 0,-0.1 0,-0.3 0,-0.6 0.1,-0.9 l 0,0 c 0,0 0.1,-0.1 0.1,-0.2 0.1,-0.1 0.2,-0.3 0.4,-0.4 0.1,0 0.1,0 0.1,0 l 0,0 c 0.5,-0.2 0.9,-0.3 1.4,-0.3 0,0 0.1,0 0.2,0 l 0,0 c 0.1,0 0.2,0 0.3,0 0.6,0 1.2,0.1 1.7,0.4 0.4,0.3 0.8,0.6 1.1,1 0,0.1 0,0.1 0,0.1 0.5,0.7 0.6,1.4 0.6,2.2 0,0.6 -0.1,1 -0.3,1.6 l 0,0 c 0,0.1 -0.1,0.2 -0.2,0.4 -0.2,0.3 -0.4,0.5 -0.7,0.8 l 0,0 c -0.2,0.2 -0.3,0.3 -0.6,0.4 -0.2,0.2 -0.5,0.3 -0.8,0.4 -0.6,0.2 -1.1,0.3 -1.8,0.3 l 0,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path28" /><path
+         d="m 287,771.4 0,-0.1 0,0 c -0.3,-0.1 -0.6,-0.1 -1,-0.3 l 0,0 c 0,0 0,0 0,0 -0.2,-0.1 -0.3,-0.2 -0.4,-0.4 0,-0.1 -0.1,-0.1 -0.1,-0.2 l 0,0 c -0.1,-0.4 -0.2,-0.7 -0.2,-1.1 0,-0.1 0,-0.2 0,-0.2 l 0,-13.9 -0.1,0 -12.1,13.6 0,-9.7 c 0,-0.1 0,-0.2 0,-0.3 0,-0.5 0,-1 0,-1.6 0.1,-0.3 0.2,-0.5 0.3,-0.8 l 0,0 0,0 c 0.2,-0.2 0.3,-0.3 0.5,-0.4 0.2,-0.1 0.5,-0.2 0.8,-0.2 0.1,0 0.1,0 0.1,0 l 0,-0.2 -3.9,0 0,0.2 0,0 0,0 c 0.3,0 0.6,0.1 0.9,0.3 0.1,0 0.1,0 0.1,0 l 0,0 c 0.1,0.1 0.3,0.2 0.3,0.4 0.1,0.1 0.2,0.3 0.2,0.5 l 0,0 c 0.1,0.6 0.2,1.1 0.2,1.7 0,0.1 0,0.2 0,0.3 l 0,10.3 -0.6,0.6 c -0.3,0.5 -0.6,0.8 -1.1,1 -0.3,0.2 -0.6,0.3 -1,0.3 l 0,0.2 3,0 11.9,-13.4 0,10.2 c 0,0.2 0,0.2 0,0.3 0,0.5 0,1 -0.1,1.5 0,0.2 0,0.3 -0.2,0.5 0,0.2 -0.1,0.3 -0.2,0.4 l 0,0 c -0.1,0 -0.2,0.1 -0.2,0.1 -0.4,0.2 -0.6,0.3 -1,0.3 0,0 -0.1,0 -0.1,0 l 0,0.1 4,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path30" /><path
+         d="m 296.5,771.4 0,-0.1 c -0.1,0 -0.1,0 -0.1,0 -0.3,0 -0.6,-0.1 -0.9,-0.3 -0.1,0 -0.2,-0.1 -0.2,-0.1 l 0,0 c -0.2,-0.1 -0.2,-0.2 -0.3,-0.4 -0.2,-0.2 -0.3,-0.5 -0.3,-0.8 0,0 0,-0.1 0,-0.2 l 0,-12 c 0,0 0,-0.1 0,-0.1 0,-0.3 0.1,-0.6 0.3,-0.8 0.1,-0.1 0.1,-0.3 0.3,-0.4 0.1,-0.1 0.2,-0.1 0.2,-0.1 0.3,-0.2 0.6,-0.3 0.9,-0.3 l 0.1,0 0,-0.2 -5.1,0 0,0.2 c 0.1,0 0.1,0 0.1,0 0.3,0 0.6,0.1 0.9,0.3 0.1,0 0.1,0 0.2,0.1 0.1,0.1 0.2,0.2 0.3,0.4 0.2,0.2 0.2,0.5 0.2,0.8 0,0 0,0.1 0,0.1 l 0,12 c 0,0.1 0,0.1 0,0.2 0,0.3 0,0.6 -0.2,0.8 -0.1,0.2 -0.2,0.3 -0.3,0.4 0,0 -0.1,0 -0.1,0.1 -0.4,0.2 -0.7,0.2 -1,0.2 l -0.1,0 0,0.2 5.1,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path32" /><path
+         d="m 312.2,770.9 -7.6,0 0,0 c -0.1,0 -0.1,0 -0.2,0 -0.5,0 -0.9,-0.1 -1.3,-0.3 l 0,0 c -0.2,0 -0.3,-0.1 -0.4,-0.1 -0.2,-0.2 -0.4,-0.3 -0.6,-0.6 l 0,0 c 0,0 -0.1,-0.1 -0.1,-0.1 -0.2,-0.4 -0.4,-0.8 -0.4,-1.2 l -0.2,0 0,2.8 13,0 0,-0.3 -11,-14.9 7.6,0 c 0.1,0 0.1,0 0.2,0 0.6,0 1.2,0.1 1.8,0.3 l 0,0 c 0.1,0 0.3,0.1 0.4,0.1 0.3,0.2 0.4,0.3 0.6,0.5 0.1,0.2 0.2,0.4 0.4,0.6 0.1,0.2 0.2,0.3 0.2,0.5 l 0.2,0 -0.7,-2.6 -12.9,0 0,0.3 11,15 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path34" /><path
+         d="m 318.5,763.9 5.8,0 0,-0.9 -5.8,0 0,0.9 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path36" /><path
+         d="m 332.9,771.4 0,-0.1 c 0,0 0,0 0,0 -0.4,0 -0.7,-0.1 -1,-0.3 0,0 -0.1,-0.1 -0.2,-0.1 l 0,0 c -0.1,-0.1 -0.2,-0.2 -0.3,-0.4 -0.1,-0.2 -0.2,-0.5 -0.2,-0.8 0,-0.1 0,-0.1 0,-0.2 l 0,-12 c 0,-0.1 0,-0.1 0,-0.1 0,-0.3 0.1,-0.6 0.2,-0.8 0.1,-0.2 0.2,-0.3 0.3,-0.4 0.1,-0.1 0.2,-0.1 0.3,-0.2 0.3,-0.1 0.6,-0.2 0.9,-0.2 l 0,0 0,-0.2 -5,0 0,0.2 0,0 c 0,0 0,0 0.1,0 0.3,0 0.6,0.1 0.9,0.2 0.1,0.1 0.1,0.1 0.2,0.2 l 0,0 c 0.1,0.1 0.2,0.2 0.3,0.3 0.1,0.3 0.2,0.5 0.2,0.9 0,0 0,0 0,0.1 l 0,12 0,0 c 0,0.1 0,0.1 0,0.2 0,0.3 0,0.6 -0.2,0.8 -0.1,0.2 -0.2,0.3 -0.3,0.4 l 0,0 c -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.2 -0.6,0.2 -1,0.2 l 0,0 0,0.2 5,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path38" /><path
+         d="m 353.2,771.4 0,-0.1 0,0 c -0.4,-0.1 -0.7,-0.1 -1,-0.3 l 0,0 c 0,0 0,0 -0.1,0 -0.1,-0.1 -0.2,-0.2 -0.3,-0.4 -0.1,-0.1 -0.1,-0.1 -0.1,-0.2 -0.2,-0.4 -0.2,-0.7 -0.2,-1.1 0,-0.1 0,-0.2 0,-0.2 l 0,-13.9 -0.1,0 -12.2,13.6 0,-9.7 c 0,-0.1 0,-0.2 0,-0.3 0,-0.5 0.1,-1 0.1,-1.6 0,-0.3 0.1,-0.5 0.3,-0.8 l 0,0 c 0.1,-0.1 0.3,-0.3 0.4,-0.4 0.3,-0.1 0.6,-0.2 0.9,-0.2 0,0 0.1,0 0.1,0 l 0,-0.2 -4,0 0,0.2 0,0 0,0 c 0.4,0 0.7,0.1 1,0.3 0,0 0,0 0.1,0 l 0,0 c 0.1,0.1 0.2,0.2 0.3,0.4 0.1,0.1 0.1,0.3 0.2,0.5 l 0,0 c 0.1,0.6 0.1,1.2 0.1,1.8 0,0.1 0,0.1 0,0.2 l 0,10.3 -0.5,0.6 c -0.3,0.5 -0.7,0.8 -1.1,1 l 0,0 c -0.3,0.2 -0.7,0.3 -1.1,0.3 l 0,0.2 3,0 12,-13.4 0,10.2 c 0,0.2 0,0.2 0,0.3 0,0.5 0,1 -0.1,1.5 0,0.2 -0.1,0.3 -0.2,0.5 -0.1,0.2 -0.2,0.3 -0.3,0.4 l 0,0 c 0,0 -0.1,0.1 -0.2,0.1 -0.3,0.2 -0.6,0.3 -0.9,0.3 -0.1,0 -0.1,0 -0.1,0 l 0,0.1 4,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path40" /><path
+         d="m 365.6,768.4 -0.1,0 0,0 c -0.1,0.5 -0.2,0.9 -0.5,1.3 -0.1,0.3 -0.3,0.5 -0.5,0.7 l 0,0 c -0.2,0.2 -0.4,0.3 -0.6,0.5 -0.5,0.3 -1,0.4 -1.5,0.4 -0.1,0 -0.1,0 -0.2,0 l 0,0 c 0,0 0,0 0,0 -0.6,0 -1.1,-0.1 -1.6,-0.4 0,0 0,0 0,0 l 0,0 c -0.5,-0.3 -0.8,-0.6 -1.1,-1.1 0,0 0,-0.1 0,-0.1 l 0,0 c -0.3,-0.6 -0.4,-1.1 -0.4,-1.7 0,-0.5 0.1,-0.9 0.2,-1.3 0.1,-0.2 0.1,-0.2 0.2,-0.4 0.2,-0.2 0.3,-0.4 0.6,-0.6 l 0,0 c 0.3,-0.4 0.6,-0.6 1,-0.9 0.4,-0.2 1,-0.5 1.7,-0.9 0.1,-0.1 0.3,-0.2 0.5,-0.3 0.8,-0.5 1.5,-1 2.2,-1.7 0.2,-0.1 0.3,-0.3 0.5,-0.6 0.3,-0.6 0.5,-1.1 0.5,-1.7 0,-0.1 0,-0.2 -0.1,-0.2 l 0,0 c 0,-0.8 -0.1,-1.4 -0.5,-2 l 0,0 0,0 c -0.3,-0.6 -0.8,-1.1 -1.5,-1.5 0,0 0,0 -0.1,0 l 0,0 c -0.7,-0.4 -1.5,-0.6 -2.4,-0.6 -0.1,0 -0.1,0 -0.2,0 l 0,0 c 0,0 0,0 -0.1,0 -0.5,0 -1,0 -1.6,0.2 l 0,0 c -0.5,0.1 -1,0.3 -1.5,0.6 -0.2,0 -0.3,0 -0.5,0.1 0,0 0,0 0,0 -0.1,0 -0.1,0 -0.2,-0.1 0,0 0,0 0,-0.1 0,0 -0.1,0 -0.1,0 -0.1,-0.2 -0.1,-0.5 -0.1,-0.7 l -0.2,0 0,4 0.2,0 c 0,-0.6 0.2,-1 0.5,-1.5 0.3,-0.5 0.5,-0.8 1,-1.2 0.1,-0.1 0.2,-0.2 0.4,-0.3 0.7,-0.4 1.4,-0.6 2.1,-0.6 0.1,0 0.1,0 0.2,0 0,0 0.1,0 0.2,0 0.6,0 1.1,0.2 1.7,0.5 l 0,0 0,0 c 0.4,0.2 0.7,0.5 0.9,0.9 0,0.1 0.1,0.1 0.1,0.2 l 0,0 c 0.2,0.4 0.3,0.8 0.3,1.3 0,0 0,0 0,0.1 0,0.5 -0.1,1 -0.4,1.5 -0.1,0.2 -0.3,0.3 -0.4,0.5 l 0,0 c -0.6,0.6 -1.2,1 -1.9,1.4 -0.2,0.2 -0.4,0.2 -0.6,0.3 -0.7,0.5 -1.3,0.7 -1.7,1 -0.4,0.3 -0.7,0.5 -1.1,0.9 l 0,0 c -0.3,0.3 -0.5,0.5 -0.7,0.9 -0.1,0.1 -0.1,0.2 -0.2,0.4 -0.2,0.5 -0.3,1 -0.3,1.6 0,0.1 0,0.1 0,0.1 l 0,0 c 0,0.8 0.2,1.4 0.5,2.1 0.1,0 0.1,0 0.1,0 l 0,0 c 0.4,0.7 0.9,1.2 1.6,1.6 0,0 0,0 0,0.1 l 0,0 c 0.8,0.4 1.5,0.6 2.4,0.6 0.1,0 0.1,0 0.1,0 l 0,0 c 0.8,0 1.4,-0.1 2.2,-0.4 0.1,0 0.2,-0.1 0.4,-0.1 0,0 0,0 0,0 0.2,0 0.4,0.2 0.5,0.5 l 0.2,0 -0.1,-3.3 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path42" /><path
+         d="m 383.5,768.4 -0.2,0 c -0.1,1 -0.3,1.7 -0.9,1.9 -0.5,0.4 -1.1,0.5 -1.8,0.5 0,0 -0.1,0 -0.1,0 l -3.2,0 0,-13.3 c 0,-0.1 0,-0.1 0,-0.2 0,-0.3 0.1,-0.5 0.2,-0.7 0.2,-0.3 0.4,-0.5 0.6,-0.6 0.3,-0.2 0.5,-0.2 0.8,-0.2 0.1,0 0.1,0 0.2,0 l 0,-0.2 -5.1,0 0,0.2 0,0 c 0.4,0 0.7,0.1 1,0.3 0.1,0 0.1,0 0.2,0.1 0.1,0.1 0.2,0.2 0.3,0.4 0.1,0.2 0.2,0.4 0.2,0.8 0,0 0,0.1 0,0.1 l 0,13.3 -3.1,0 c -0.1,0 -0.1,0 -0.2,0 -0.6,0 -1.2,-0.1 -1.8,-0.5 -0.5,-0.2 -0.8,-0.9 -0.9,-1.9 l -0.1,0 0,3.8 0.1,0 0,0 c 0.1,-0.1 0.2,-0.2 0.3,-0.4 l 0,0 c 0.1,0 0.1,-0.1 0.2,-0.2 0.1,0 0.1,0 0.1,0 0.2,-0.1 0.4,-0.1 0.5,-0.1 0.3,-0.1 0.5,-0.1 0.7,-0.1 l 0,0 10.2,0 c 0.1,0 0.1,0 0.1,0 0.4,0 0.7,0.1 0.9,0.3 0.3,0.1 0.5,0.3 0.6,0.5 l 0.2,0 0,-3.8 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path44" /><path
+         d="m 392.7,771.4 0,-0.1 c -0.1,0 -0.1,0 -0.1,0 -0.3,0 -0.7,-0.1 -0.9,-0.3 -0.1,0 -0.2,-0.1 -0.3,-0.1 l 0,0 c -0.1,-0.1 -0.2,-0.2 -0.2,-0.4 -0.2,-0.2 -0.3,-0.5 -0.3,-0.8 0,-0.1 0,-0.1 0,-0.2 l 0,-12 c 0,0 0,-0.1 0,-0.1 0,-0.3 0.1,-0.6 0.3,-0.8 0,-0.1 0.1,-0.3 0.3,-0.4 l 0,0 c 0,-0.1 0.1,-0.1 0.2,-0.1 0.3,-0.2 0.6,-0.3 0.9,-0.3 0.1,0 0.1,0 0.1,0 l 0,-0.2 -5.1,0 0,0.2 0,0 c 0,0 0,0 0.1,0 0.3,0 0.6,0.1 0.9,0.2 0.1,0.1 0.1,0.1 0.2,0.2 l 0,0 c 0.1,0.1 0.2,0.2 0.3,0.4 0.2,0.2 0.2,0.5 0.2,0.8 0,0 0,0.1 0,0.1 l 0,12 c 0,0.1 0,0.1 0,0.2 0,0.3 0,0.6 -0.2,0.8 -0.1,0.2 -0.2,0.3 -0.3,0.4 l 0,0 c -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.2 -0.6,0.2 -1,0.2 l 0,0 0,0.2 5.1,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path46" /><path
+         d="m 410.7,768.4 -0.2,0 c -0.1,1 -0.4,1.7 -0.9,1.9 -0.6,0.4 -1.1,0.5 -1.8,0.5 0,0 -0.1,0 -0.1,0 l -3.2,0 0,-13.3 c 0,-0.1 0,-0.1 0,-0.2 0,-0.3 0.1,-0.5 0.2,-0.8 0.2,-0.2 0.3,-0.4 0.6,-0.5 0.3,-0.2 0.5,-0.2 0.8,-0.2 0,0 0.1,0 0.1,0 l 0,-0.2 -5,0 0,0.2 0,0 0,0 c 0.4,0 0.7,0.1 1,0.3 0.1,0 0.1,0 0.2,0.1 l 0,0 c 0.1,0.1 0.2,0.2 0.3,0.3 0.1,0.3 0.2,0.5 0.2,0.9 0,0 0,0.1 0,0.1 l 0,13.3 -3.2,0 c 0,0 0,0 -0.1,0 -0.7,0 -1.2,-0.1 -1.8,-0.5 -0.5,-0.2 -0.8,-0.9 -0.9,-1.9 l -0.2,0 0,3.8 0.2,0 0,0 c 0.1,-0.1 0.2,-0.2 0.3,-0.4 l 0,0 c 0.1,0 0.1,-0.1 0.2,-0.1 0,-0.1 0.1,-0.1 0.1,-0.1 0.2,-0.1 0.3,-0.1 0.5,-0.1 l 0,0 c 0.2,-0.1 0.4,-0.1 0.7,-0.1 l 0,0 10.2,0 c 0.1,0 0.1,0 0.1,0 0.3,0 0.6,0.1 0.9,0.3 0.3,0.1 0.4,0.3 0.6,0.5 l 0.2,0 0,-3.8 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path48" /><path
+         d="m 428.9,755.6 -3.3,0 0,2.6 -0.1,0.1 0,0 c -0.1,-0.2 -0.2,-0.4 -0.3,-0.6 -0.4,-0.8 -0.9,-1.3 -1.7,-1.7 0,0 0,-0.1 0,-0.1 l 0,0 c -0.9,-0.5 -1.8,-0.7 -2.8,-0.7 -0.1,0 -0.1,0 -0.1,0 0,0 -0.1,0 -0.1,0 -1.1,0 -1.9,0.3 -2.9,0.8 0,0 0,0 0,0 l 0,0 c -0.1,0.1 -0.1,0.1 -0.1,0.1 -0.8,0.4 -1.4,1 -1.9,1.8 0,0.1 0,0.1 0,0.1 l 0,0 c -0.3,0.6 -0.5,1.1 -0.6,1.8 -0.1,0.6 -0.1,1.1 -0.1,1.8 0,0 0,0 0,0 l 0,7.9 0,0 c 0,0 0,0 0,0.1 0,0.4 -0.1,0.7 -0.3,1.1 -0.2,0.3 -0.6,0.5 -1.3,0.6 l 0,0.1 5,0 0,-0.1 c -0.1,0 -0.1,0 -0.1,0 -0.3,0 -0.6,-0.1 -0.9,-0.3 -0.2,-0.1 -0.3,-0.2 -0.5,-0.4 l 0,0 0,0 c -0.2,-0.3 -0.3,-0.7 -0.3,-1.1 l 0,0 0,-7.7 c 0,-0.2 0,-0.4 0,-0.6 0,-1 0.2,-1.9 0.5,-2.9 l 0,0 c 0.1,-0.2 0.1,-0.4 0.3,-0.5 0.3,-0.6 0.7,-1.1 1.3,-1.4 l 0,0 c 0,-0.1 0.1,-0.1 0.2,-0.2 0.7,-0.4 1.3,-0.5 2.1,-0.5 l 0,0 0,0 c 0.5,0 0.8,0 1.3,0.2 l 0,0 c 0.4,0.1 0.8,0.2 1.1,0.4 0.1,0.1 0.2,0.1 0.3,0.2 1.3,0.9 2,2.3 2,4.3 l 0,8.7 0,0 c 0,0 0,0 0,0 0,0.4 -0.1,0.8 -0.3,1.2 -0.2,0.3 -0.7,0.5 -1.4,0.6 l 0,0.1 5,0 0,-0.1 c -0.7,0 -1.2,-0.3 -1.4,-0.6 l 0,0 c 0,0 0,-0.1 0,-0.1 -0.2,-0.3 -0.3,-0.7 -0.3,-1.1 l 0,-12 c 0,0 0,-0.1 0,-0.1 0,-0.3 0,-0.6 0.2,-0.9 0,0 0,0 0,0 0.1,-0.2 0.2,-0.3 0.4,-0.4 0.1,0 0.1,-0.1 0.1,-0.1 0.4,-0.1 0.6,-0.2 1,-0.2 l 0,-0.2 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path50" /><path
+         d="m 445.4,768.4 -0.2,0 c -0.1,1 -0.4,1.7 -0.9,1.9 -0.6,0.4 -1.1,0.5 -1.8,0.5 0,0 -0.1,0 -0.1,0 l -3.2,0 0,-13.3 0,0 c 0,-0.1 0,-0.1 0,-0.2 0,-0.3 0.1,-0.5 0.2,-0.8 0.2,-0.2 0.4,-0.4 0.6,-0.5 0.2,-0.2 0.5,-0.2 0.8,-0.2 0,0 0.1,0 0.2,0 l 0,-0.2 -5.1,0 0,0.2 0,0 0,0 c 0.4,0 0.7,0.1 1,0.3 0.1,0 0.1,0 0.2,0.1 0.1,0.1 0.2,0.2 0.3,0.3 0.1,0.3 0.2,0.5 0.2,0.9 0,0 0,0.1 0,0.1 l 0,13.3 -3.1,0 c -0.1,0 -0.1,0 -0.2,0 -0.6,0 -1.2,-0.1 -1.8,-0.5 -0.5,-0.2 -0.8,-0.9 -0.9,-1.9 l -0.2,0 0,3.8 0.2,0 c 0.1,-0.1 0.1,-0.2 0.3,-0.4 0,0 0.1,-0.1 0.2,-0.1 0,-0.1 0.1,-0.1 0.1,-0.1 l 0,0 c 0.2,-0.1 0.3,-0.1 0.5,-0.1 l 0,0 c 0.2,-0.1 0.4,-0.1 0.6,-0.1 l 0,0 10.3,0 c 0,0 0,0 0.1,0 0.3,0 0.6,0.1 0.9,0.3 0.2,0.1 0.4,0.3 0.6,0.5 l 0.2,0 0,-3.8 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path52" /><path
+         d="m 455.3,771.3 0,0.1 9.5,0 0,-2.4 -0.2,0 0,0 c 0,0.4 -0.1,0.7 -0.3,1 -0.1,0.1 -0.2,0.3 -0.2,0.4 l 0,0 c -0.2,0.1 -0.3,0.2 -0.5,0.3 -0.3,0.2 -0.6,0.3 -1,0.3 0,0 -0.1,0 -0.2,0 l -3.8,0 0,-7.2 3.6,0 0,0 c 0,0 0.1,0 0.2,0 0.3,0 0.6,0 0.9,0.2 0.1,0.1 0.2,0.1 0.2,0.2 l 0,0 c 0.1,0.1 0.2,0.2 0.2,0.3 0.2,0.3 0.3,0.5 0.3,0.9 l 0.2,0 0,-3.6 -0.2,0 0,0 c 0,0.3 -0.1,0.5 -0.2,0.8 -0.1,0.1 -0.1,0.2 -0.2,0.3 l 0,0 c -0.1,0.1 -0.2,0.1 -0.3,0.2 -0.3,0.2 -0.6,0.2 -0.9,0.2 -0.1,0 -0.2,0 -0.2,0 l -3.6,0 0,-5.7 0,0 c 0,-0.1 0,-0.1 0,-0.1 0,-0.3 0.1,-0.6 0.2,-0.9 0.1,-0.1 0.2,-0.2 0.2,-0.3 l 0,0 c 0.2,-0.1 0.3,-0.2 0.4,-0.3 0.2,-0.1 0.4,-0.2 0.7,-0.2 l 0,0 0.2,0 0,-0.1 -5.1,0 0,0.1 0.3,0 0,0 c 0.3,0 0.5,0.1 0.7,0.2 0.1,0.1 0.2,0.2 0.3,0.3 l 0,0 c 0.1,0.1 0.2,0.2 0.2,0.3 0.2,0.2 0.2,0.5 0.2,0.9 0,0 0,0 0,0.1 l 0,11.9 c 0.1,0.1 0.1,0.2 0.1,0.2 0,0.4 -0.1,0.6 -0.3,0.9 0,0.1 -0.1,0.2 -0.2,0.3 -0.1,0.1 -0.2,0.1 -0.2,0.2 -0.3,0.1 -0.5,0.2 -0.8,0.2 l 0,0 -0.2,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path54" /><path
+         d="m 484.3,755.6 -3.3,0 0,2.6 0,0.1 c -0.2,-0.2 -0.2,-0.4 -0.4,-0.6 -0.4,-0.8 -0.9,-1.3 -1.7,-1.7 0,0 0,0 0,-0.1 l 0,0 c -0.9,-0.4 -1.8,-0.7 -2.8,-0.7 0,0 0,0 -0.1,0 0,0 0,0 -0.1,0 -1,0 -1.9,0.3 -2.9,0.8 0,0 0,0 0,0 0,0.1 0,0.1 -0.1,0.1 -0.8,0.4 -1.4,1 -1.8,1.9 -0.1,0 -0.1,0 -0.1,0 -0.3,0.6 -0.5,1.1 -0.6,1.8 l 0,0 c 0,0.6 -0.1,1.2 -0.1,1.8 l 0,0 0,7.9 c 0,0 0,0 0,0.1 0,0.4 -0.1,0.7 -0.3,1.1 -0.2,0.3 -0.6,0.5 -1.3,0.6 l 0,0.1 5,0 0,-0.1 0,0 c -0.1,0 -0.1,0 -0.1,0 -0.3,0 -0.6,-0.1 -0.9,-0.3 -0.2,-0.1 -0.3,-0.2 -0.4,-0.3 l 0,0 c 0,0 0,-0.1 -0.1,-0.1 -0.2,-0.3 -0.3,-0.7 -0.3,-1.1 l 0,0 0,-7.7 c 0,-0.2 0,-0.4 0,-0.5 0,-1.1 0.2,-2 0.5,-3 l 0,0 c 0.1,-0.2 0.2,-0.4 0.3,-0.5 0.3,-0.6 0.7,-1 1.3,-1.4 l 0,0 c 0.1,-0.1 0.1,-0.1 0.2,-0.2 0.7,-0.3 1.3,-0.5 2.1,-0.5 0,0 0,0 0,0 l 0,0 c 0.5,0 0.9,0 1.3,0.2 0.4,0.1 0.8,0.2 1.1,0.4 0.2,0.1 0.2,0.2 0.3,0.2 1.3,0.9 2,2.3 2,4.3 l 0,8.7 0,0 0,0 c 0,0.5 -0.1,0.8 -0.3,1.2 -0.2,0.3 -0.7,0.5 -1.4,0.6 l 0,0.1 5,0 0,-0.1 c -0.7,0 -1.2,-0.3 -1.4,-0.6 -0.2,-0.4 -0.3,-0.8 -0.3,-1.2 l 0,-11.9 c 0,-0.1 0,-0.1 0,-0.2 0,-0.3 0.1,-0.6 0.2,-0.8 l 0,-0.1 c 0.1,-0.1 0.3,-0.3 0.5,-0.4 0,0 0,0 0.1,0 0.3,-0.2 0.6,-0.2 0.9,-0.3 l 0,-0.2 z m -10,19.3 0,0 0,0 c 0.2,0 0.4,0 0.5,-0.1 0.1,-0.1 0.2,-0.1 0.3,-0.2 l 0,0 c 0,-0.1 0.1,-0.1 0.1,-0.2 0.1,-0.1 0.1,-0.3 0.1,-0.5 l 0,0 0,0 c 0,-0.2 0,-0.4 -0.1,-0.5 0,-0.1 -0.1,-0.1 -0.1,-0.2 l 0,0 c -0.1,-0.1 -0.2,-0.1 -0.3,-0.2 -0.1,-0.1 -0.3,-0.1 -0.4,-0.1 l -0.1,0 c -0.1,0 -0.3,0 -0.4,0.1 -0.1,0.1 -0.2,0.1 -0.3,0.2 0,0.1 -0.1,0.1 -0.1,0.2 -0.1,0.2 -0.2,0.3 -0.2,0.5 l 0,0 c 0,0.2 0.1,0.3 0.1,0.5 0.1,0.1 0.2,0.1 0.2,0.2 l 0,0 c 0.1,0.1 0.2,0.1 0.3,0.2 0.1,0 0.3,0.1 0.4,0.1 l 0,0 z m 4.4,0 0,0 0,0 c 0.2,0 0.3,0 0.5,-0.1 0.2,-0.1 0.3,-0.2 0.4,-0.4 0.1,-0.2 0.1,-0.3 0.1,-0.5 l 0,0 c 0,-0.2 0,-0.3 -0.1,-0.5 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 0,-0.1 -0.1,-0.1 -0.2,-0.2 -0.1,-0.1 -0.3,-0.1 -0.5,-0.1 -0.2,0 -0.3,0 -0.5,0.1 -0.1,0.1 -0.1,0.1 -0.2,0.2 -0.1,0.1 -0.1,0.1 -0.2,0.2 0,0.2 -0.1,0.3 -0.1,0.5 0,0.2 0.1,0.3 0.1,0.5 0.1,0.1 0.1,0.1 0.2,0.2 l 0,0 c 0.1,0.1 0.1,0.2 0.3,0.2 0.1,0.1 0.2,0.1 0.4,0.1 l 0,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path56" /><path
+         d="m 488.3,771.2 -0.3,0 0,0.2 5.5,0 0,0 c 0.1,0 0.1,0 0.2,0 0.7,0 1.4,-0.1 2.1,-0.4 l 0,0 c 0.1,0 0.3,-0.1 0.4,-0.2 0.4,-0.2 0.7,-0.5 1,-0.8 0.1,-0.2 0.3,-0.3 0.3,-0.5 0.2,-0.3 0.3,-0.5 0.4,-0.8 0.1,-0.5 0.2,-0.9 0.2,-1.4 l 0,0 c 0,-0.6 -0.1,-1.1 -0.3,-1.7 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 -0.2,-0.5 -0.5,-0.8 -0.9,-1.1 -0.2,-0.1 -0.3,-0.2 -0.4,-0.3 -0.5,-0.2 -0.9,-0.4 -1.5,-0.5 l 0,0 0,0 c 0,0 0,0 0,0 1.1,-0.6 1.9,-1.4 2.5,-2.5 0,-0.1 0.1,-0.2 0.1,-0.3 l 1.4,-2.4 c 0.1,-0.1 0.2,-0.2 0.2,-0.3 0.4,-0.7 0.8,-1.2 1.4,-1.7 0.1,-0.1 0.2,-0.2 0.3,-0.2 0.3,-0.2 0.5,-0.3 0.8,-0.3 l 0,-0.2 -2.8,0 c -0.1,0.2 -0.3,0.3 -0.3,0.5 l -0.4,0.4 c -0.1,0.1 -0.2,0.3 -0.3,0.5 -0.1,0.2 -0.2,0.3 -0.3,0.4 l -1.8,3.1 0,0 c -0.1,0 -0.1,0 -0.1,0.1 -0.3,0.5 -0.7,1 -1.1,1.5 l 0,0 c -0.3,0.3 -0.6,0.6 -1,0.8 -0.1,0 -0.1,0 -0.1,0 l 0,0 c -0.3,0.2 -0.6,0.3 -1,0.4 l 0,0 c -0.3,0 -0.5,0 -0.9,0 0,0 0,0 0,0 l 0,-5.8 0,0 c 0,0 0,-0.1 0,-0.1 0,-0.4 0,-0.6 0.2,-0.8 0.1,-0.3 0.3,-0.5 0.5,-0.6 0.3,-0.1 0.5,-0.2 0.8,-0.2 0.1,0 0.1,0 0.2,0 l 0,-0.2 -5.1,0 0,0.2 0,0 c 0.4,0 0.6,0.1 0.9,0.2 l 0,0 c 0,0 0.1,0 0.1,0 0.2,0.1 0.4,0.3 0.5,0.5 0.2,0.3 0.2,0.6 0.2,0.9 0,0.1 0,0.1 0,0.1 l 0,12 0,0 c 0,0.1 0,0.1 0,0.2 0,0.3 0,0.6 -0.2,0.8 -0.1,0.2 -0.1,0.2 -0.2,0.4 -0.1,0 -0.2,0.1 -0.3,0.1 -0.2,0.2 -0.4,0.2 -0.7,0.2 z m 3.1,-7.5 0.9,0 c 0,0 0.1,0 0.2,0 0.8,0 1.4,0.2 2.1,0.5 0.1,0 0.2,0 0.3,0.1 0.5,0.3 0.8,0.6 1,1 l 0,0 0,0 c 0.3,0.6 0.4,1.1 0.4,1.8 0,0 0,0 0,0.1 l 0,0 c 0,0.6 -0.1,1.2 -0.4,1.8 l 0,0 c 0,0.1 0,0.2 -0.1,0.3 -0.3,0.5 -0.6,0.8 -1.1,1.1 l 0,0 c 0,0.1 0,0.1 -0.1,0.1 -0.6,0.4 -1.3,0.5 -2,0.5 -0.1,0 -0.2,0 -0.3,0 0,0 0,0 0,0 -0.3,0 -0.6,0 -0.9,-0.1 l 0,-7.2 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path58" /><path
+         d="m 76.8,772.1 0,-0.6 c -0.1,0 -0.1,0 -0.2,0 -1,0 -1.9,-0.3 -2.8,-0.8 -0.3,-0.2 -0.5,-0.3 -0.8,-0.5 -1,-0.9 -1.5,-2.4 -1.5,-4.4 l 0,-39.6 c 0,-2 0.5,-3.5 1.6,-4.4 l 0,0 c 0.3,-0.2 0.6,-0.4 0.9,-0.6 0.9,-0.5 1.8,-0.8 2.8,-0.8 l 0,-0.5 -15.7,0 0,0.5 0,0 c 0,0 0.1,0 0.1,0 1,0 1.9,0.2 2.8,0.8 0.3,0.2 0.5,0.3 0.8,0.6 1.1,0.8 1.6,2.3 1.6,4.4 l 0,39.6 c 0,2.2 -0.5,3.7 -1.6,4.5 -0.2,0.1 -0.4,0.2 -0.6,0.4 -0.9,0.5 -1.9,0.8 -2.9,0.8 -0.1,0 -0.1,0 -0.2,0 l 0,0.6 15.7,0 z"
+         style="fill:#878786;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path60" /><path
+         d="m 81.8,771.5 0,0.6 19,0 0,0 c 0.1,0 0.2,0 0.3,0 2.5,0 4.6,-0.3 7.1,-0.7 l 0,0 c 2.2,-0.5 4,-1.1 6,-2 l 0,0 c 0.9,-0.4 1.6,-0.7 2.4,-1.2 0.8,-0.5 1.5,-0.9 2.2,-1.4 1.3,-0.9 2.2,-1.8 3.3,-3 l 0,0 c 1.5,-1.5 2.5,-3 3.6,-4.8 0.2,-0.3 0.2,-0.4 0.4,-0.7 l 0,0 c 1.1,-2.1 1.9,-4 2.5,-6.4 l 0,0 c 0.5,-2.3 0.8,-4.4 0.8,-6.8 0,0 0,-0.1 0,-0.1 l 0,0 c 0,0 0,-0.1 0,-0.1 0,-2.4 -0.3,-4.4 -0.8,-6.7 l 0,0 c -0.6,-2.2 -1.3,-4 -2.3,-6 -0.2,-0.2 -0.2,-0.3 -0.4,-0.5 -0.9,-1.7 -1.9,-3 -3.3,-4.4 -1.5,-1.7 -2.9,-2.9 -4.8,-4.1 -0.2,-0.1 -0.4,-0.2 -0.5,-0.3 -1.7,-0.9 -3.2,-1.6 -5,-2.1 -2.6,-0.7 -4.8,-0.9 -7.4,-0.9 -0.4,0 -0.6,0 -1,0 l -22.1,0 0,0.5 0.7,0 0,0 c 0,0 0.1,0 0.2,0 0.7,0 1.3,0.2 1.9,0.5 0.6,0.4 1,0.8 1.3,1.4 l 0,0 c 0.1,0 0.1,0.1 0.2,0.2 0.7,1.2 1,2.3 1,3.7 l 0,39.4 c 0,0.1 0,0.1 0,0.2 0,1.1 -0.2,2.1 -0.6,3.1 -0.1,0.2 -0.2,0.3 -0.3,0.5 -0.3,0.6 -0.8,1.1 -1.4,1.5 l 0,0 c -0.7,0.4 -1.4,0.6 -2.3,0.6 0,0 0,0 0,0 l -0.7,0 z m 10.4,-1.9 0,-41.4 c 0,-2 0.3,-3.5 0.9,-4.4 0.4,-0.6 0.8,-1 1.4,-1.4 0.5,-0.2 0.9,-0.4 1.4,-0.5 l 0,0 c 1.8,-0.3 3.2,-0.4 5,-0.4 0.2,0 0.5,0 0.7,0 l 0,0 c 0.3,0 0.6,0 0.8,0 3,0 5.5,0.3 8.3,1 2.5,0.8 4.8,2.5 7.1,5 1,1.1 1.7,2.2 2.4,3.4 0.7,1.3 1.2,2.3 1.7,3.7 1.1,3.1 1.6,6 1.6,9.4 0,0.2 0,0.4 0,0.6 0,0.1 0,0.1 0,0.1 0,3.2 -0.4,6 -1.2,9.1 l 0,0 c -0.6,2.3 -1.4,4.1 -2.6,6.1 -0.4,0.7 -0.8,1.3 -1.2,2 l 0,0 c -1.8,2.5 -3.7,4.2 -6.3,5.7 -0.4,0.2 -0.7,0.4 -1.1,0.6 l 0,0 c -3.3,1.5 -6.4,2.3 -10.1,2.3 -0.2,0 -0.4,0 -0.6,-0.1 l 0,0 c -2.9,0 -5.4,-0.3 -8.2,-0.8 z"
+         style="fill:#878786;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path62" /><path
+         d="m 159.3,762.1 -0.6,0 0,0 c -0.2,1.6 -0.6,2.9 -1.4,4.4 -0.5,0.8 -1,1.5 -1.7,2.2 l 0,0 c -0.6,0.6 -1.2,1.1 -2,1.5 -1.6,0.9 -3.1,1.3 -5,1.3 -1.8,0 -3.4,-0.4 -4.9,-1.3 -0.1,0 -0.2,-0.1 -0.2,-0.1 l 0,0 c -1.3,-0.8 -2.3,-1.8 -3.1,-3.2 -0.1,-0.2 -0.2,-0.4 -0.3,-0.6 -0.9,-1.8 -1.2,-3.5 -1.2,-5.4 0,-0.1 0,-0.2 0,-0.2 l 0,0 c 0,-0.1 0,-0.2 0,-0.3 0,-1.5 0.2,-2.7 0.7,-4.1 l 0,0 c 0.2,-0.5 0.4,-0.9 0.7,-1.4 0.4,-0.7 0.8,-1.3 1.4,-1.9 l 0,0 c 1.1,-1.1 2.1,-1.9 3.3,-2.7 1.3,-0.9 3,-1.9 5.2,-3.2 l 0,0 c 0.2,-0.1 0.4,-0.3 0.7,-0.4 3,-1.7 5.3,-3.5 7.8,-5.9 2,-2.1 3,-5 3,-8.6 l 0,0 c 0,-2.3 -0.6,-4.3 -1.7,-6.4 l 0,0 c 0,-0.1 -0.1,-0.2 -0.2,-0.4 -1.1,-2 -2.6,-3.5 -4.7,-4.7 -2.4,-1.4 -4.8,-2 -7.6,-2 -0.2,0 -0.3,0 -0.5,0 -0.1,0 -0.2,0 -0.3,0 -1.8,0 -3.4,0.2 -5.1,0.8 l 0,0 c -1.7,0.5 -3.2,1 -4.8,1.9 l 0,0 c -0.4,0.2 -0.9,0.3 -1.4,0.3 0,0 0,0 0,0 -0.2,0 -0.4,0 -0.5,-0.1 -0.1,-0.1 -0.3,-0.2 -0.3,-0.3 0,0 -0.1,-0.1 -0.1,-0.1 l 0,0 c -0.2,-0.8 -0.4,-1.5 -0.6,-2.3 l -0.5,0 0,13 0.5,0 c 0.8,-3.8 2.4,-6.7 4.7,-8.6 0.6,-0.5 1.1,-0.9 1.8,-1.3 2,-1.2 4,-1.7 6.4,-1.7 0.1,0 0.2,0 0.3,0 0.2,0 0.4,0 0.6,0 1.9,0 3.6,0.5 5.4,1.5 0,0 0,0 0.1,0 l 0,0 c 1.1,0.7 2,1.6 2.7,2.8 0.1,0.3 0.3,0.5 0.4,0.8 0.6,1.4 0.9,2.7 0.9,4.3 0,0.1 0,0.3 0,0.4 0,1.9 -0.5,3.5 -1.4,5.1 -0.3,0.6 -0.7,1.2 -1.2,1.7 l 0,0 c -2,2.1 -4,3.6 -6.5,5 -0.4,0.3 -0.8,0.4 -1.2,0.7 -2.3,1.3 -4.1,2.4 -5.2,3.1 -1.4,0.9 -2.4,1.8 -3.5,3 l 0,0 c -0.8,0.8 -1.4,1.6 -2,2.6 -0.3,0.6 -0.6,1.1 -0.8,1.7 l 0,0 c -0.7,1.8 -1,3.5 -1,5.4 0,2.7 0.5,4.9 1.8,7.3 l 0,0 c 0.1,0 0.1,0.1 0.2,0.2 1.3,2.3 2.8,3.8 5,5.1 l 0,0 c 0.1,0.1 0.1,0.1 0.1,0.1 2.4,1.4 4.6,2 7.3,2 0.1,0 0.2,0 0.3,0 l 0,0 c 2.4,-0.1 4.4,-0.4 6.7,-1.2 0.4,-0.2 0.8,-0.3 1.3,-0.3 0,0 0.1,0 0.1,0 0.7,0 1.2,0.5 1.5,1.6 l 0.6,0 0,-11.1 z"
+         style="fill:#878786;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path64" /><path
+         d="m 190.1,828.9 c 0,0 0,-0.6 0.1,-1.8 0,-1.1 0.1,-2.8 0.1,-5 0.1,-4.4 0.3,-10.7 0.4,-18.2 0.1,-3.7 0.2,-7.8 0.2,-12 0.1,-4.3 0.1,-8.9 0.2,-13.6 0,-4.6 0,-9.5 0,-14.4 0.1,-5 0,-10 0.1,-15 0,-4.9 0,-9.9 0,-14.9 -0.1,-4.9 -0.1,-9.8 -0.1,-14.4 -0.1,-9.4 -0.2,-18.2 -0.4,-25.7 -0.1,-7.5 -0.3,-13.7 -0.4,-18.1 0,-2.2 -0.1,-3.9 -0.1,-5.1 -0.1,-1.2 -0.1,-1.8 -0.1,-1.8 0,0 0,0.6 0,1.8 -0.1,1.2 -0.1,2.9 -0.2,5.1 -0.1,4.4 -0.3,10.6 -0.4,18.1 -0.1,7.5 -0.3,16.3 -0.3,25.7 0,4.6 -0.1,9.5 -0.1,14.4 -0.1,5 0,10 0,14.9 0,5 0,10 0,15 0,4.9 0,9.8 0.1,14.4 0,4.7 0.1,9.3 0.1,13.6 0.1,4.2 0.1,8.3 0.2,12 0.1,7.5 0.3,13.8 0.4,18.2 0.1,2.2 0.1,3.9 0.2,5 0,1.2 0,1.8 0,1.8 z"
+         style="fill:#f07d00;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path66" /><path
+         d="m 217.9,743.1 0,0.3 8.7,0 0,0 c 0.1,0 0.1,0 0.1,0 1.2,0 2.1,-0.1 3.3,-0.4 l 0,0 c 1,-0.2 1.8,-0.4 2.7,-0.8 0.5,-0.2 0.9,-0.4 1.3,-0.7 0.3,-0.1 0.6,-0.3 0.9,-0.5 l 0,0 c 0.5,-0.4 1,-0.8 1.5,-1.3 l 0,0 c 0.7,-0.7 1.2,-1.4 1.7,-2.3 0.6,-1 0.9,-2 1.2,-3.1 l 0,0 c 0.3,-1.1 0.4,-2 0.4,-3.1 l 0,0 0,0 c 0,0 0,-0.1 0,-0.1 0,-1 -0.1,-1.9 -0.4,-3 l 0,0 c -0.2,-1 -0.5,-1.8 -1,-2.7 l 0,0 c -0.1,0 -0.1,-0.1 -0.1,-0.1 -0.5,-0.8 -1,-1.4 -1.6,-2.1 l 0,0 c -0.7,-0.8 -1.4,-1.3 -2.2,-1.8 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 -0.8,-0.4 -1.5,-0.7 -2.3,-0.9 -1.2,-0.3 -2.2,-0.4 -3.5,-0.4 -0.1,0 -0.2,0 -0.4,0 l -10.1,0 0,0.2 0.3,0 c 0.1,0 0.1,0 0.1,0 0.3,0 0.6,0.1 0.9,0.2 0.3,0.2 0.5,0.4 0.6,0.6 l 0,0 c 0.1,0.1 0.1,0.1 0.1,0.2 0.3,0.5 0.4,1 0.4,1.6 l 0,17.8 c 0,0 0,0 0,0.1 0,0.5 0,0.9 -0.2,1.4 l 0,0 c -0.1,0.1 -0.1,0.1 -0.2,0.2 -0.1,0.2 -0.3,0.5 -0.6,0.6 l 0,0 0,0 c -0.3,0.2 -0.7,0.3 -1,0.3 -0.1,0 -0.1,0 -0.1,0 l -0.3,0 z m 4.8,-0.8 0,-18.7 c 0,-0.1 0,-0.1 0,-0.2 0,-0.7 0.1,-1.2 0.4,-1.8 0.2,-0.2 0.4,-0.4 0.6,-0.6 0.2,-0.1 0.5,-0.2 0.7,-0.2 l 0,0 c 0.8,-0.2 1.5,-0.2 2.3,-0.2 0.1,0 0.2,0 0.3,0 l 0,0 c 0.1,0 0.2,0 0.3,0 1.4,0 2.5,0.1 3.8,0.5 0.5,0.1 0.9,0.3 1.3,0.6 0.8,0.4 1.4,0.9 2,1.6 0.5,0.6 0.8,1 1.1,1.6 0.3,0.5 0.6,1 0.8,1.6 l 0,0 c 0.5,1.4 0.7,2.7 0.7,4.2 0,0.1 0,0.2 0,0.3 l 0,0 c 0,0 0,0 0,0 0,1.5 -0.2,2.7 -0.6,4.2 l 0,0 c -0.2,1 -0.6,1.7 -1.1,2.7 -0.2,0.3 -0.4,0.6 -0.6,0.9 l 0,0 c -0.8,1.1 -1.7,1.9 -2.9,2.6 -0.1,0.1 -0.3,0.2 -0.5,0.3 l 0,0 c -1.5,0.7 -2.9,1 -4.6,1 -0.1,0 -0.2,0 -0.3,0 l 0,0 c -1.3,-0.1 -2.4,-0.2 -3.7,-0.4 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path68" /><path
+         d="m 244,743.1 0,0.3 13.5,0 0,-3.8 -0.3,0 c 0,2 -1.2,3 -3.8,3 l -4.6,0 0,-10.7 4.1,0 c 0,0 0.1,0 0.1,0 0.8,0 1.4,0.2 2.1,0.5 l 0,0 c 0,0 0,0 0.1,0 0.3,0.2 0.5,0.4 0.7,0.7 0.2,0.4 0.3,0.7 0.3,1.1 0,0 0,0 0,0.1 l 0.2,0 0,-5.3 -0.2,0 c -0.1,0.4 -0.2,0.8 -0.4,1.2 0,0.1 -0.1,0.1 -0.1,0.2 l 0,0 c -0.2,0.3 -0.4,0.4 -0.7,0.6 0,0 -0.1,0 -0.1,0.1 l 0,0 c -0.2,0 -0.4,0.1 -0.7,0.1 -0.4,0.1 -0.7,0.1 -1.1,0.1 l -4.3,0 0,-8.4 0,0 c 0,0 0,0 0,0 0,-0.6 0.1,-1.1 0.3,-1.6 0.2,-0.4 0.8,-0.7 1.6,-0.7 l 3.4,0 c 0,0 0.1,0 0.1,0 0.7,0 1.3,0.1 1.9,0.4 0.1,0 0.1,0.1 0.2,0.1 0.4,0.3 0.7,0.5 1,0.9 l 0,0 c 0.1,0.1 0.1,0.2 0.2,0.3 0.2,0.4 0.4,0.8 0.5,1.3 l 0.3,0 -0.8,-3.7 -13.5,0 0,0.2 0.3,0 c 0.4,0.1 0.7,0.2 1,0.3 0.2,0.1 0.3,0.2 0.5,0.3 l 0,0 c 0.1,0.2 0.2,0.3 0.3,0.5 0.3,0.4 0.4,0.8 0.4,1.3 0,0.1 0,0.2 0,0.2 l 0,17.7 c 0,0.1 0,0.1 0,0.1 0,0.7 -0.2,1.2 -0.5,1.8 l 0,0 c -0.2,0.3 -0.3,0.4 -0.6,0.6 -0.3,0.1 -0.5,0.2 -0.9,0.2 0,0 -0.1,0 -0.1,0 l -0.4,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path70" /><path
+         d="m 285.3,719.9 -4.8,0 0,3.9 0,0 c -0.2,-0.3 -0.3,-0.6 -0.5,-1 -0.6,-1 -1.4,-1.8 -2.5,-2.5 l 0,0 c -1.3,-0.7 -2.5,-1 -4,-1 l 0,0 c -0.1,0 -0.1,0 -0.2,0 -1.4,0 -2.7,0.3 -4,1 0,0.1 -0.1,0.1 -0.2,0.2 l 0,0 c -1.1,0.6 -2,1.5 -2.7,2.6 -0.5,1 -0.8,1.8 -0.9,2.9 l 0,0 c -0.1,0.9 -0.2,1.8 -0.2,2.7 0,0.1 0,0.1 0,0.1 l 0,11.7 c 0,0 0,0.1 0,0.1 0,0.6 -0.1,1.1 -0.4,1.7 -0.3,0.4 -0.9,0.7 -1.9,0.8 l 0,0.3 7.1,0 0,-0.3 c -1.1,-0.1 -1.7,-0.4 -2,-0.9 l 0,0 c -0.3,-0.5 -0.4,-1.1 -0.4,-1.7 0,0 0,0 0,0 l 0,-11.5 c -0.1,-0.3 -0.1,-0.4 -0.1,-0.7 0,-1.6 0.3,-3 0.8,-4.5 0.1,-0.3 0.2,-0.6 0.4,-0.9 0.5,-0.8 1,-1.4 1.8,-1.9 0.1,-0.1 0.2,-0.2 0.3,-0.2 1,-0.6 1.9,-0.8 3,-0.8 0,0 0,0 0,0 l 0,0 c 0.7,0 1.2,0.1 1.9,0.3 l 0,0 c 0.5,0.1 1,0.3 1.5,0.6 0.2,0.1 0.3,0.2 0.5,0.3 1.9,1.4 2.8,3.5 2.8,6.5 l 0,12.8 c 0,0 0,0 0,0 0,0.7 -0.1,1.2 -0.4,1.7 -0.3,0.5 -1,0.8 -2.1,0.9 l 0,0.3 7.3,0 0,-0.3 c -1.1,-0.1 -1.8,-0.3 -2,-0.9 -0.4,-0.5 -0.5,-1.1 -0.5,-1.7 l 0,-17.8 c 0,0 0,-0.1 0,-0.1 0,-0.5 0.1,-0.9 0.3,-1.3 0,0 0,-0.1 0,-0.1 0.2,-0.2 0.4,-0.4 0.6,-0.6 0.1,0 0.2,-0.1 0.2,-0.1 l 0,0 c 0.5,-0.2 0.9,-0.3 1.3,-0.4 l 0,-0.2 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path72" /><path
+         d="m 309.6,738.8 -0.3,0 c -0.1,1.5 -0.5,2.5 -1.3,3 0,0 0,0 0,0 -0.8,0.5 -1.6,0.7 -2.6,0.7 0,0 -0.1,0 -0.1,0 l -4.5,0 0,-19.8 c 0,-1.6 0.8,-2.5 2.5,-2.5 l 0,-0.3 -7.2,0 0,0.3 c 0.5,0 0.9,0.1 1.3,0.3 0.2,0.1 0.3,0.2 0.4,0.3 0.1,0.1 0.3,0.3 0.4,0.5 0.2,0.4 0.3,0.7 0.3,1.2 0,0.1 0,0.2 0,0.2 l 0,19.7 -4.5,0 c 0,0.1 -0.1,0.1 -0.1,0.1 -1,0 -1.8,-0.3 -2.6,-0.7 0,0 0,0 -0.1,-0.1 -0.7,-0.4 -1.1,-1.4 -1.2,-2.9 l -0.3,0 0,5.7 0.3,0 0,0 c 0.1,-0.2 0.2,-0.4 0.4,-0.6 l 0,0 c 0.1,-0.1 0.2,-0.1 0.3,-0.2 0.1,-0.1 0.1,-0.1 0.2,-0.1 l 0,0 c 0.2,-0.1 0.4,-0.2 0.7,-0.2 l 0,0 c 0.3,0 0.5,0 0.8,0 0.1,0 0.1,0 0.1,0 l 14.5,0 c 0.1,0 0.1,0 0.1,0 0.5,0 0.9,0.1 1.3,0.3 0.4,0.2 0.7,0.5 0.9,0.8 l 0.2,0 0.1,-5.7 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path74" /><path
+         d="m 326.4,738.9 -0.2,0 0,0 c -0.1,0.7 -0.3,1.3 -0.7,2 -0.2,0.3 -0.5,0.6 -0.8,1 l 0,0 c -0.2,0.2 -0.5,0.4 -0.9,0.6 -0.7,0.5 -1.4,0.6 -2.3,0.6 -0.8,0 -1.5,-0.1 -2.3,-0.6 0,0 0,0 0,0 -0.6,-0.4 -1.1,-0.8 -1.4,-1.5 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 -0.3,-0.8 -0.5,-1.6 -0.5,-2.5 0,0 0,0 0,-0.1 0,0 0,0 0,-0.1 0,-0.6 0.1,-1.2 0.3,-1.8 0.1,-0.3 0.2,-0.4 0.3,-0.7 0.2,-0.3 0.4,-0.6 0.7,-0.8 l 0,0 c 0.5,-0.5 0.9,-0.9 1.5,-1.3 0.6,-0.3 1.4,-0.8 2.4,-1.4 0.1,0 0.2,-0.1 0.3,-0.2 1.4,-0.7 2.4,-1.5 3.5,-2.6 l 0,0 c 0.3,-0.3 0.5,-0.6 0.7,-0.9 0.5,-0.9 0.7,-1.7 0.7,-2.7 0,-0.1 0,-0.2 0,-0.3 l 0,0 0,0 c 0,-1.1 -0.2,-1.9 -0.7,-2.9 0,0 -0.1,-0.1 -0.1,-0.1 -0.5,-1 -1.2,-1.6 -2.1,-2.1 0,-0.1 0,-0.1 -0.1,-0.1 -1.1,-0.6 -2.1,-0.9 -3.4,-0.9 -0.1,0 -0.2,0 -0.3,0 l 0,0 c 0,0 -0.1,0 -0.1,0 -0.8,0 -1.5,0.1 -2.3,0.4 -0.8,0.2 -1.5,0.4 -2.2,0.8 l 0,0 c -0.3,0.1 -0.4,0.1 -0.6,0.2 l 0,0 c -0.1,0 -0.1,0 -0.1,0 -0.1,0 -0.1,-0.1 -0.2,-0.1 -0.1,0 -0.1,-0.1 -0.2,-0.1 0,0 0,0 0,-0.1 l 0,0 c -0.1,-0.3 -0.2,-0.6 -0.3,-1 l -0.2,0 0,5.9 0.2,0 c 0.2,-0.9 0.4,-1.6 0.9,-2.3 0.3,-0.6 0.7,-1.1 1.3,-1.6 0.2,-0.2 0.5,-0.4 0.8,-0.6 0.9,-0.5 1.8,-0.7 2.9,-0.7 0,0 0.1,0 0.2,0 0,0 0.1,0 0.2,0 0.9,0 1.7,0.2 2.5,0.6 l 0,0 0,0 c 0.5,0.3 0.9,0.7 1.3,1.3 0,0.1 0.1,0.2 0.1,0.3 l 0,0 c 0.3,0.7 0.4,1.3 0.4,1.9 l 0,0 c 0,0.1 0,0.2 0,0.2 0,0.9 -0.2,1.6 -0.6,2.3 -0.1,0.3 -0.3,0.6 -0.5,0.8 l 0,0 c -1,0.9 -1.8,1.6 -3,2.2 -0.2,0.2 -0.3,0.2 -0.6,0.4 -1,0.6 -1.8,1.1 -2.4,1.4 -0.6,0.4 -1,0.8 -1.6,1.3 -0.3,0.4 -0.6,0.8 -0.9,1.3 -0.1,0.2 -0.2,0.4 -0.3,0.6 l 0,0 c -0.4,0.9 -0.5,1.6 -0.5,2.5 0,1.2 0.3,2.2 0.9,3.3 0.6,1 1.3,1.8 2.3,2.4 l 0,0 0,0 c 1.1,0.6 2.2,0.9 3.4,0.9 0.1,0 0.1,0 0.2,0 l 0,0 c 1,0 2,-0.2 3,-0.5 l 0,0 c 0.2,-0.1 0.4,-0.1 0.6,-0.1 0,0 0,0 0,0 0.4,0 0.6,0.2 0.8,0.7 l 0.2,0 0,-5 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path76" /><path
+         d="m 351.6,738.1 -0.3,0 c -0.1,0.7 -0.3,1.2 -0.6,1.8 -0.3,0.4 -0.6,0.8 -1,1.2 l 0,0 c -0.4,0.4 -0.9,0.7 -1.4,1.1 -0.5,0.2 -0.9,0.4 -1.5,0.6 l 0,0 c -1,0.4 -1.9,0.5 -3,0.6 l 0,0 c 0,0 0,0 -0.1,0 -1.3,0 -2.4,-0.3 -3.6,-0.9 -0.1,-0.1 -0.3,-0.2 -0.4,-0.3 -1,-0.5 -1.8,-1.2 -2.5,-2.1 -0.4,-0.5 -0.6,-0.9 -0.9,-1.3 -0.5,-0.8 -0.8,-1.6 -1,-2.4 l 0,0 c -0.6,-1.7 -0.8,-3.1 -0.8,-4.7 0,-0.1 0,-0.1 0,-0.1 l 0,0 c 0,0 0,-0.1 0,-0.1 0,-1.6 0.2,-2.9 0.7,-4.5 l 0,0 c 0.3,-0.8 0.5,-1.5 1,-2.2 0.3,-0.6 0.6,-1 1,-1.5 0.6,-0.8 1.4,-1.4 2.3,-2 0.2,-0.1 0.4,-0.2 0.6,-0.3 1.2,-0.5 2.3,-0.8 3.6,-0.8 0.1,0 0.1,0 0.1,0 l 0,0 c 1.4,0 2.5,0.3 3.8,0.7 l 0,0 c 0.6,0.2 1,0.4 1.6,0.7 0.8,0.5 1.4,1 2.1,1.7 l 0,-0.9 c -0.8,-0.7 -1.6,-1.2 -2.6,-1.8 -0.4,-0.2 -0.7,-0.4 -1.1,-0.6 -1.3,-0.5 -2.5,-0.8 -3.9,-0.8 -0.1,0 -0.2,0 -0.3,0 l 0,0 c -0.1,0 -0.1,0 -0.2,0 -1.7,0 -3.1,0.3 -4.7,1.1 l 0,0 c -0.4,0.1 -0.6,0.3 -1,0.5 -1.1,0.6 -1.9,1.3 -2.7,2.2 l 0,0 c -0.6,0.6 -1,1.2 -1.4,1.9 -0.4,0.7 -0.6,1.3 -0.9,2 l 0,0 c -0.6,1.5 -0.8,2.8 -0.8,4.4 0,2.4 0.5,4.3 1.6,6.4 l 0,0 c 0.1,0.1 0.1,0.2 0.2,0.3 1.1,1.8 2.4,3.2 4.2,4.4 l 0,0 c 0.2,0 0.2,0.1 0.4,0.2 1.8,1 3.5,1.5 5.6,1.5 0,0 0,0 0.1,0 l 0,0 c 1.5,-0.1 2.8,-0.2 4.2,-0.7 l 1.6,-0.4 0,0 c 0.3,-0.1 0.5,-0.1 0.8,-0.1 0,0 0.1,0 0.1,0 0.3,0 0.5,0 0.7,0.1 l 0,0.1 0,0 c 0.1,0 0.1,0.1 0.2,0.2 0,0.1 0.1,0.3 0.1,0.4 l 0.3,0 -0.2,-5.6 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path78" /><path
+         d="m 373.5,732.6 0,7.9 0,0 c 0,0 0,0.1 0,0.1 0,0.6 -0.1,1 -0.3,1.5 -0.1,0.1 -0.2,0.2 -0.2,0.3 l 0,0 c -0.2,0.2 -0.4,0.3 -0.6,0.4 -0.3,0.2 -0.7,0.3 -1.1,0.3 -0.1,0 -0.1,0 -0.2,0 l 0,0.3 7.2,0 0,-0.3 0,0 c -0.1,0 -0.1,0 -0.2,0 -0.4,0 -0.8,-0.1 -1.1,-0.3 -0.2,-0.1 -0.4,-0.2 -0.6,-0.4 l 0,0 c 0,-0.1 -0.1,-0.2 -0.1,-0.3 -0.3,-0.5 -0.4,-0.9 -0.4,-1.5 0,0 0,-0.1 0,-0.1 l 0,-17.8 c 0,-1.7 0.8,-2.6 2.4,-2.6 l 0,-0.2 -7.2,0 0,0.2 c 0.1,0 0.1,0 0.2,0 0.4,0 0.8,0.1 1.2,0.4 0.1,0 0.3,0.1 0.4,0.3 l 0,0 c 0.1,0.1 0.2,0.2 0.3,0.4 0.3,0.4 0.4,0.8 0.4,1.3 0,0.1 -0.1,0.1 -0.1,0.2 l 0,9.2 -12.9,0 0,-9.2 c 0,0 0,-0.1 0,-0.1 0,-0.5 0.1,-0.9 0.4,-1.3 0.1,-0.2 0.2,-0.3 0.3,-0.5 0.1,-0.1 0.3,-0.2 0.5,-0.3 0.4,-0.2 0.7,-0.4 1.2,-0.4 0,0 0,0 0.1,0 l 0,-0.2 -7.2,0 0,0.2 c 0,0 0.1,0 0.1,0 0.5,0 0.8,0.2 1.2,0.4 0.2,0.1 0.3,0.2 0.5,0.3 0.1,0.2 0.1,0.3 0.2,0.4 0.3,0.4 0.4,0.9 0.4,1.4 0,0 0,0.1 0,0.1 l 0,17.8 c 0,1.8 -0.8,2.6 -2.4,2.6 l 0,0.3 7.2,0 0,-0.3 c -0.1,0.1 -0.2,0.1 -0.2,0.1 -0.4,0 -0.8,-0.2 -1.1,-0.4 -0.3,-0.1 -0.4,-0.2 -0.6,-0.4 l 0,0 c -0.1,-0.1 -0.1,-0.2 -0.2,-0.3 -0.3,-0.4 -0.4,-0.9 -0.4,-1.4 0,-0.1 0,-0.1 0,-0.2 l 0,-7.8 12.9,-0.1 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path80" /><path
+         d="m 383.7,743.1 0,0.3 13.5,0 0,-3.8 -0.3,0 c 0,2 -1.2,3 -3.8,3 l -4.7,0 0,-10.7 4.2,0 0,0 c 0,0 0,0 0.1,0 0.7,0 1.4,0.2 2.1,0.5 l 0,0 c 0,0 0,0 0,0 0.4,0.2 0.6,0.4 0.8,0.7 0.2,0.4 0.3,0.7 0.3,1.1 0,0 0,0 0,0.1 l 0.2,0 0,-5.3 -0.2,0 c -0.1,0.4 -0.2,0.8 -0.4,1.2 0,0.1 -0.1,0.1 -0.2,0.2 l 0,0 c -0.1,0.3 -0.3,0.4 -0.6,0.6 0,0 -0.1,0 -0.1,0.1 l 0,0 c -0.2,0 -0.4,0.1 -0.7,0.1 l 0,0 c -0.4,0.1 -0.7,0.1 -1.1,0.1 l -4.4,0 0,-8.4 0,0 c 0,0 0,0 0,0 0,-0.6 0.1,-1.1 0.4,-1.6 0.2,-0.5 0.8,-0.7 1.6,-0.7 l 3.3,0 c 0.1,0 0.1,0 0.2,0 0.7,0 1.2,0.1 1.8,0.4 0.1,0 0.2,0.1 0.3,0.1 0.4,0.3 0.7,0.5 1,0.9 0,0.1 0.1,0.2 0.2,0.3 0.2,0.4 0.4,0.8 0.5,1.3 l 0.3,0 -0.8,-3.7 -13.5,0 0,0.2 0.3,0 c 0.4,0.1 0.7,0.2 1,0.3 0.2,0.1 0.3,0.2 0.4,0.3 l 0,0 c 0.2,0.2 0.3,0.3 0.4,0.5 0.3,0.4 0.4,0.8 0.4,1.3 0,0.1 0,0.2 -0.1,0.2 l 0,17.7 c 0,0.1 0,0.1 0,0.1 0,0.7 -0.1,1.2 -0.4,1.8 -0.2,0.3 -0.4,0.4 -0.6,0.6 -0.3,0.1 -0.6,0.2 -0.9,0.2 0,0 -0.1,0 -0.2,0 l -0.3,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path82" /><path
+         d="m 427.7,738.9 -0.3,0 0,0 c 0,0.7 -0.2,1.3 -0.6,2 -0.2,0.3 -0.5,0.6 -0.8,1 l 0,0 c -0.3,0.2 -0.5,0.4 -0.9,0.6 -0.7,0.5 -1.4,0.6 -2.3,0.6 -0.8,0 -1.5,-0.1 -2.3,-0.6 0,0 0,0 0,0 -0.6,-0.4 -1.1,-0.8 -1.5,-1.5 0,-0.1 0,-0.1 -0.1,-0.2 -0.4,-0.8 -0.5,-1.6 -0.5,-2.5 0,0 0,0 0,-0.1 0,0 0,0 0,-0.1 0,-0.6 0.1,-1.2 0.3,-1.8 0.1,-0.3 0.2,-0.4 0.3,-0.7 0.2,-0.3 0.4,-0.6 0.7,-0.8 l 0,0 c 0.5,-0.5 0.9,-0.9 1.5,-1.3 0.6,-0.3 1.4,-0.8 2.4,-1.4 l 0,0 c 0.1,0 0.2,-0.1 0.3,-0.2 1.4,-0.7 2.4,-1.5 3.5,-2.6 0.3,-0.3 0.5,-0.6 0.7,-0.9 0.5,-0.9 0.7,-1.7 0.7,-2.7 0,-0.1 0,-0.2 0,-0.3 l 0,0 c 0,-1.1 -0.2,-1.9 -0.7,-2.9 l 0,0 c 0,0 -0.1,-0.1 -0.1,-0.1 -0.5,-1 -1.2,-1.6 -2.2,-2.1 0,-0.1 0,-0.1 0,-0.1 l 0,0 c -1.1,-0.6 -2.2,-0.9 -3.5,-0.9 -0.1,0 -0.1,0 -0.2,0 0,0 -0.1,0 -0.1,0 -0.9,0 -1.6,0.1 -2.4,0.4 l 0,0 c -0.8,0.2 -1.4,0.4 -2.1,0.8 l 0,0 c -0.3,0.1 -0.4,0.1 -0.7,0.2 l 0,0 c 0,0 0,0 0,0 -0.1,0 -0.2,-0.1 -0.2,-0.1 -0.1,0 -0.1,-0.1 -0.2,-0.1 0,0 0,0 0,-0.1 l 0,0 c -0.1,-0.3 -0.2,-0.6 -0.3,-1 l -0.2,0 0,5.9 0.2,0 c 0.2,-0.9 0.4,-1.6 0.8,-2.3 0.4,-0.6 0.8,-1.1 1.4,-1.6 l 0,0 c 0.2,-0.2 0.5,-0.4 0.7,-0.6 1,-0.5 1.9,-0.7 3,-0.7 0.1,0 0.1,0 0.2,0 l 0,0 c 0,0 0.1,0 0.2,0 0.9,0 1.7,0.2 2.5,0.6 l 0,0 0,0 c 0.6,0.3 0.9,0.7 1.3,1.3 0,0.1 0.1,0.2 0.1,0.3 l 0,0 c 0.3,0.7 0.4,1.3 0.4,1.9 l 0,0 c 0,0.1 0,0.2 0,0.2 0,0.9 -0.2,1.6 -0.6,2.3 -0.1,0.3 -0.3,0.6 -0.5,0.8 l 0,0 c -0.9,0.9 -1.8,1.6 -3,2.2 -0.2,0.2 -0.4,0.2 -0.5,0.4 -1.1,0.6 -1.9,1.1 -2.5,1.4 -0.6,0.4 -1,0.8 -1.5,1.3 -0.4,0.4 -0.7,0.7 -1,1.2 -0.1,0.3 -0.2,0.5 -0.3,0.7 l 0,0 c -0.4,0.8 -0.5,1.6 -0.5,2.4 0,0.1 0,0.1 0,0.2 l 0,0 0,0 c 0,1.2 0.3,2.1 0.8,3.2 l 0,0 c 0,0 0.1,0 0.1,0 0.6,1.1 1.3,1.8 2.3,2.4 l 0,0 0.1,0 c 1,0.6 2.1,0.9 3.4,0.9 0,0 0,0 0,0 l 0,0 c 1.1,0 2.1,-0.2 3.1,-0.5 0.2,-0.1 0.4,-0.1 0.6,-0.1 0,0 0,0 0.1,0 0.3,0 0.5,0.2 0.7,0.7 l 0.2,0 0,-5 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path84" /><path
+         d="m 434.9,743.1 0,0.3 7.4,0 c 0,0 0.1,0 0.1,0 1.1,0 2.1,-0.2 3.1,-0.6 0.4,-0.1 0.8,-0.2 1.2,-0.5 0.4,-0.2 0.8,-0.5 1.2,-0.9 l 0,0 c 0.5,-0.4 0.8,-0.8 1.1,-1.3 0.1,-0.3 0.2,-0.5 0.3,-0.7 l 0,0 c 0.4,-0.8 0.5,-1.5 0.5,-2.4 0,0 0,0 0,0 l 0,0 0,-0.1 c 0,-0.8 -0.1,-1.5 -0.5,-2.3 l 0,0 c -0.1,-0.3 -0.2,-0.5 -0.3,-0.8 -0.3,-0.5 -0.6,-0.8 -1,-1.2 l 0,0 c -0.4,-0.4 -0.7,-0.6 -1.2,-0.9 -0.4,-0.2 -0.8,-0.4 -1.3,-0.5 l 0,0 c -1.1,-0.4 -2.1,-0.6 -3.3,-0.6 -0.1,0 -0.1,0 -0.2,0 -0.4,0 -1.2,0.1 -2.4,0.2 l 0,-8.1 c 0,-1.7 0.8,-2.5 2.5,-2.6 l 0,-0.2 -7.2,0 0,0.2 0,0 c 0.5,0 0.9,0.2 1.3,0.4 0.2,0.1 0.3,0.1 0.4,0.3 0.2,0.1 0.3,0.2 0.4,0.4 0.2,0.4 0.3,0.8 0.3,1.3 0,0 0,0.1 0,0.2 l 0,17.8 0,0 c 0,0 0,0.1 0,0.1 0,0.5 -0.1,0.8 -0.3,1.3 l 0,0 c 0,0 0,0.1 -0.1,0.2 -0.1,0.2 -0.2,0.4 -0.4,0.5 -0.1,0.1 -0.1,0.1 -0.2,0.2 -0.2,0 -0.3,0.1 -0.5,0.2 l -0.6,0.1 -0.3,0 z m 4.7,-0.5 0,-11.1 0,0 c 0.8,-0.2 1.5,-0.2 2.3,-0.2 0.1,0 0.1,0 0.2,0 1.1,0 2,0.2 3,0.7 0.2,0.2 0.4,0.3 0.6,0.4 1,0.8 1.5,2.3 1.5,4.4 0,0.1 0,0.1 0,0.2 0,1.3 -0.3,2.3 -0.9,3.4 -0.2,0.2 -0.3,0.4 -0.5,0.6 -0.3,0.5 -0.7,0.8 -1.2,1.1 -0.8,0.4 -1.6,0.6 -2.5,0.6 -0.1,0 -0.2,0 -0.3,0 -0.1,0 -0.1,0 -0.1,0 -0.8,0 -1.4,0 -2.1,-0.1 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path86" /><path
+         d="m 454.6,743 -0.3,0 0,0.4 7.9,0 c 0,0 0.1,0 0.2,0 1.1,0 2,-0.2 3,-0.6 0.2,-0.1 0.3,-0.2 0.5,-0.3 0.6,-0.4 1.1,-0.7 1.5,-1.3 l 0,0 c 0.2,-0.2 0.3,-0.5 0.5,-0.7 0.2,-0.4 0.4,-0.8 0.6,-1.2 l 0,0 c 0.2,-0.7 0.3,-1.4 0.3,-2.1 0,0 0,0 0,0 0,-0.9 -0.2,-1.6 -0.6,-2.4 0,-0.2 -0.1,-0.4 -0.2,-0.5 -0.4,-0.7 -0.8,-1.1 -1.3,-1.5 -0.3,-0.2 -0.5,-0.4 -0.7,-0.5 -0.6,-0.4 -1.3,-0.6 -2,-0.7 l 0,-0.1 c 1.4,-0.6 2.6,-2 3.7,-4 l 2.1,-3.6 0,0 c 0.1,-0.2 0.2,-0.4 0.3,-0.6 0.6,-1 1.1,-1.7 1.9,-2.5 l 0,0 c 0.1,-0.1 0.3,-0.2 0.5,-0.3 0.3,-0.2 0.7,-0.3 1.1,-0.4 l 0,-0.2 -4.1,0 c -0.1,0.2 -0.3,0.4 -0.5,0.7 l -0.4,0.7 c -0.1,0.1 -0.3,0.4 -0.5,0.7 0,0 0,0 0,0 -0.1,0.2 -0.2,0.4 -0.4,0.5 l -2.6,4.7 0,0 c -0.1,0 -0.1,0.1 -0.1,0.1 -0.5,0.8 -1,1.5 -1.6,2.2 l 0,0 c -0.5,0.5 -1,0.9 -1.6,1.2 0,0 0,0 0,0 l 0,0 c -0.4,0.3 -0.9,0.4 -1.3,0.5 l 0,0 c -0.5,0.1 -0.9,0.1 -1.3,0.1 -0.1,0 -0.1,0 -0.1,0 l 0,-8.6 c 0,-1.7 0.8,-2.5 2.4,-2.6 l 0,-0.2 -7.2,0 0,0.2 0,0 c 0.5,0 0.8,0.1 1.2,0.3 l 0,0 c 0.1,0 0.1,0 0.2,0.1 0.3,0.1 0.5,0.3 0.7,0.7 0,0 0,0 0,0 0.2,0.4 0.3,0.8 0.3,1.3 0,0.1 0,0.2 0,0.2 l 0,17.8 0,0 c 0,0.1 0,0.2 0,0.2 0,0.5 0,0.9 -0.3,1.3 -0.1,0.2 -0.2,0.3 -0.3,0.5 l 0,0 c -0.1,0.1 -0.3,0.2 -0.4,0.3 -0.3,0.2 -0.7,0.2 -1.1,0.2 z m 4.5,-11.1 1.3,0 0,0 c 0.1,0 0.2,0 0.3,0 1.1,0 2,0.2 3,0.6 l 0,0 c 0.2,0.1 0.3,0.2 0.4,0.2 0.6,0.4 1.1,0.8 1.4,1.5 0.1,0 0.1,0 0.1,0.1 l 0,0 c 0.4,0.8 0.6,1.6 0.6,2.6 0,0 0,0.1 0,0.1 0,1 -0.2,1.8 -0.6,2.7 l 0,0 c 0,0.2 -0.1,0.4 -0.2,0.6 -0.4,0.6 -0.9,1.1 -1.5,1.6 -0.1,0 -0.2,0.1 -0.2,0.1 -0.9,0.5 -1.8,0.8 -2.9,0.8 -0.1,0 -0.2,0 -0.3,0 0,0 -0.1,0 -0.1,0 -0.5,0 -0.8,-0.1 -1.3,-0.2 l 0,-10.7 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path88" /><path
+         d="m 488.5,743.7 7.3,-20.2 c 0.2,-0.6 0.4,-1.2 0.8,-1.8 0.1,-0.1 0.2,-0.3 0.3,-0.5 0.2,-0.3 0.4,-0.6 0.8,-0.7 0,-0.1 0.1,-0.1 0.1,-0.1 0.4,-0.2 0.8,-0.3 1.2,-0.3 l 0,-0.2 -7.9,0 0,0.2 c 0.1,0 0.2,0 0.3,0 0.5,0 1,0.1 1.6,0.2 0.5,0.2 0.7,0.6 0.7,1.3 -0.1,0.5 -0.2,0.9 -0.4,1.4 0,0 0,0 0,0 0,0.1 0,0.1 0,0.2 l -2.1,6.2 -8.6,0 -1.9,-5.8 0,0 c -0.3,-0.6 -0.4,-1.2 -0.4,-1.9 0,0 0,-0.1 0,-0.2 0,-0.2 0,-0.5 0.2,-0.7 0.1,-0.2 0.2,-0.3 0.3,-0.4 l 0,0 c 0.4,-0.2 0.8,-0.3 1.3,-0.3 0.1,0 0.1,0 0.2,0 l 0,-0.3 -5.8,0 0,0.3 c 0.5,0 0.9,0.2 1.3,0.4 0.3,0.1 0.5,0.3 0.7,0.5 0.2,0.3 0.4,0.6 0.7,0.9 0.2,0.5 0.4,1 0.6,1.5 l 6.9,20.2 1.8,0.1 z m -5.6,-13.4 7.8,0 -4,11.2 -0.1,0 -3.7,-11.2 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path90" /><path
+         d="m 520.1,738.1 -0.2,0 c -0.1,0.7 -0.3,1.2 -0.6,1.8 -0.3,0.4 -0.6,0.8 -1,1.2 l 0,0 c -0.4,0.4 -0.9,0.7 -1.5,1.1 -0.4,0.2 -0.9,0.4 -1.4,0.6 l 0,0 c -1,0.4 -2,0.5 -3,0.6 l 0,0 c -0.1,0 -0.1,0 -0.1,0 -1.3,0 -2.4,-0.3 -3.6,-0.9 l 0,0 c -0.2,-0.1 -0.3,-0.2 -0.4,-0.3 -1.1,-0.5 -1.8,-1.2 -2.5,-2.1 l 0,0 c -0.4,-0.5 -0.7,-0.9 -0.9,-1.3 -0.5,-0.8 -0.8,-1.6 -1.1,-2.4 l 0,0 c -0.5,-1.7 -0.7,-3.1 -0.7,-4.7 0,-0.1 0,-0.1 0,-0.1 0,0 0,-0.1 0,-0.1 0,-1.6 0.2,-2.9 0.7,-4.5 l 0,0 c 0.2,-0.8 0.5,-1.5 1,-2.3 0.2,-0.5 0.5,-0.9 0.9,-1.4 l 0,0 c 0.7,-0.8 1.4,-1.4 2.4,-2 1.3,-0.8 2.6,-1.1 4.1,-1.1 0.1,0 0.2,0 0.2,0 1.4,0 2.5,0.3 3.8,0.7 l 0,0 c 0.6,0.2 1,0.4 1.5,0.7 0.9,0.5 1.5,1 2.2,1.7 l 0,-0.9 c -0.8,-0.7 -1.6,-1.2 -2.6,-1.8 -0.4,-0.2 -0.7,-0.4 -1.1,-0.6 -1.3,-0.5 -2.5,-0.8 -3.9,-0.8 -0.1,0 -0.2,0 -0.4,0 l 0,0 c 0,0 0,0 -0.1,0 -1.7,0 -3.2,0.3 -4.7,1.1 -0.4,0.1 -0.7,0.3 -1,0.5 -1.1,0.6 -1.9,1.3 -2.7,2.2 -0.6,0.6 -1,1.2 -1.4,1.9 -0.4,0.7 -0.7,1.3 -0.9,2 l 0,0 c -0.6,1.5 -0.8,2.8 -0.8,4.4 0,2.4 0.5,4.3 1.6,6.4 l 0,0 c 0.1,0.1 0.1,0.2 0.2,0.3 1,1.9 2.4,3.2 4.2,4.4 l 0,0 c 0.1,0 0.2,0.1 0.4,0.2 1.8,1 3.5,1.5 5.6,1.5 0,0 0,0 0,0 l 0,0 c 1.6,-0.1 2.8,-0.2 4.3,-0.7 l 1.6,-0.4 0,0 c 0.3,-0.1 0.5,-0.1 0.8,-0.1 l 0,0 c 0,0 0.1,0 0.1,0 0.2,0 0.4,0 0.6,0.1 l 0.1,0.1 0,0 c 0,0 0.1,0.1 0.1,0.2 0.1,0.1 0.1,0.3 0.2,0.4 l 0.2,0 -0.2,-5.6 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path92" /><path
+         d="m 542.3,732.6 0,7.9 c 0,0 0,0.1 0,0.1 0,0.6 -0.1,1 -0.4,1.5 -0.1,0.1 -0.1,0.2 -0.2,0.3 -0.2,0.2 -0.3,0.3 -0.5,0.4 -0.4,0.2 -0.7,0.3 -1.2,0.3 -0.1,0 -0.1,0 -0.2,0 l 0,0.3 7.2,0 0,-0.3 c -0.1,0 -0.1,0 -0.2,0 -0.4,0 -0.7,-0.1 -1.1,-0.3 -0.2,-0.1 -0.4,-0.2 -0.5,-0.4 -0.1,-0.1 -0.2,-0.2 -0.2,-0.3 -0.3,-0.5 -0.4,-0.9 -0.4,-1.5 0,0 0,-0.1 0,-0.1 l 0,-17.8 c 0,-1.7 0.8,-2.6 2.4,-2.6 l 0,-0.2 -7.2,0 0,0.2 c 0.1,0 0.1,0 0.2,0 0.4,0 0.8,0.1 1.2,0.4 0.2,0 0.3,0.1 0.4,0.3 l 0,0 c 0.2,0.1 0.2,0.2 0.3,0.4 0.3,0.4 0.4,0.8 0.4,1.3 0,0.1 0,0.1 0,0.2 l 0,9.2 -13,0 0,-9.2 0,0 c 0,0 0,-0.1 0,-0.1 0,-0.5 0.1,-0.9 0.4,-1.3 0.1,-0.2 0.2,-0.3 0.3,-0.5 l 0,0 c 0.1,-0.1 0.3,-0.2 0.4,-0.3 0.4,-0.2 0.8,-0.4 1.3,-0.4 0,0 0,0 0.1,0 l 0,-0.2 -7.2,0 0,0.2 c 0,0 0.1,0 0.1,0 0.4,0 0.8,0.2 1.2,0.4 0.2,0.1 0.3,0.2 0.5,0.3 0.1,0.2 0.1,0.3 0.2,0.4 0.3,0.4 0.4,0.9 0.4,1.4 0,0 0,0.1 0,0.1 l 0,17.8 c 0,1.8 -0.8,2.6 -2.4,2.6 l 0,0.3 7.2,0 0,-0.3 0,0 c -0.1,0.1 -0.2,0.1 -0.2,0.1 -0.4,0 -0.8,-0.2 -1.2,-0.4 -0.2,-0.1 -0.3,-0.2 -0.5,-0.4 l 0,0 c -0.1,-0.1 -0.1,-0.2 -0.2,-0.3 -0.3,-0.4 -0.4,-0.9 -0.4,-1.4 0,-0.1 0,-0.1 0,-0.2 l 0,-7.8 13,-0.1 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path94" /><path
+         d="m 551.4,743.1 0,0.3 13.5,0 0,-3.8 -0.3,0 c 0,2 -1.2,3 -3.8,3 l -4.7,0 0,-10.7 4.2,0 0,0 c 0,0 0.1,0 0.1,0 0.7,0 1.4,0.2 2.1,0.5 0,0 0,0 0,0 0.4,0.2 0.6,0.4 0.8,0.7 0.2,0.4 0.3,0.7 0.3,1.1 0,0 0,0 0,0.1 l 0.2,0 0,-5.3 -0.2,0 c 0,0.4 -0.2,0.8 -0.4,1.2 0,0.1 -0.1,0.1 -0.1,0.2 -0.2,0.3 -0.4,0.4 -0.7,0.6 0,0 0,0 -0.1,0.1 l 0,0 c -0.2,0 -0.4,0.1 -0.6,0.1 l 0,0 c -0.4,0.1 -0.8,0.1 -1.2,0.1 l 0,0 -4.3,0 0,-8.4 0,0 c 0,0 0,0 0,0 0,-0.6 0.1,-1.1 0.3,-1.6 0.3,-0.5 0.8,-0.7 1.6,-0.7 l 3.4,0 c 0,0 0.1,0 0.2,0 0.6,0 1.2,0.1 1.8,0.4 0.1,0 0.1,0.1 0.2,0.1 0.5,0.3 0.7,0.5 1,0.9 0.1,0.1 0.1,0.2 0.2,0.3 0.2,0.4 0.4,0.8 0.6,1.3 l 0.2,0 -0.8,-3.7 -13.5,0 0,0.2 0.3,0 c 0.4,0.1 0.7,0.2 1,0.3 0.2,0.1 0.3,0.2 0.5,0.3 l 0,0 c 0.1,0.2 0.2,0.3 0.3,0.5 0.3,0.4 0.4,0.8 0.4,1.3 0,0.1 0,0.2 0,0.2 l 0,17.7 c 0,0.1 0,0.1 0,0.1 0,0.7 -0.2,1.2 -0.5,1.8 -0.2,0.3 -0.3,0.4 -0.6,0.6 -0.3,0.1 -0.6,0.2 -0.9,0.2 0,0 -0.1,0 -0.1,0 l -0.4,0 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         id="path96" /></g></g></svg>
\ No newline at end of file
diff --git a/public/img/korap-200.png b/public/img/korap-200.png
new file mode 100644
index 0000000..dbf8b53
--- /dev/null
+++ b/public/img/korap-200.png
Binary files differ
diff --git a/public/img/korap-280.png b/public/img/korap-280.png
new file mode 100644
index 0000000..8a542e3
--- /dev/null
+++ b/public/img/korap-280.png
Binary files differ
diff --git a/public/img/korap-400.png b/public/img/korap-400.png
new file mode 100644
index 0000000..9e87294
--- /dev/null
+++ b/public/img/korap-400.png
Binary files differ
diff --git a/public/img/korap-bg-kalamar.svg b/public/img/korap-bg-kalamar.svg
new file mode 100644
index 0000000..6e591f4
--- /dev/null
+++ b/public/img/korap-bg-kalamar.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     version="1.1"
+     width="195.90726"
+     height="195.79347">
+  <defs>
+    <style type="text/css">
+.kalamar-white {
+  fill:#fff;
+  stroke:none;
+}
+.kalamar-shade {
+  fill:rgb(217, 218, 219); /* #9bad0b; */
+  fill-opacity:1;
+  stroke:none
+}
+.kalamar-contour {
+  fill: rgb(135, 136, 138); /* #636f07; */
+  stroke:none;
+}
+    </style>
+  </defs>
+  <g transform="matrix(-2.555441,0,0,2.555441,-265.32464,-14.501228)">
+    <path d="m -176.97468,76.132038 c 3.66892,-22.18235 14.96757,-30.383963 22.94726,-33.347803 1.27219,-5.14938 6.59805,-9.4801 9.57511,-11.39108 0.68163,-6.57435 0.11697,-10.26917 -7.42897,-9.07985 4.67098,-11.431859 9.85548,-5.06313 16.26642,1.25279 4.87196,-8.593909 12.80709,-13.405639 22.03403,-15.1201895 -10.85637,14.2560195 -13.23298,18.2087195 4.63293,15.8484595 -13.16158,10.00294 -9.87643,11.28363 -7.36105,18.67589 3.60963,9.323133 -9.91949,10.306293 -0.69901,20.139683 -11.87742,-4.81211 -7.3161,-6.57437 -4.75936,-15.985363 -1.36508,-4.65767 -4.24601,-3.42634 -9.23554,-3.65072 -2.88772,5.960093 -5.5152,6.463833 -10.53638,8.516663 -2.43179,4.2103 -4.4081,6.88534 -8.77893,8.11858 0,0 1.71986,3.18045 1.33117,10.75998 -8.96555,3.22634 -13.2267,-1.42912 -27.98768,5.26296 z" class="kalamar-white" />
+    <path d="m -128.47797,42.300723 c 2.34699,-3.935129 5.13394,-5.872187 9.23746,-7.145693 2.94179,6.287649 5.36031,10.921465 1.6071,16.10053 -3.23294,4.461148 -1.86432,6.61053 -0.98684,11.51872 -15.442,-5.658242 6.22305,-16.18535 -9.85772,-20.473557 z" class="kalamar-shade" />
+    <path d="m -164.87316,72.481865 c -0.74468,-14.044694 7.86713,-23.388402 14.77871,-27.182268 0,0 -0.32824,-5.905702 7.38936,-9.764503 4.22248,-2.111245 8.44497,-5.805921 9.50059,-7.917165 1.05563,-2.111244 2.63906,-8.972788 13.19528,-12.139654 2.33047,-0.699142 5.27811,-6.8615423 5.27811,-6.8615423 0,0 -15.30652,0.7917165 -20.84854,15.5704243 -6.63964,-10.838563 -15.66632,-9.257562 -17.41776,-0.527811 l 6.33373,-2.37515 2.90296,6.333733 0,4.222488 c -6.12474,2.815086 -8.99771,6.053032 -12.13965,11.611842 -17.19331,10.885233 -16.23564,14.016018 -21.64025,31.404755 z" class="kalamar-shade" />
+    <g transform="matrix(0.47473464,0,0,0.47473464,-90.679487,-143.90007)">
+      <path d="m -41.0625,316.71875 c -9.576308,1.01227 -20.437266,3.97659 -29.25,7.9375 -12.689388,4.5451 -17.191568,11.74018 -24.8125,23.4375 -11.15001,-20.80692 -41.92684,-26.49295 -41.8125,21.8125 19.56928,-37.23779 25.50612,-2.99825 18.56887,0.52807 -6.86631,3.49026 -13.44723,13.16503 -18.87854,20.52748 -4.82783,2.6553 -11.25044,5.91984 -19.19033,14.56945 -12.14063,1.68579 -22.40697,-0.0589 -25.34375,5.0625 -1.92028,4.88459 -0.83547,28.6183 -1.34375,35.5625 -0.55023,7.5173 -4.47505,20.2185 -4.40625,27.78125 0.0449,4.93417 13.37698,-12.52554 26.0625,-13.9375 14.32568,-1.59452 20.40751,-0.6761 31.21875,-1.84375 3.43365,-0.38537 6.60948,-1.10948 8.71875,-3.21875 4.52684,-4.79348 0.17472,-20.54012 -0.29959,-24.04322 8.88011,-4.01684 12.99872,-10.88406 16.73709,-16.70678 3.77753,-0.95969 15.445077,-3.54975 21,-16.34375 7.291276,-0.62721 24.237611,-3.90486 11.375,16.46875 -6.517142,10.32276 3.151699,23.79009 20.8125,23.75 1.965174,-0.004 -17.965788,-13.53523 -1.5,-27.15625 6.115872,-5.05925 1.147006,-24.90772 -1.8125,-28.03125 8.5569,-3.5296 16.780975,-7.81843 24.028066,-11.61639 -5.695239,-3.30642 -12.406435,-4.85672 -18.403066,-4.82111 5.354884,-3.41771 16.921224,-11.53597 20.25,-16.09375 -11.616163,-0.86442 -19.285929,-0.0412 -27.78125,2.8125 9.452491,-6.90785 8.090662,-15.36938 18.71875,-24 -8.87593,1.32852 -13.462677,3.88184 -18.255425,7.21014 6.099195,-6.84313 11.408663,-11.09351 15.599175,-19.64764 z m -12.441804,7.73597 c -11.095923,11.19905 -13.975386,11.23168 -18.558196,17.23278 -6.054124,7.92777 -5.560879,14.47415 -6.5625,18.21875 -1.7769,6.64303 -7.715317,4.85942 -13.0625,15.53125 14.183728,-6.21639 24.683497,-12.45862 46.25,-18.375 -9.461391,8.73077 -24.403941,17.1424 -25.21875,18.25 -2.183992,3.18854 -5.444043,10.06958 -11.15625,15.3125 2.408839,-7.40462 1.715415,-13.1914 0.25,-11.875 -5.549237,4.98497 -4.613076,19.29372 -12.65625,24.78125 -19.7524,13.47626 -22.75335,1.44128 -25.46875,3.53125 -3.95231,3.04198 5.19443,6.03907 8.84375,7.09375 -12.45497,22.57734 -15.33207,-1.01345 -17.5625,0.9375 -2.34427,3.49555 -4.94017,10.31391 1.65625,27.03125 4.79214,12.14474 -5.64918,9.38439 -28.6875,10.03125 -6.33671,0.17792 -7.40723,0.64601 -16.875,3.40625 -3.67924,1.07265 -6.43347,0.3457 -4.09375,-7.375 6.22132,-21.48923 25.63482,-51.11456 47.1875,-51.78125 5.41258,0.0202 -2.85402,-4.43244 -1.15625,-7 1.14364,-1.71649 1.69063,-3.07836 4.875,-6.78125 3.1993,-3.72024 7.1807,-7.23815 10.6875,-8.4375 9.9105,-3.38947 16.179182,-10.5037 20.9375,-17.75 4.758318,-7.2463 9.760842,-14.98099 13.790979,-19.5625 8.399265,-7.13109 17.947719,-11.1466 26.579717,-12.42028 z m -46.383609,29.16486 c -2.130107,3.06203 -4.848197,5.48276 -8.829717,8.99027 -0.70108,-9.35992 -4.24033,-21.15662 -15.27919,-16.24664 6.35844,-8.45156 16.77027,-5.51365 24.108907,7.25637 z m -11.674587,23.91167 c -4.03898,0.1203 -13.63356,6.71296 -11.3125,7.3125 3.448,0.89065 5.85746,-3.06506 6.65625,-2 0.79879,1.06505 -3.98884,6.11989 -2.125,8.25 1.86385,2.13011 10.52138,-10.92425 8.125,-13.1875 -0.29955,-0.28291 -0.76675,-0.39219 -1.34375,-0.375 z m 13.78125,5.6875 c -12.17132,-0.16801 -21.14791,15.22012 -16.3125,23.46875 1.53677,2.62156 3.3125,-3.75 3.3125,-3.75 0,0 3.11795,3.53663 14,-2.375 8.402975,-4.56488 4,-12 4,-12 0,0 4.71202,-2.54027 0.375,-4.25 -1.837848,-0.72451 -3.636241,-1.06975 -5.375,-1.09375 z m 35.75,1.59375 c 2.263242,2.13011 10.208153,17.39173 3.34375,24 -10.703205,10.30384 -6.124144,19.34772 -2.063621,23.07541 0,0 -16.825481,-4.92207 -3.316804,-22.83402 5.115247,-6.78261 -1.725255,-19.11178 -10.487087,-17.76291 4.526484,-3.3283 9.31616,-5.23421 12.523762,-6.47848 z M -96,389.34375 c 3.349039,6.48058 -5.80905,12.7184 -13.5625,10.6875 3.59456,-5.45841 7.17217,-9.62245 13.5625,-10.6875 z m -3.28125,2.28125 c -0.93337,0.009 -2.08278,0.50309 -3.03125,1.40625 -1.51756,1.44506 -2.00642,3.38529 -1.09375,4.34375 0.91267,0.95846 2.88869,0.57006 4.40625,-0.875 1.517557,-1.44506 2.006417,-3.38529 1.09375,-4.34375 -0.34225,-0.35942 -0.814977,-0.5364 -1.375,-0.53125 z" class="kalamar-contour" />
+    </g>
+  </g>
+</svg>
diff --git a/public/img/korap-bg.svg b/public/img/korap-bg.svg
new file mode 100644
index 0000000..464ead3
--- /dev/null
+++ b/public/img/korap-bg.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="178.37961"
+   width="182.96368"
+   xml:space="preserve"
+   viewBox="0 0 182.96369 178.3796"
+   y="0px"
+   x="0px"
+   id="Ebene_1"
+   version="1.1"><metadata
+     id="metadata9"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs7" /><path
+     style="fill:#d9dadb;fill-opacity:1"
+     id="path3"
+     d="m 109.80282,0 c 23.8,0 17.5,28.6 25.9,111.6 -0.6,-6.2 34.8,-3.7 37,2.8 1.9,5.6 -14.4,5.6 -18.4,8.4 3.7,5.1 8.5,6.8 14.4,5.8 1.8,-0.3 3.6,-0.8 5.4,-0.9 3.8,-0.3 7.2,0.7 8.5,4.6 1.3,4 -1.1,6.8 -4.2,8.7 -7.7,4.8 -16.3,3.7 -24.8,3.1 -1.1,-0.1 -2.2,-0.3 -3.5,-0.5 2.1,9.2 11.4,15.4 20.1,13.6 6,-1.2 10,0.7 11.8,5.5 1.7,4.7 -0.3,9.9 -5.2,12.7 -6.1,3.4 -12.8,3.4 -19.5,2.4 -16.1,-2.3 -30,-9.3 -42.4,-19.7 -18.700004,-15.7 -27.900004,-15.6 -46.800004,0 -14.6,12.1 -31,20.2 -50.4,20 -4.3,-0.1 -8.8999997,-1.6 -12.6999997,-3.7 -4.59999999,-2.5 -5.69999999,-7.7 -3.9,-12.2 1.7,-4.1 5.7,-6.1 10.6999997,-5.3 10,1.6 17,-2.6 21.1,-12.5 -5.3,0 -10.7,0.5 -16,-0.1 -4.3,-0.5 -8.6999997,-1.9 -12.6999997,-3.8 -3.1,-1.4 -5.09999999,-4.6 -3.79999999,-8.3 1.19999999,-3.7 4.29999999,-4.9 7.99999999,-4.6 1.5999997,0.1 3.2999997,0.3 4.8999997,0.7 6.1,1.6 11.1,-0.1 15.3,-5.2 -3.5,-3.3 -21.8999997,-5.6 -18.8999997,-11.5 3.4999997,-7 40.3999997,-6.6 40.0999997,-0.2 4.5,-80.3 37.5,-111.4 60.000004,-111.4 z M 78.502816,52 c -3.5,0 -6.4,2.9 -6.4,6.4 0,3.5 2.9,6.4 6.4,6.4 3.5,0 6.4,-2.9 6.4,-6.4 0,-3.5 -2.9,-6.4 -6.4,-6.4 z m 24.900004,0 c -3.500004,0 -6.400004,2.9 -6.400004,6.4 0,3.5 2.9,6.4 6.400004,6.4 3.5,0 6.4,-2.9 6.4,-6.4 0,-3.5 -2.8,-6.4 -6.4,-6.4 z" /></svg>
\ No newline at end of file
diff --git a/public/img/korap-logo-kalamar.svg b/public/img/korap-logo-kalamar.svg
new file mode 100644
index 0000000..4ea629b
--- /dev/null
+++ b/public/img/korap-logo-kalamar.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="296.4375" height="77.365486">
+  <defs>
+    <style type="text/css">
+path { stroke-linecap:round; stroke-linejoin:round; stroke-miterlimit:4 }
+.logoinit { fill:#fff; stroke:#636f07; stroke-width:4 }
+.logoend { fill:#636f07; fill-opacity:1; stroke:#9bad0b; stroke-width:2; }
+#karl-fill { fill:#ffffff; }
+#karl { fill:#636f07; stroke:none; }
+#karl-arm { fill:#636f07; stroke:none; }
+#logo-k-fill { fill:#ffffff; stroke:none; }
+    </style>
+  </defs>
+  <path d="m 61.588905,50.398787 c -4.58857,-7.491533 -9.36444,-14.514869 -15.73224,-22.380979 l 10.01994,-10.394513 c 4.40127,-4.49492 8.52163,-6.742388 13.20384,-7.02332 0.65551,-1.6855946 1.03008,-5.1504366 1.03008,-7.3042526 -2.24746,0.187289 -10.67545,0.280933 -14.32757,0.280933 -3.65212,0 -8.2407,-0.09364 -10.5818,-0.280933 0,2.24746 0.18729,5.244081 0.8428,7.3042526 3.37119,0.187288 3.83941,2.809334 -1.96653,8.615272 l -12.64198,12.548332 0,-10.862735 c 0,-8.427975 0.93645,-9.739004 6.08688,-10.300869 0.8428,-2.4347486 0.8428,-4.7758596 0.8428,-7.3042526 -3.74577,0.187289 -11.33096,0.280933 -15.82588,0.280933 -4.49492,0 -13.6720709,-0.09364 -16.7623309,-0.280933 0,2.434749 0.37458,5.431369 0.8428,7.3042526 5.2440809,0.749153 6.0868809,1.872894 6.0868809,10.300869 l 0,28.467856 c 0,8.615264 -0.93645,10.113581 -5.9932309,10.488158 -0.46822,1.779239 -0.93645,5.056792 -0.93645,7.304252 4.4012799,-0.187288 11.2373209,-0.280932 17.6987709,-0.280932 6.46145,0 12.08011,0.09364 14.88944,0.280932 0,-2.434748 -0.28093,-5.618657 -0.74916,-7.304252 -5.05678,-0.374577 -6.18052,-1.872894 -6.18052,-10.488158 l 0,-10.488157 c 7.39789,8.98984 12.73563,18.822507 17.60512,28.842433 4.68221,-0.655509 19.0098,-0.842798 23.692,-0.842798 0.93645,-1.872884 1.12373,-4.213995 1.12373,-7.02332 -4.77585,-0.561865 -8.14705,-2.809335 -12.26739,-9.458071" class="logoinit" />
+  <path d="m 100.10567,23.148306 c -14.421205,0 -25.939465,7.304269 -25.939465,23.130134 0,13.203828 8.33436,21.444536 25.09667,21.444536 16.294075,0 26.220385,-8.334354 26.220385,-23.036489 0,-12.454675 -8.14707,-21.538181 -25.37759,-21.538181 m -1.404665,6.742387 c 4.588565,0 8.989845,5.712313 8.989845,17.886055 0,7.116957 -2.43475,12.73562 -6.64874,12.73562 -6.086865,0 -9.083495,-8.147061 -9.083495,-17.79241 0,-7.023313 2.15383,-12.829265 6.74239,-12.829265" class="logoinit" />
+  <path d="m 151.07444,47.308526 c 0,-5.150429 3.09026,-10.207224 5.61865,-10.207224 2.5284,0 3.55848,1.872889 3.65213,5.993233 2.62204,0 7.3979,-0.18729 9.92629,-1.31102 -0.37458,-4.588564 0.18729,-11.611893 0.93644,-15.919525 -2.24746,-1.591951 -4.30764,-2.247462 -6.92967,-2.247462 -5.05679,0 -9.45808,3.277553 -12.17376,7.585185 -0.74915,1.217374 -1.87288,4.494927 -2.71568,6.836031 1.12373,-4.588564 1.6856,-6.929677 1.6856,-8.896205 0,-3.277546 -1.12374,-5.056791 -3.18391,-5.993233 -2.99661,1.498307 -10.7691,3.090261 -20.03987,3.090261 -1.03009,1.966528 -1.21738,4.682216 -1.21738,7.02332 6.08687,0.561865 6.64875,2.247468 6.64875,8.334339 l 0,7.772474 c 0,8.615264 -1.21738,10.113581 -6.27417,10.488158 -0.46822,1.779239 -0.65551,3.933062 -0.65551,7.304252 4.30763,-0.187288 12.17376,-0.280932 18.91614,-0.280932 5.89959,0 13.29749,0.09364 16.85597,0.280932 0,-2.341104 -0.0937,-5.24408 -0.8428,-7.304252 -7.86611,-0.561865 -10.20722,-3.371202 -10.20722,-11.4246 l 0,-1.123732" class="logoinit" />
+  <path d="m 231.61531,59.856858 c -2.71568,-0.280933 -3.93306,-1.591962 -8.33434,-11.237312 L 202.49195,3.0147904 c -2.90297,0 -4.68222,0 -7.11697,0.561865 L 175.5224,50.398787 c -3.09026,7.210601 -4.49493,8.896206 -7.49154,9.458071 -0.74916,2.341104 -0.93645,4.494927 -0.93645,7.304252 1.87289,-0.187288 5.8996,-0.280932 8.98985,-0.280932 3.09026,0 8.80257,0.09364 10.95638,0.280932 0,-2.996613 -0.28093,-5.337725 -0.74915,-7.304252 -4.0267,-0.655509 -4.68221,-4.494928 -3.55848,-7.210608 l 0.18728,-0.374578 c 7.21061,-0.749153 14.42123,-0.936442 21.25725,-0.936442 l 0.65551,1.404664 c 1.87289,4.213987 1.21737,6.180522 -2.90297,7.116964 -0.46822,1.872883 -0.74915,3.839418 -0.74915,7.304252 3.55847,-0.280932 13.48477,-0.280932 16.48139,-0.280932 2.99661,0 10.95638,0 14.70215,0.280932 0,-2.996613 -0.28094,-5.712301 -0.74916,-7.304252 m -30.05981,-14.608505 -15.91952,0 3.09026,-7.959763 c 1.87288,-4.588564 3.37119,-8.896209 4.58857,-12.922908 1.03008,4.026699 2.62204,8.334344 4.68221,12.922908 l 3.55848,7.959763" class="logoend" />
+  <path d="m 267.67298,39.25512 c -0.56186,0 -1.31102,0 -2.06017,-0.187289 -0.93644,1.779239 -1.31102,4.026706 -0.8428,6.742387 1.6856,0.655509 3.65213,0.936443 6.46146,0.936443 13.5784,0 22.19369,-10.113593 22.19369,-22.942845 0,-11.050012 -5.43139,-20.4144486 -20.88267,-20.4144486 -8.80256,0 -14.70216,0.187288 -20.32081,0.187288 -5.52501,0 -10.30087,-0.09364 -16.20046,-0.280933 0,2.996614 0.37458,5.431369 0.8428,7.3042526 5.24408,0.749153 6.08688,1.872894 6.08688,10.300869 l 0,28.467856 c 0,8.615264 -1.21738,10.113581 -6.27417,10.488158 -0.46822,1.779239 -0.65551,3.933062 -0.65551,7.304252 4.30764,-0.187288 12.17376,-0.280932 18.91614,-0.280932 5.89959,0 14.23394,0.09364 17.79241,0.280932 0,-2.341104 -0.0936,-5.24408 -0.84279,-7.304252 -7.86611,-0.561865 -10.20723,-3.371202 -10.20723,-11.4246 l 0,-36.989485 c 1.12373,-0.468221 2.43475,-0.65551 4.02671,-0.65551 6.55509,0 9.92629,6.274175 9.92629,14.70215 0,10.207215 -4.02671,13.765707 -7.95977,13.765707" class="logoend" />
+  <path d="M 3.7328171,70.987254 C 7.4017351,48.804904 18.700387,40.603291 26.680069,37.639451 c 1.27219,-5.14938 6.598055,-9.4801 9.575111,-11.39108 0.681635,-6.57435 0.11697,-10.26917 -7.428965,-9.07985 4.670973,-11.4318596 9.855482,-5.06313 16.266413,1.25279 C 49.964594,9.8274014 57.899726,5.0156714 67.126661,3.3011214 56.270295,17.557141 53.893683,21.509841 71.759594,19.149581 c -13.161586,10.00294 -9.876435,11.28363 -7.361052,18.67589 3.609629,9.323133 -9.919494,10.306293 -0.699008,20.139683 -11.877419,-4.81211 -7.316097,-6.57437 -4.759364,-15.985363 -1.365082,-4.65767 -4.246008,-3.42634 -9.235539,-3.65072 -2.887718,5.960093 -5.515198,6.463833 -10.536382,8.516663 -2.431784,4.2103 -4.408093,6.88534 -8.77893,8.11858 0,0 1.719864,3.18045 1.33117,10.75998 -8.965548,3.22634 -13.226698,-1.42912 -27.9876719,5.26296 z" id="karl-fill" />
+  <g transform="matrix(0.47473464,0,0,0.47473464,90.028005,-149.04486)">
+    <path d="m -41.0625,316.71875 c -9.576308,1.01227 -20.437266,3.97659 -29.25,7.9375 -12.689388,4.5451 -17.191568,11.74018 -24.8125,23.4375 -11.15001,-20.80692 -41.92684,-26.49295 -41.8125,21.8125 19.56928,-37.23779 25.50612,-2.99825 18.56887,0.52807 -6.86631,3.49026 -13.44723,13.16503 -18.87854,20.52748 -4.82783,2.6553 -11.25044,5.91984 -19.19033,14.56945 -12.14063,1.68579 -22.40697,-0.0589 -25.34375,5.0625 -1.92028,4.88459 -0.83547,28.6183 -1.34375,35.5625 -0.55023,7.5173 -4.47505,20.2185 -4.40625,27.78125 0.0449,4.93417 13.37698,-12.52554 26.0625,-13.9375 14.32568,-1.59452 20.40751,-0.6761 31.21875,-1.84375 3.43365,-0.38537 6.60948,-1.10948 8.71875,-3.21875 4.52684,-4.79348 0.17472,-20.54012 -0.29959,-24.04322 8.88011,-4.01684 12.99872,-10.88406 16.73709,-16.70678 3.77753,-0.95969 15.445077,-3.54975 21,-16.34375 7.291276,-0.62721 21.90219,-3.71024 9.039579,16.66337 -6.517142,10.32276 5.48712,23.59547 23.147921,23.55538 1.965174,-0.004 -17.965788,-13.53523 -1.5,-27.15625 6.115872,-5.05925 1.147006,-24.90772 -1.8125,-28.03125 8.5569,-3.5296 16.780975,-7.81843 24.028066,-11.61639 -5.695239,-3.30642 -12.406435,-4.85672 -18.403066,-4.82111 5.354884,-3.41771 16.921224,-11.53597 20.25,-16.09375 -11.616163,-0.86442 -19.285929,-0.0412 -27.78125,2.8125 9.452491,-6.90785 8.090662,-15.36938 18.71875,-24 -8.87593,1.32852 -13.462677,3.88184 -18.255425,7.21014 6.099195,-6.84313 11.408663,-11.09351 15.599175,-19.64764 z m -12.441804,7.73597 c -11.095923,11.19905 -13.975386,11.23168 -18.558196,17.23278 -6.054124,7.92777 -5.560879,14.47415 -6.5625,18.21875 -1.7769,6.64303 -7.715317,4.85942 -13.0625,15.53125 14.183728,-6.21639 24.683497,-12.45862 46.25,-18.375 -9.461391,8.73077 -24.403941,17.1424 -25.21875,18.25 -2.183992,3.18854 -5.444043,10.06958 -11.15625,15.3125 2.408839,-7.40462 1.715415,-13.1914 0.25,-11.875 -5.549237,4.98497 -4.613076,19.29372 -12.65625,24.78125 -19.7524,13.47626 -22.75335,1.44128 -25.46875,3.53125 -3.95231,3.04198 5.19443,6.03907 8.84375,7.09375 -12.45497,22.57734 -15.33207,-1.01345 -17.5625,0.9375 -2.34427,3.49555 -4.94017,10.31391 1.65625,27.03125 4.79214,12.14474 -5.64918,9.38439 -28.6875,10.03125 -6.33671,0.17792 -7.40723,0.64601 -16.875,3.40625 -3.67924,1.07265 -6.43347,0.3457 -4.09375,-7.375 6.22132,-21.48923 25.63482,-51.11456 47.1875,-51.78125 5.41258,0.0202 -2.85402,-4.43244 -1.15625,-7 1.14364,-1.71649 1.69063,-3.07836 4.875,-6.78125 3.1993,-3.72024 7.1807,-7.23815 10.6875,-8.4375 9.9105,-3.38947 16.179182,-10.5037 20.9375,-17.75 4.758318,-7.2463 9.760842,-14.98099 13.790979,-19.5625 8.399265,-7.13109 17.947719,-11.1466 26.579717,-12.42028 z m -46.383609,29.16486 c -2.130107,3.06203 -4.848197,5.48276 -8.829717,8.99027 -0.70108,-9.35992 -4.24033,-21.15662 -15.27919,-16.24664 6.35844,-8.45156 16.77027,-5.51365 24.108907,7.25637 z m -11.674587,23.91167 c -4.03898,0.1203 -13.63356,6.71296 -11.3125,7.3125 3.448,0.89065 5.85746,-3.06506 6.65625,-2 0.79879,1.06505 -3.98884,6.11989 -2.125,8.25 1.86385,2.13011 10.52138,-10.92425 8.125,-13.1875 -0.29955,-0.28291 -0.76675,-0.39219 -1.34375,-0.375 z m 13.78125,5.6875 c -12.17132,-0.16801 -21.14791,15.22012 -16.3125,23.46875 1.53677,2.62156 3.3125,-3.75 3.3125,-3.75 0,0 3.11795,3.53663 14,-2.375 8.402975,-4.56488 4,-12 4,-12 0,0 4.71202,-2.54027 0.375,-4.25 -1.837848,-0.72451 -3.636241,-1.06975 -5.375,-1.09375 z m 35.75,1.59375 c 2.263242,2.13011 10.208153,17.39173 3.34375,24 -10.703205,10.30384 -6.124144,19.34772 -2.063621,23.07541 0,0 -16.825481,-4.92207 -3.316804,-22.83402 5.115247,-6.78261 -1.725255,-19.11178 -10.487087,-17.76291 4.526484,-3.3283 9.31616,-5.23421 12.523762,-6.47848 z M -96,389.34375 c 3.349039,6.48058 -5.80905,12.7184 -13.5625,10.6875 3.59456,-5.45841 7.17217,-9.62245 13.5625,-10.6875 z m -3.28125,2.28125 c -0.93337,0.009 -2.08278,0.50309 -3.03125,1.40625 -1.51756,1.44506 -2.00642,3.38529 -1.09375,4.34375 0.91267,0.95846 2.88869,0.57006 4.40625,-0.875 1.517557,-1.44506 2.006417,-3.38529 1.09375,-4.34375 -0.34225,-0.35942 -0.814977,-0.5364 -1.375,-0.53125 z" id="karl" />
+  </g>
+  <path d="m 59.240185,44.170904 2.34937,3.58182 -1.42503,3.04263 -3.15817,-4.15954 z" id="karl-arm" />
+  <path d="m 67.692239,59.713406 c -5.5302,-5.18002 -9.82994,-12.48058 -13.3685,-17.839648 -2.04943,-3.103798 -7.67551,12.310518 -7.67551,12.310518 l 14.11218,10.14676 z" id="logo-k-fill" />
+</svg>
diff --git a/public/img/korap-logo.svg b/public/img/korap-logo.svg
new file mode 100644
index 0000000..e48720a
--- /dev/null
+++ b/public/img/korap-logo.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 77.146042 18.528435"
+   height="5.229136mm"
+   width="21.772327mm">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-64.629793,17.30505)"
+     id="layer1">
+    <path
+       d="M 11.404297,0 C 9.0672359,0 5.6412381,3.2296125 5.1738281,11.570312 c 0.031159,-0.664739 -3.8024726,-0.705595 -4.1660156,0.02149 -0.311607,0.61282 1.5993476,0.852532 1.9628906,1.195312 -0.436251,0.52962 -0.9562407,0.705253 -1.5898437,0.539063 -0.166189,-0.0414 -0.3416225,-0.06177 -0.50781252,-0.07227 -0.38431801,-0.03116 -0.70739225,0.0942 -0.83203126,0.478516 -0.13503099,0.38431 0.07448738,0.715908 0.39648438,0.861328 0.415477,0.19736 0.8717214,0.342531 1.3183594,0.394531 0.550508,0.0625 1.1116014,0.0098 1.6621094,0.0098 -0.4258651,1.0283 -1.1527133,1.465008 -2.1914063,1.298828 -0.519347,-0.08311 -0.93475012,0.124901 -1.11132812,0.550781 -0.18696401,0.46739 -0.07350113,1.007908 0.40429687,1.267578 0.394703,0.21813 0.87172135,0.374266 1.31835935,0.384766 2.015065,0.02075 3.7198371,-0.821305 5.2363282,-2.078125 1.963132,-1.62036 2.9189721,-1.63074 4.8613282,0 1.28798,1.08025 2.732001,1.807985 4.404297,2.046875 0.695923,0.10387 1.391788,0.10315 2.02539,-0.25 0.508951,-0.29084 0.715641,-0.830169 0.539063,-1.318359 -0.186966,-0.49858 -0.601394,-0.696876 -1.224609,-0.572266 -0.903662,0.18697 -1.869764,-0.456509 -2.087891,-1.412109 0.135031,0.0209 0.249026,0.04223 0.363281,0.05273 0.882888,0.06231 1.776379,0.176304 2.576172,-0.322266 0.321996,-0.19735 0.570577,-0.488837 0.435547,-0.904296 -0.13503,-0.405221 -0.488106,-0.509616 -0.882813,-0.478516 -0.186964,0.0104 -0.373581,0.06265 -0.560546,0.09375 -0.612829,0.10387 -1.111776,-0.07183 -1.496094,-0.601563 0.415477,-0.29084 2.10946,-0.291386 1.912109,-0.873047 -0.228512,-0.675139 -3.90607,-0.935005 -3.84375,-0.291015 C 13.2232,2.9706469 13.876388,0 11.404297,0 Z m 13.712891,2.8710938 0,12.9902342 3.845703,0 0,-12.9902342 -3.845703,0 z m 7.578124,0 -3.621093,6.0664062 3.546875,6.923828 4.367187,0 -4.011719,-7.2226561 3.675782,-5.7675781 -3.957032,0 z m 25.419922,0 -3.789062,12.9902342 4.013672,0 0.484375,-2.519531 3.080078,0 0.503906,2.519531 4.068359,0 -3.769531,-12.9902342 -4.591797,0 z m 8.708985,0 0,12.9902342 3.845703,0 0,-4.050781 1.267578,0 c 1.592813,0 2.855769,-0.391819 3.789062,-1.175781 0.945734,-0.7839631 1.419922,-1.9156661 1.419922,-3.3964848 0,-1.4310426 -0.498627,-2.5138595 -1.49414,-3.2480468 C 74.669284,3.243603 73.289239,2.8710938 71.509766,2.8710938 l -4.685547,0 z m -58.6699221,2.53125 c 0.363544,0 0.6640625,0.3005124 0.6640625,0.6640624 0,0.36353 -0.3005185,0.6640626 -0.6640625,0.6640626 -0.363542,0 -0.6640625,-0.3005325 -0.6640625,-0.6640626 0,-0.36355 0.3005205,-0.6640624 0.6640625,-0.6640624 z m 2.5859371,0 c 0.373929,0 0.664063,0.3005124 0.664063,0.6640624 0,0.36353 -0.300521,0.6640626 -0.664063,0.6640626 -0.363543,0 -0.664062,-0.3005325 -0.664062,-0.6640626 0,-0.36355 0.300519,-0.6640624 0.664062,-0.6640624 z M 41.6875,5.5214844 c -1.045287,0 -1.955042,0.2168091 -2.726562,0.6523437 -0.77152,0.4355347 -1.367929,1.0583371 -1.791016,1.8671875 -0.410647,0.8088505 -0.617188,1.7481881 -0.617188,2.8183594 0,1.717252 0.454882,3.043274 1.363282,3.976563 0.920846,0.933288 2.178671,1.398437 3.771484,1.398437 1.04528,0 1.953089,-0.216809 2.724609,-0.652344 0.77152,-0.435535 1.362791,-1.058337 1.773438,-1.867187 0.423087,-0.808851 0.634765,-1.748188 0.634765,-2.81836 0,-1.7172513 -0.461972,-3.0432732 -1.382812,-3.9765621 -0.9084,-0.9332887 -2.157187,-1.3984375 -3.75,-1.3984375 z m 28.982422,0.017578 0.783203,0 c 1.182167,0 1.773437,0.5668281 1.773437,1.6992187 0,1.2443854 -0.554609,1.8671876 -1.662109,1.8671876 l -0.894531,0 0,-3.5664063 z m -10.314453,0.019531 1.007812,5.0957032 -1.998047,0 0.990235,-5.0957032 z m -6.386719,0.017578 c -0.547533,0 -1.051299,0.1994529 -1.511719,0.5976562 -0.460426,0.3982034 -0.796266,0.9283667 -1.007812,1.5878907 l -0.298828,-1.8671876 -3.230469,0 0,9.9667968 3.697266,0 0,-4.535156 c 0.161766,-0.721744 0.373445,-1.264128 0.634765,-1.6250001 0.273767,-0.3608718 0.682942,-0.5410157 1.230469,-0.5410157 0.273767,0 0.580029,0.05084 0.916016,0.1503907 L 54.976562,5.7441406 C 54.628136,5.632146 54.29229,5.5761719 53.96875,5.5761719 Z M 41.6875,8.171875 c 0.47286,0 0.813844,0.2116746 1.025391,0.6347656 0.211546,0.4106472 0.318359,1.1067794 0.318359,2.0898434 0,0.945733 -0.106813,1.629644 -0.318359,2.052735 -0.211547,0.423091 -0.552531,0.634765 -1.025391,0.634765 -0.472867,0 -0.815797,-0.204587 -1.027344,-0.615234 -0.211546,-0.423091 -0.318359,-1.126311 -0.318359,-2.109375 0,-0.9457328 0.106813,-1.6296434 0.318359,-2.0527344 C 40.871703,8.3835496 41.214633,8.171875 41.6875,8.171875 Z"
+       style="fill:#ffffff;fill-opacity:1"
+       transform="translate(64.629793,-17.30505)"
+       id="path4230" />
+  </g>
+</svg>
diff --git a/public/img/korap-overview-active.svg b/public/img/korap-overview-active.svg
new file mode 100644
index 0000000..a2e8bc5
--- /dev/null
+++ b/public/img/korap-overview-active.svg
@@ -0,0 +1,159 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="100%"
+     height="100%"
+     viewBox="0 0 1274.406 357.25"
+     version="1.2">
+  <defs>
+    <style type="text/css">
+<![CDATA[
+/* IDS-Green */
+#kalamar-logo {
+  fill: rgb(99, 111, 7);
+  stroke: none;
+}
+.green {
+  fill: #9bad0b;
+  stroke: rgb(99, 111, 7);
+  stroke-width: 5;
+}
+.arrow.green {
+  stroke: #9bad0b;
+}
+
+/* IDS-Pink */
+.pink {
+  fill: rgb(193, 0, 43);
+  stroke: #650016;
+  stroke-width: 5;
+}
+.pink.dark {
+  fill: #650016;
+  stroke: none;
+}
+.arrow.red {
+  stroke: rgb(193, 0, 43);
+}
+
+/* IDS-Blue */
+#karang-logo {
+  fill: #0b4d94;
+}
+#krill-logo {
+  fill: #0b4d94;
+  stroke: none;
+}
+.blue {
+  stroke: #0b4d94;
+  fill: rgb(0,158,224);
+  stroke-width: 5;
+}
+
+/* IDS-Orange */
+.orange {
+  fill: rgb(246,168, 0);
+  stroke: #e55d00;
+  stroke-width: 5; 
+}
+.orange.dark {
+  fill: #e55d00;
+  stroke: none;
+}
+.arrow.orange {
+  stroke: rgb(246,168, 0);
+}
+
+/* IDS-Grey */
+.grey {
+  fill: rgb(135,136,138); /* #8e8a6c; */
+  stroke: #4d4a3a;
+  stroke-width: 5;
+  stroke-linecap: round;
+  stroke-linejoin: round;
+}
+.grey.dark {
+  fill: #4d4a3a;
+}
+.arrow.grey {
+  stroke: rgb(135,136,138);
+}
+
+.connector {
+  fill:#4d4a3a;
+  stroke: none;
+}
+
+tspan {
+  text-align: start;
+  line-height: 125%;
+  font-size: 39.929px;
+  letter-spacing: 0;
+  word-spacing: 0;
+  fill: #fff;
+  font-family: Arial;
+}
+
+.white {
+  stroke: none;
+  fill: #fff;
+}
+
+.arrow {
+  fill: #fff;
+  stroke-width: 4;
+}
+
+]]>
+    </style>
+  </defs>
+  <g id="korap">
+    <a id="kalamar" xlink:href="doc/development/kalamar" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="2.493" y="3.33" class="green"/>
+      <text x="157.799" y="102.481"><tspan>Kalamar</tspan></text>
+      <path d="M35.855 141.43c6.05-36.58 24.68-50.103 37.84-54.99 2.096-8.49 10.88-15.632 15.788-18.784 1.124-10.84.192-16.933-12.25-14.972 7.702-18.85 16.25-8.35 26.822 2.066 8.034-14.17 21.118-22.105 36.333-24.932-17.902 23.507-21.82 30.025 7.64 26.133-21.703 16.495-16.286 18.607-12.14 30.796 5.954 15.374-16.355 16.995-1.15 33.21-19.586-7.935-12.065-10.84-7.85-26.36-2.25-7.68-7-5.65-15.228-6.02-4.762 9.83-9.094 10.66-17.374 14.044-4.01 6.943-7.27 11.354-14.476 13.387 0 0 2.836 5.245 2.195 17.743-14.784 5.32-21.81-2.356-46.15 8.68z" class="white"/>
+      <path d="M146.007 26.538c-7.497.793-16 3.113-22.897 6.214-9.934 3.558-13.458 9.19-19.424 18.347-8.728-16.29-32.82-20.74-32.73 17.074 15.318-29.15 19.965-2.347 14.535.414-5.374 2.732-10.526 10.306-14.778 16.07-3.78 2.078-8.807 4.633-15.022 11.404-9.504 1.32-17.54-.046-19.84 3.963-1.503 3.824-.654 22.403-1.052 27.84-.43 5.884-3.503 15.826-3.45 21.746.036 3.864 10.473-9.804 20.403-10.91 11.216-1.247 15.977-.528 24.44-1.442 2.688-.302 5.174-.87 6.825-2.52 3.544-3.753.137-16.08-.235-18.82 6.952-3.146 10.176-8.522 13.102-13.08 2.957-.75 12.09-2.78 16.44-12.794 5.707-.49 18.973-3.057 8.904 12.892-5.102 8.08 2.467 18.623 16.292 18.592 1.54 0-14.064-10.596-1.174-21.258 4.788-3.96.898-19.498-1.42-21.944 6.7-2.763 13.138-6.12 18.81-9.093-4.458-2.588-9.71-3.802-14.405-3.774 4.19-2.677 13.245-9.032 15.85-12.6-9.093-.676-15.097-.03-21.747 2.202 7.4-5.407 6.333-12.03 14.653-18.787-6.948 1.04-10.54 3.038-14.29 5.644 4.774-5.358 8.93-8.685 12.21-15.382zm-9.74 6.056c-8.686 8.767-10.94 8.793-14.527 13.49-4.74 6.206-4.353 11.33-5.138 14.262-1.39 5.2-6.04 3.804-10.225 12.158 11.103-4.866 19.323-9.753 36.205-14.384-7.406 6.835-19.104 13.42-19.74 14.286-1.71 2.496-4.263 7.883-8.735 11.987 1.886-5.796 1.343-10.326.196-9.296-4.344 3.903-3.61 15.104-9.908 19.4-15.462 10.55-17.81 1.128-19.937 2.764-3.094 2.382 4.067 4.728 6.923 5.554-9.75 17.674-12-.793-13.747.734-1.835 2.736-3.867 8.074 1.297 21.16 3.75 9.507-4.423 7.346-22.457 7.853-4.96.14-5.8.506-13.21 2.667-2.88.84-5.036.27-3.205-5.773 4.87-16.822 20.067-40.013 36.94-40.535 4.236.015-2.235-3.47-.906-5.48.895-1.344 1.323-2.41 3.816-5.31 2.505-2.91 5.62-5.665 8.366-6.604 7.76-2.653 12.666-8.223 16.39-13.895 3.725-5.672 7.642-11.726 10.796-15.313 6.575-5.582 14.05-8.726 20.807-9.723zm-36.31 22.83c-1.667 2.398-3.795 4.293-6.91 7.04-.55-7.328-3.32-16.563-11.962-12.72 4.977-6.615 13.128-4.316 18.873 5.68zm-9.138 18.72c-3.163.093-10.674 5.254-8.857 5.724 2.7.697 4.585-2.4 5.21-1.566.626.834-3.122 4.79-1.663 6.458 1.46 1.668 8.236-8.55 6.36-10.323-.234-.222-.6-.307-1.05-.294zm10.787 4.452c-9.528-.132-16.555 11.914-12.77 18.37 1.203 2.053 2.593-2.934 2.593-2.934s2.44 2.768 10.96-1.86c6.577-3.573 3.13-9.393 3.13-9.393s3.69-1.99.294-3.328c-1.438-.567-2.846-.838-4.207-.856zm27.985 1.247c1.772 1.668 7.99 13.615 2.618 18.788-8.38 8.067-4.794 15.146-1.616 18.064 0 0-13.17-3.853-2.596-17.874 4.004-5.31-1.35-14.96-8.21-13.905 3.544-2.606 7.293-4.098 9.804-5.072zm-26.59 3.547c2.62 5.073-4.548 9.956-10.618 8.367C95.198 87.484 98 84.224 103 83.39zm-2.57 1.786c-.73.01-1.63.394-2.372 1.1-1.188 1.132-1.57 2.65-.857 3.4.715.75 2.262.447 3.45-.684 1.188-1.13 1.57-2.65.856-3.4-.27-.28-.64-.42-1.078-.416z" id="kalamar-logo"/>
+    </a>
+    <a id="api" xlink:href="doc/api" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="2.493" y="187.33" class="grey"/>
+      <text x="157.799" y="282.481"><tspan>API</tspan></text>
+    </a>
+    <a xlink:href="doc/development/kustvakt" id="kustvakt" target="_parent">
+      <path d="M419.03 3.317c-15.816 0-28.53 12.746-28.53 28.563v293.593c0 15.817 12.714 28.563 28.53 28.563h21.126c15.817 0 28.563-12.746 28.563-28.563V242.63l.374-74.407c.05-9.887 7.956-17.844 17.844-17.844h174.5c9.678 0 17.485 7.623 17.812 17.218v157.875c0 15.817 12.714 28.563 28.53 28.563h21.126c14.43 0 26.31-10.597 28.282-24.47.47-2.16.718-4.41.718-6.718V34.536c0-2.296-.25-4.535-.718-6.688-1.945-13.902-13.83-24.53-28.282-24.53H419.032z" class="pink" />
+      <text x="540.648" y="83.901"><tspan>Kustvakt</tspan></text>
+      <path d="M421.486 94.5l-4.273-12.82 27.78-5.698-3.207-16.74 21.37-13.888c14.242-4.677 14.64-5.306 27.778-1.07l.712 13.535 4.63-.714 13.89 21.37s2.492 19.586-27.067 22.792c-29.56-1.07-24.22-18.876-61.614-6.767z" class="white"/>
+      <path d="M474.336 31.793c-4.61.065-33.295 1.987-33.88 3.156-.623 1.245-1.13 1.908-.922 3.154.208 1.247 8.35 2.802 8.35 2.802s.775 7.55 1.33 9.555c-1.138.873-9.108 4.803-10.743 7.075-.44 2.91.535 13.975 1.366 15.637-8.766 1.434-21.542 3.405-27.214 6.383.106 5.175 1.9 9.942 2.907 13.988-3.376-.317-4.45-2.058-4.202-6.808-5.247 3.297-3.98 11.41 2.358 12.18 6.61.802 19.347-4.987 28.632-5.195 16.576-.37 19.48 11.477 39.358 11.418 19.954-.06 25.055-18.45 44.925-11.932-3.673-7.218-9.023-6.794-17.39-3.386 1.453-1.87 6.827-8.102 17-5.266-5.316-6.664-10.01-5.484-11.877-3.58-.025-6.464-7.23-12.808-8.705-14.787-3.336-4.477-5.427-11.384-11.772-11.08.213-1.4.185-9.358-.23-11.436-.416-2.076-9.44-4.694-13.03-4.786-2.13-.055-5.23.975-5.23.975l.105-1.42c.008-.028 3.713-.544 5.054-1.258-.663-3.333-4.356-5.164-5.603-5.37-.076-.014-.276-.023-.584-.02zm-5 7.357l.143 1.773c-3.556.667-7.36 1.31-8.76 2.766l-.673-3.192c.142 0 9.29-1.348 9.29-1.348zm-14.43 2.02s.785 2.83 1.205 5l-3.19 2.093c-.106-.422-.85-6.702-.85-6.702zm47.283 2.076c-2.242.12-4.13 2.1-4.24 5.53 1.616-1.48 6.4-5.86 5.054 5.444 1.884-2.02 9.686-8.008 11.772 0 2.692-2.826 3.185-10.658-6.79-6.648-1.565-3.082-3.82-4.43-5.797-4.326zm-20 .053c2.38.42 5.192 1.274 6.312 2.534l.16 5.017-6.348-.637s.156-5.514-.124-6.914zm-5.017.885c0 1.4.18 4.946.32 6.276-1.82.21-9.033 2.282-10.993 3.122-.49-1.26-1.347-5.886-1.347-5.886 3.01-1.4 7.61-3.23 12.02-3.51zm-18.49 7.996c.056-.01.09 0 .087.02-.28 3.218 1.185 12.413 2.305 16.682-2.94.07-7.955 2-14.254 3.12-1.68-4.2-1.7-11.435-1.63-12.765 5.446-3.543 12.636-6.922 13.492-7.056zm25.404 5.16c1.322-.032 2.766.042 4.38.248-4.734 4.092-15.655 7.04-15.655 7.04l-.798-3.955c3.095-1.13 6.348-3.193 12.073-3.333zm11.1 1.79c1.488.17 1.198 13.14-.39 12.446-2.182-.95-1.344-11.747.247-12.427.05-.024.094-.025.142-.02zm12.267 6.33c.108 2.272 4.238 5.745 5.088 5.017 4.418-3.78 9.092 1.725 15.354-1.24-6.767-5.864-19.734-4.477-20.442-3.777zm-93.095-.195c-1.56-.038-3.468.465-6.33 1.932-1.372 2.562-1.277 8.198.177 10.69 12-8.367 16.07-.77 26.736-9.644-14.414 2.07-15.907-2.865-20.584-2.978zm58.594 1.844c.362 0 .713.04 1.063.088l-.744 3.936c-.222-.03-.444-.053-.674-.053-1.695 0-3.193.885-4.167 2.252-1.252-1.014-1.766-1.428-2.553-2.074 1.54-2.506 4.128-4.15 7.074-4.15zm5.46 2.18c1.876 1.728 3.074 4.333 3.085 7.25l-3.6.02c-.1-1.596-.77-3.013-1.79-4.008l2.304-3.262zm11.648 3.03c1.382 12.727-10.36 23.413-17.89 23.51-14.956.192-13.33-14.912-48.93-5.957-1.61-2.45-2.553-5.07-2.553-5.07 17.544-3.65 28.977-5.58 41.077-6.95 3.11 14.862 23.083 14.32 22.622-4.433 2.764-.71 5.672-1.1 5.672-1.1zm26.398 0c-.81.03-1.522.347-2.322 1.26 0 0 2.112 3.527 3.21 3.173 2.234-.72 3.952.01 5.37.07 1.47.067 2.396-2.238 2.447-3.633-4.678.416-6.923-.934-8.705-.87zm-17.57.604c4.037 2.252 7.33 5.27 9.114 8.084-2.494 7.25-3.38 13.403-18.58 15.39 0 0 10.124-16.154 9.467-23.474zm-26.61 1.968c1.162 0 2.1.905 2.25 2.074l3.388-.018c0-.125-.01-.25-.018-.372h3.6c0 .297-.013.596-.037.886-1.11-.07-2.23-.157-3.563-.248.003-.083.018-.164.018-.248h-3.387c.015.106.037.21.037.32 0 1.322-1.02 2.392-2.287 2.392-1.268 0-2.305-1.07-2.305-2.393 0-1.323 1.037-2.393 2.305-2.393zm-7.854.904c.988.218 1.497.337 2.89.638-.014.176-.036.353-.036.532 0 1.83.75 3.46 1.933 4.54l-1.543 2.516c-1.99-1.737-3.28-4.424-3.28-7.446 0-.262.017-.524.036-.78zm12.765 4.13l3.263 1.206c-1.45 2.937-4.264 4.93-7.5 4.93-.703 0-1.384-.107-2.038-.285l.638-3.05c.34.077.685.125 1.046.125 1.957 0 3.668-1.18 4.59-2.925zm42.64 14.308c-7.996-.057-19.325 6.024-20.584 17.977 0 0 11.35-17.607 26.026-13.136.33-1.45.23-3.383-.62-3.812-1.326-.67-2.978-1.015-4.823-1.028zm-78.008 1.418c-17.992.063-31.386 12.995-30.99 16.453.276 2.417 1.96 4.22 9.378 1.737-4.386-12.545 23.367-18.154 23.367-18.154-.59-.025-1.175-.037-1.755-.035zm5.495 2.465c-4.437.173-9.626 2.718-17.09 9.786 44.042-18.586 17.78 23.5 61.767-.886-26.914 5.67-33.337-9.344-44.677-8.9z" class="pink dark"/>
+    </a>
+    <a id="koral" xlink:href="doc/development/koral" target="_parent">
+      <rect width="165.736" height="181.714" rx="14" ry="14" x="491.543" y="171.852" class="orange"/>
+      <text x="526" y="322.649"><tspan>Koral</tspan></text>
+      <path d="M554.844 194.53c-.31.036-.518.18-.594.407-.8 2.4-4.594 11.75-4.594 11.75s-5.75-6.555-7.156-8.343c-1.405-1.79-4.625 3.118-3.813 5.53l8.72 7.407-2.813 4.22s-4.42-5.627-7.032-5.75c0 0-1.788.402-2.28 4.22l7 7.81c1.304 2.217 1.905 8.407 1.905 8.407s-4.067-3.952-6.75-4.718c-2.682-.768-3.258 5.18-1.78 7.25l8.968 6.593 1.594 9.03c-5.97 2.116-10.764 6.057-10.25 11.376.757 7.862 28.617 12.375 31.25-5.564.844-5.763-5.676-7.998-12.97-7.47l-.375-9.03 12.063-7.72 7.375 11.783-.032.28 6.345 10.313-1.594 14 12.72-9.688 15.156 8.03-5.062-14.03 6.875-3.72-10.564-5.968.782-13.156-12.97 13.314-13.687-16.906 11.908-9.094c6.692 3.28 11.128 8.27 17.875-2.844-5.147.123-13.407-1.344-13.407-1.344s2.502-3.5 2.625-6.062c-3.584-4.818-7.39-8.62-14.436-5.563.05 1.08 5.656 7.407 5.656 7.407l-11.03 9.75c.048-6.352 1.78-12.125 1.78-12.125s-.454-3.875-3.187-3.062c-2.093 1.55-4.532 9.563-4.532 9.563l-4.31-3s2.79-8.273 2.124-10.563c0 0-4.998-2.615-7.156-2.72-.125-.005-.24-.01-.344 0zm.78 21.564l8.438 1.594-.093 4.375-11.44 6.093-.874-7.03 3.97-5.032z" class="white" />
+      <path d="M555.573 193.407c-1.805-.013-3.174.516-3.164 1.775.04 5.13-3.26 10.364-3.26 10.364-3.38-3.177-4.196-6.494-6.717-7.974-2.165-1.272-4.735 3.352-4.584 5.488.156 2.228 3.827 5.82 7.962 9.503l-.893 1.538c-5.195-5.546-8.857-7.487-10.72-.967-.808 2.83 5.898 6.03 7.333 7.957 1.27 1.706 1.9 7.733 1.9 7.733s-6.502-7.244-8.167-2.744c-2.633 7.116-.16 7.125 8.233 14.785.297 1.962.73 6.24 1.683 10.428-10.913 4.447-7.744 12.892 5.354 11.106-2.452-.502-12.61-3.62-3.94-6.006.134.296.28.56.42.775 2.25 3.46 7.068 1.506 7.943.612 1.68-1.717 1.032-10.574.065-19.015 5.156-2.633 9.83-7.505 9.83-7.505 1.158 2.258 5.11 7.175 7.552 9.5-1.48-.248-2.078-.407-2.63-.29-3.38.705 8.212 11.916 8.212 11.916s-7.915 20.72-.646 17.287c3.48-1.643 13.79-8.747 13.79-8.747s15.462 8.322 17.66 8.322c3.224 0-7.458-18.072-7.458-18.072s10.096-3.108 8.684-5.553c-1.632-2.828-11.01-6.037-11.01-6.037s2.77-14.655-.71-14.593c-.11 0-.23.03-.354.065-3.174.85-11.68 10.813-13.697 13.84-2.536-3.564-9.215-9.904-11.004-12.518 2.546-2.384 7.135-6.804 10.124-9.827 2.184.79 7.05 4.05 10.138 3.552 3.508-.568 7.35-4.27 8.458-8.104.347-1.2-7.687.532-13.01-1.743.88-1.165 1.668-2.354 2.324-3.52 1.556-2.763-5.497-9.344-7.07-10.524-2.062-1.546-9.046.637-10.07 2.604-1.02 1.966 5.744 8.63 5.744 8.63l-8.726 7.87s.292-7.15 2.14-11.2c1.47-3.22-3.83-5.096-5.72-4.545-1.887.55-4.134 4.37-4.685 9.563-.884-.557-1.053-.972-1.864-1.536 1.992-4.856 3.186-9.3 2.518-10.87-.773-1.815-4.967-3.303-7.975-3.325zm1.743 3.164c1.376.1 2.842 1.163 2.842 1.163 0 1.075-1.184 4.11-2.81 7.716-.254-.027-.528-.033-.84-.033-6.005 0-6.016 6.877-3.937 9.717-1.303 2.412-2.558 4.57-3.55 6.005 0 0 5.96 33.23 3.744 32.67-1.99-.5-3.758-8.87-5.165-17.206-1.062 2.4-8.2-3.067-8.2-3.067 1.013-1.815 1.256-3.37 1.096-4.81 0 0 5.116 2.925 6.65 5.133-1.028-6.418-1.834-12.303-2.29-13.883 2.52-5.144 3.392-6.89 3.392-6.89 1.517-.326 2.392-1.512 2.702-2.748-1.687-.18-7.14-4.346-8.59-6.572.64-.74 1.088-1.367 1.424-2.227 2.112 2.227 5.985 5.77 7.195 7.695.018-.596.24-1.032.073-1.784 0 0 4.468-8.268 4.972-10.588.378-.253.833-.324 1.29-.29zm-14.568 2.995c1.246 1.054-2.44 5.484-3.164 3.874-.828-1.84 1.685-5.127 3.164-3.875zm39.654 1.59c.416-.01.87-.01 1.388 0 2.91 1.967 3.882 2.923 4.197 4.81-4.7 5.134-11.1 10.903-16.41 15.875-.48-1.65-.646-3.01-.677-4.132 3.528-3.298 8.95-7.51 12.89-12.13-3.056-2.376-7.633-4.305-1.388-4.423zm-12.53.776c.94.024 1.7.604 1.387 1.745-3.5 12.89-3.63 20.662 6.94 32.956 1.49 2.327-4.062.636-5.257-1.262-1.225-1.947-5.304-6.293-6.337-9.234-4.08 3.202-6.81 5.736-12.292 7.984l-.258-4.552c4.938-2.01 7.342-4.16 11.452-7.306-.457-2.18-.67-4.562-.58-7.135-2.94-.067-5.448-1.766-5.448-1.766.698-.865 1.044-1.747 1.065-2.713 0 0 1.956 1.09 4.576 1.96.295-2.544 1.24-6.208 2.297-9.094.393-1.073 1.513-1.605 2.454-1.582zm-13.194 5.204c4.14.846.69 7.882-1.454 7.292-3.08-.847-2.348-8.07 1.454-7.292zm-18.345 3.836c1.786-.095 5.648 4.85 4.1 4.745-3.02-.2-5.235-1.504-4.907-3.745.1-.68.395-.978.807-1zm52.818 2.39c3.117.282 5.155.58 7.62.354-2.578 4.76-11.19 3.78-7.62-.355zm-34.802 3.937c2.133.79 2.565 1.577 6.222 2.186l.162 2.454-9.16 5.433c-.225-1.757-.395-3.285-.452-4.132 1.044-1.806 2.144-3.84 3.228-5.94zm-17.982 9.072c2.91 1.02.24 8.643-1.55 6.52-1.724-2.043-.922-7.388 1.55-6.52zM597.01 230l-2.94 12.687s10.086 3.81 10.365 4.165c-.774 0-5.876 2.937-5.876 2.937l3.56 11.462-12.698-8.977-9.835 10.647 2.57-12.035-6.735-8.107 12.322-.093zm-3.68 8.07l-4.1 6.812-6.2.58 4.197 2.52-2.26 4.842c.132-.066 4.94-4.584 4.94-4.584l4.52 3.422-2.164-4.39 5.78-.68s-6.07-1.383-6.038-1.548c.034-.166 1.324-6.974 1.324-6.974zm-36.593 9.44c.192 1.757.33 2.61.192 4.396 0 0 10.436 1.333 4.422 10.202 5.283-3.395 7.76-13.052-4.615-14.6zm0 5.88c.023 1.875-.615 3.908-.615 3.908 2.793 1.347-1.17 4.014-3.487 4.23 8.02 2.745 10.99-7.388 4.1-8.137z" class="orange dark"/>
+    </a>
+    <a id="krill" xlink:href="doc/development/krill" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="778.493" y="3.33" class="blue"/>
+      <text x="941.799" y="98.481"><tspan>Krill</tspan></text>
+      <path d="M874.53 36.53c-3.008-.08-9.357 1.69-13.31 2 9.83 8.528 12.984.177 13.31-2zm-14.686 4.345c-16.103.196-26.953 13.71-33.938 26.688-6.01 12.365-10.007 26.23-7.375 34.718 7.824-17.475 21.11-38.202 36.25-45 14.442-8.23 18.62-9.34 8.345-16.25-1.12-.108-2.208-.168-3.28-.155zM914.062 75c-18.062 27.692-42.965 36.107-51.468 38-2.37.528-4.45 1.753-6.25 3.313.853-1.61 1.334-2.86.75-2.75-1.396.26-12.12 3.7-14.657 6.874l8.375 3.063c-1.094 2.158-1.632 4.05-1.53 4.938 0 0 10.43.47 25.155-2.907 19.59-4.492 39.905-36.545 39.625-50.53z" class="white"/>
+      <path d="M883.875 15.625c10.34 7.66 5.993 16.067.97 20.25 8.62-15.7-12.13-15.895-17.876-8.72 10.382-4.038 23.293-3.013 14.25 9.69-.48-.25-.99-.464-1.658-.595-1.374-.27-3.038-.316-4.312-.25-1.274.065-2.22.25-2.22.25 1.528 2.647-4.105 9.86-10.405 1.813-51.3 3.396-48.854 77.253-45.656 70.656 2.415-4.986 4.825-9.706 7.28-14.157-1.09-1.107-2.634-2.356-4.594-2.75.125-.585.206-.983.375-1.5 1.378-.065 4.158.606 5.97 1.124.71-1.24 1.41-2.437 2.125-3.624-1.65-1.36-4.54-3.664-6.406-4.188.308-.83.717-2.25.717-2.25 1.694.618 5.296 2.604 7.375 3.75.54-.858 1.116-1.736 1.657-2.563-1.34-1.25-4.643-4.186-7.376-5.843l.937-2.314c2.624 1.124 6.21 3.38 8.595 4.938.986-1.413 1.972-2.764 2.97-4.063-2.174-1.826-6.215-5.015-9.158-6.124l.938-1.75c3.772 1.012 8.24 3.65 10.438 5.063 1.436-1.728 2.91-3.317 4.375-4.782-1.625-1.63-5.252-4.88-10.25-7.188l1.75-2.156c5.023 2.052 9.53 5.24 11.406 6.625.954-.824 1.938-1.61 2.906-2.314-.68-1.584-2.7-5.766-7.438-11.093l1.688-1.25c4.363 3.878 7.82 7.594 9.78 9.78 1.51-.807 3.05-1.473 4.595-1.968 14.77-4.73 23.273-11.745 25.063-16.594 7.267-1.202 20.86-2.004 24.875 2.19 3 3.132-8.354 5.968-8.344 11.593.004 3.18 7.263 3.363 9.092 3.343-.833-.062-2.817-.55-4.937-2.937-2.178-2.454 9.984-9.262 7.28-13.22-3.316-4.858-13.554-5.22-21.405-4.688 5.873-2.1 13.19-5.563 19.656-4.124 5.714 1.27 3.76 6.53 8.625 9.5 3.484 2.124 7.033-5.282 7.033-5.282-8.768 6.79-5.09-5.754-13.5-7.593-9.403-2.057-16.22 1.597-21.375 3.406 3.37-4.88 6.384-13.206-5.813-18.095zm-15.188 19.47c-.233.016-.478.042-.718.093-1.925.408-3.25 1.808-2.97 3.124.28 1.317 2.045 2.065 3.97 1.657 1.923-.41 3.247-1.81 2.967-3.126-.244-1.152-1.615-1.865-3.25-1.75zm16.782 6.843c-1.476-.038-2.717.734-3.126 2.218-2.06 7.478 6.437-.238 9.656 14.344 2.624-11.23-2.762-16.468-6.53-16.563zm-24.75.718c15.786 4.29-6.762 11.918-14.283 5.563 4.717-3.285 8.142-4.51 14.282-5.564zm19.624 5.032c-1.33.04-2.433.76-2.907 2.124-2.68 7.73 6.772.18 9.157 15.75 3.688-12.145-2.258-18-6.25-17.874zm-7.72 5.156c-1.39.098-2.527.896-2.968 2.343-2.496 8.2 7.094-.048 10.22 16.157 3.37-12.865-3.077-18.793-7.25-18.5zm-10.155 4.78c-1.492.118-2.73.977-3.19 2.532-2.598 8.813 7.627-.152 11.126 17.188 3.495-13.82-3.466-20.072-7.937-19.72zm51.81 2.688c-6.13 31.07-30.51 44.957-60.655 53.532 2.796 5.117-5.764 10.07-8.313 3.406-4.077 2.383-6.927 5.625-8.718 9.344-1.266-.595-2.552-.954-3.813-1.125-3.48-4.884 3.316-13.07 15.158-12.782-2.088-1.933-12.493-1.004-16.782 4.874-1.274 1.748-1.844 5.336-1.218 7.844-14.778 1.298-18.61 16.086-7.563 14.844-8.842-2.054-4.16-11.566 9-12.53.427.32.955.532 1.594.718-6.957 4.104-10.416 12.8-8.783 16.843 1.377 3.41 8.076 8.026 14.438 5.532-7.714-.47-11.806-2.614-12.72-6.5-.955-4.07 3.802-11.222 8.69-14.437-.904 1.19-.403 1.835-.283 4.625.12 2.765 5.563 5.644 3.782 8.688-2.813 4.806 3.497 7.646 8.75 6.125-6.722-1.19-8.89-1.787-6.032-7.938 1.496-3.216-6.22-6.45-2.375-12 16.047 5.512 30.784 2.805 43-4.188-1.922-2.87-5.613-8.636-7.093-12.843l2.375-1c2.698 4.826 6.402 9.488 8.217 11.656 2.19-1.458 4.315-3.046 6.313-4.75-1.54-1.962-4.307-5.912-6.188-11.063l2.188-1.28c1.384 3.555 4.66 7.756 6.563 10.03 1.678-1.578 3.265-3.223 4.78-4.937-1.303-1.502-3.716-4.475-5.937-8.656l1.657-1.438c2.852 4.352 5.25 6.403 6.625 7.344 1.49-1.85 2.862-3.778 4.156-5.72-.8-.572-2.465-1.914-5.407-6.28l1.625-1.813c2.73 3.448 4.723 4.635 5.72 5.063 1.014-1.684 1.952-3.386 2.812-5.094-.937-.52-2.9-1.806-4.813-4.5l1.408-2.03c2.27 2.673 4.257 3.253 4.843 3.374.93-2.092 1.728-4.186 2.408-6.25-.783-.157-2.056-.71-4.282-2.28l.875-1.782c1.612 1.084 3.066 1.732 4.064 2.124 2.572-8.79 2.74-16.956-.063-22.75zm-64.405 3.75c-.57.038-1.17.308-1.72.844-1.268 1.244 3.377 2.123 3.564 7 2.793-3.976.626-8.004-1.845-7.844zm-6.406 6.594c-.435.01-.91.18-1.376.5-1.3.895 2.612 2.36 2.03 6.656 3.17-3.172 1.685-7.207-.655-7.156zm-4.908 7.063c-.41.03-.852.17-1.28.5-1.193.917 2.58 2.16 2.25 6.28 2.853-3.182 1.254-6.95-.97-6.78zm-5.718 6.093c-.336.026-.697.158-1.063.374-1.272.755 2.286 2.393 1.47 6.376 3.283-2.868 1.943-6.943-.406-6.75zm86.562 3.812c-2.952 2.147-5.638-.134-5.78 1.188-.33 3.04 4.496 3.097 5.78-1.188zM829.28 89.5c-.324.015-.67.084-1.03.28-1.256.685 2.115 2.402 1.188 6.22 3.27-2.655 2.12-6.603-.157-6.5zm80.5 7.844c-.113.03-.23.098-.31.25-1.487 2.792 3.117 4.715 6 1.094-3.204.81-4.886-1.552-5.69-1.344zm-5.624 8.687c-.12.018-.213.108-.312.25-1.828 2.647 2.57 5.102 5.906 1.782-3.33.443-4.758-2.146-5.594-2.03zm-6.562 7.94c-.126-.01-.275.06-.407.186-2.426 2.345 1.602 5.79 5.72 3.063-3.52-.233-4.43-3.198-5.313-3.25zm-28.532.28c11.89 15.694-28.537 19.37-9.593 2.78l9.592-2.78zm-18.656.156c-.318-.007-.632.03-.968.094-1.796.34-3.076 1.584-2.844 2.812.232 1.23 1.86 1.965 3.656 1.625 1.796-.34 3.076-1.615 2.844-2.843-.145-.768-.84-1.326-1.782-1.563-.282-.07-.588-.117-.906-.124zm39.47 6.813c-.077.02-.166.064-.25.124-3.114 2.175.752 6.737 5.812 4.437-4.145-.943-4.43-4.857-5.563-4.56zm-13.282 8.468c-.19 0-.356.013-.532.03-5.43.683-4.448 13.6 12.625 14.657-14.353-8.004-3.56-14.494-12.093-14.688zm-32.688 2.187c-4.257.064-5.76 10.276 7.47 14.78-9.91-9.707.312-12.57-6.595-14.624-.303-.09-.59-.16-.874-.155zm20.907.78c-5.106.123-5.405 12.193 10.343 14.782-12.57-8.78-1.94-13.766-9.843-14.75-.175-.022-.336-.034-.5-.03zm-10.594 1c-4.47.46-5.096 11.325 9.217 14.845-11.304-9.291-.804-13.257-8.25-14.78-.328-.068-.67-.094-.968-.064z" id="krill-logo"/>
+    </a>
+    <a id="karang" xlink:href="doc/development/karang" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="778.493" y="187.33" class="blue" />
+      <path d="M862.406 218.188c-3.29 0-6.062 2.77-6.062 6.062 0 .823.188 1.618.5 2.344l-.282-.594-27.625 12.688c-1.085-1.76-3.027-2.97-5.187-2.97-3.29 0-6.094 2.804-6.094 6.095 0 2.468 1.574 4.65 3.75 5.593l-.218.938 1.625.406.218-.906c.234.028.48.062.72.062 3.29 0 6.094-2.803 6.094-6.094 0-.56-.1-1.103-.25-1.625L857.25 227.5l-.156-.375c.945 1.725 2.677 2.974 4.687 3.188l.064 1.656 1.656-.064-.063-1.656c2.085-.372 3.84-1.848 4.625-3.78l34.907 5.218c-.39.736-.635 1.546-.69 2.406l-.155-.313-37.875 17.814-.063-1.28-1.656.06.064 1.657.78-.03-43 20.22.126.28c-.856-.468-1.825-.75-2.844-.75-3.29 0-6.062 2.803-6.062 6.094 0 3.29 2.77 6.094 6.062 6.094 1.225 0 2.374-.406 3.344-1.063l28.813 27.313c-.456.847-.72 1.808-.72 2.812 0 3.29 2.804 6.094 6.095 6.094 3.146 0 5.803-2.555 6.03-5.656l37.063-9.563c1.114 1.524 2.89 2.53 4.876 2.53 3.29 0 6.094-2.77 6.094-6.06 0-2.313-1.38-4.38-3.344-5.407L906 293.5l-1.688-.125-.062.97c-.352-.068-.726-.095-1.094-.095-1.353 0-2.635.463-3.656 1.25l.438-.437-1.22-1.157-1.155 1.22 1.187 1.124c-1.007 1.095-1.656 2.532-1.656 4.094 0 .123.023.253.03.375l-36.468 9.405 20.5-30.687.688.656 1.156-1.22-.875-.843 25.125-37.592c.174.03.353.046.53.062l-.06 1.094 1.655.125.094-1.314c.552-.11 1.068-.31 1.56-.562l.532 1.03 1.5-.78-.656-1.22c1.212-1.115 2-2.676 2-4.405 0-3.292-2.803-6.095-6.094-6.095-1.63 0-3.117.688-4.218 1.78l-35.625-5.31c.018-.193.03-.4.03-.595 0-3.29-2.803-6.063-6.094-6.063zm0 2.5c1.768 0 3.594 1.794 3.594 3.562 0 1.768-1.826 3.594-3.594 3.594-1.768 0-3.562-1.826-3.562-3.594 0-1.768 1.794-3.563 3.562-3.563zm45.907 10.187c1.767 0 3.593 1.826 3.593 3.594 0 1.767-1.826 3.56-3.593 3.56-1.768 0-3.563-1.793-3.563-3.56 0-1.77 1.795-3.595 3.563-3.595zm-44.75 2.688l-1.657.062.063 1.688 1.655-.063-.063-1.688zm.125 3.343l-1.657.063.064 1.686 1.656-.062-.063-1.688zm37.562 1l-29.313 22.97c-1.03-.795-2.296-1.282-3.656-1.282-1.374 0-2.657.502-3.686 1.312l-.03-.562-1.658.062.063 1.656.5-.03c-.782 1.027-1.25 2.302-1.25 3.656 0 .205.01.423.03.625l-39.22 8.718c-.05-.093-.1-.188-.155-.28l41.313-19.437h.187v-.063l36.875-17.344zm-77.5.313c1.768 0 3.563 1.825 3.563 3.593 0 1.767-1.795 3.562-3.563 3.562-1.768 0-3.563-1.795-3.563-3.563 0-1.767 1.795-3.593 3.563-3.593zm40.063 2.03l-1.657.063.063 1.687 1.655-.063-.063-1.687zm39.156.594l-23.314 34.844-.312-.282-1.157 1.22.532.5-19.845 29.655 9.594-35c1.26-.04 2.435-.49 3.405-1.217l.28.28 1.158-1.218-.25-.22c.82-1.038 1.312-2.333 1.312-3.717 0-.756-.17-1.48-.438-2.157l29.032-22.686zm10.874.75l-1.5.78.78 1.47 1.5-.78-.78-1.47zm-6.25 1.687l-.094 1.657 1.656.125.125-1.687-1.686-.094zm-43.657.345l-1.656.063.064 1.656 1.656-.063-.063-1.655zm51.438.938l-1.47.78.783 1.47 1.468-.782-.78-1.468zm-8 2.062l-.094 1.656 1.658.095.125-1.656-1.688-.095zm-43.313.344l-1.656.06.063 1.657 1.655-.062-.063-1.656zm52.875.56l-1.5.782.782 1.47 1.5-.782-.783-1.47zm-9.78 2.407l-.094 1.688 1.656.094.124-1.658-1.688-.125zm-86.376.032l-.405 1.624L822 252l.406-1.625-1.625-.406zm97.69.53l-1.47.78.78 1.47 1.47-.78-.78-1.47zm-98.5 2.72l-.376 1.624 1.625.406.374-1.625-1.625-.406zm86.967.06l-.093 1.69 1.656.092.125-1.656-1.687-.125zm13.094.19l-1.5.78.783 1.47 1.5-.782-.782-1.47zm1.533 2.968l-1.47.78.782 1.47 1.47-.782-.783-1.47zm-102.375.03l-.407 1.626 1.626.406.407-1.625-1.625-.406zm87.53.157l-.093 1.687 1.656.094.126-1.656-1.687-.125zm-42.28.375l-1.657.063.064 1.656 1.656-.064-.063-1.656zm58.687 2.406l-1.5.78.78 1.47 1.5-.78-.78-1.47zm-104.72.313l-.405 1.655 1.625.375.406-1.625-1.624-.406zm88.095.25l-.094 1.686 1.657.094.125-1.656-1.688-.125zm19.563 1.155c-3.29 0-6.094 2.803-6.094 6.094 0 3.29 2.802 6.092 6.092 6.092 3.29 0 6.063-2.802 6.063-6.093 0-3.292-2.772-6.095-6.063-6.095zm-57.782 1c1.77 0 3.595 1.795 3.595 3.563 0 1.767-1.826 3.562-3.594 3.562-1.767 0-3.56-1.795-3.56-3.563 0-1.767 1.793-3.562 3.56-3.562zm-50.686.875l-.407 1.625 1.657.375.375-1.625-1.626-.375zm88.687.313l-.092 1.656 1.656.124.125-1.656-1.69-.125zm19.783.343c1.767 0 3.562 1.795 3.562 3.563 0 1.767-1.795 3.56-3.563 3.56-1.767 0-3.593-1.793-3.593-3.56 0-1.77 1.825-3.564 3.592-3.564zm-109.25 2.594l-.407 1.625 1.625.375.408-1.625-1.625-.375zm89.25.406l-.094 1.656 1.655.125.125-1.687-1.687-.094zm-42.625 2.625c.494.667 1.1 1.233 1.812 1.658l-9.875 35.968c-.06-.002-.126 0-.188 0-1.116 0-2.18.32-3.093.875l-28.907-27.467c.293-.635.478-1.315.532-2.032l39.75-8.842-.032-.157zM816 269.5l-.375 1.625 1.625.375.375-1.625L816 269.5zm89.844.5l-.094 1.656 1.656.125.125-1.686-1.686-.094zm-31.313.78l-1.155 1.22 1.188 1.156 1.156-1.22-1.19-1.155zm2.408 2.314l-1.157 1.22 1.22 1.155 1.156-1.22-1.218-1.156zm28.687.25L905.53 275l1.658.125.125-1.688-1.688-.093zm-87.97.937c1.77 0 3.595 1.796 3.595 3.564s-1.826 3.562-3.594 3.562c-1.768 0-3.562-1.794-3.562-3.562 0-1.768 1.794-3.563 3.562-3.563zm87.75 2.408l-.092 1.656 1.656.125.124-1.69-1.688-.092zm-21.217 3.343l-1.157 1.22 1.22 1.156 1.156-1.22-1.218-1.155zm21 0l-.094 1.658 1.656.093.125-1.655-1.687-.094zm-18.563 2.314l-1.156 1.22 1.217 1.155 1.157-1.22-1.22-1.156zm18.344 1l-.095 1.687 1.656.095.126-1.656-1.687-.126zm-15.94 1.312l-1.155 1.22 1.22 1.155 1.155-1.217-1.22-1.157zm15.72 2.03l-.094 1.69 1.657.093.125-1.658-1.688-.125zm-13.28.283l-1.158 1.217 1.22 1.157 1.155-1.22-1.218-1.155zm2.405 2.31l-1.156 1.22 1.217 1.156 1.157-1.22-1.22-1.155zm10.656.75l-.092 1.69 1.656.092.125-1.656-1.69-.125zm-8.217 1.564l-1.157 1.22 1.188 1.155 1.156-1.22-1.188-1.156zm6.843 5.156c1.768 0 3.594 1.826 3.594 3.594 0 1.768-1.826 3.562-3.594 3.562-1.768 0-3.562-1.794-3.562-3.562 0-1.768 1.794-3.594 3.562-3.594zm-47.968 12.656c1.767 0 3.562 1.826 3.562 3.594 0 1.768-1.795 3.563-3.563 3.563-1.767 0-3.593-1.795-3.593-3.563 0-1.768 1.826-3.594 3.593-3.594z" id="karang-logo"/>
+      <text x="941.799" y="282.481"><tspan>Karang</tspan></text>
+    </a>
+    <a id="data" xlink:href="doc/data" target="_parent">
+      <path d="M1169.953 2.515h98.634c1.846 0 3.332 1.87 3.332 4.19V327.84c-29.33 26.96.053.02-29.37 26.912h-72.597c-1.846 0-3.332-1.87-3.332-4.192V6.706c0-2.322 1.487-4.19 3.333-4.19z" class="grey"/>
+      <path d="M1246.57 326.687c5.353 0 22.966 1.256 25.19 1.256-2.046 3.54-26.698 25.82-28.41 26.81 0-2.92-.112-19.913-.112-23.875 0-2.32 1.486-4.19 3.332-4.19z" class="grey dark"/>
+      <text x="-220.819" y="1231.892" transform="rotate(-90)"><tspan>Data</tspan></text>
+    </a>
+    <g id="arrows">
+      <path d="M452.968 237.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M754.968 251.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M754.968 61.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M352.968 109.235l7.5 7.5h-48.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h48.823l-7.5 7.5 52.496-15z" class="arrow green"/>
+      <path d="M352.968 215.235l7.5 7.5h-48.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h48.823l-7.5 7.5 52.496-15z" class="arrow grey"/>
+      <path d="M668.968 237.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow orange"/>
+      <path d="M1099.378 96.286h2.764v-18h-2.764zm5.528 6h2.764v-30h-2.764zm5.528 4h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764zm5.528 0h2.763v-38h-2.763zm5.527 0h2.764v-38h-2.763zm5.528 0h2.764v-38h-2.765zm5.528 0h2.764v-38h-2.764zm5.528 0h2.765v-38h-2.764zm5.53 0h2.762v-38h-2.763zm5.526 0h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764z" class="connector"/>
+      <path d="M1099.378 278.286h2.764v-18h-2.764zm5.528 6h2.764v-30h-2.764zm5.528 4h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764zm5.528 0h2.763v-38h-2.763zm5.527 0h2.764v-38h-2.763zm5.528 0h2.764v-38h-2.765zm5.528 0h2.764v-38h-2.764zm5.528 0h2.765v-38h-2.764zm5.53 0h2.762v-38h-2.763zm5.526 0h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764z" class="connector"/>
+    </g>
+  </g>
+</svg>
diff --git a/public/img/korap-overview.svg b/public/img/korap-overview.svg
new file mode 100644
index 0000000..9f2fea6
--- /dev/null
+++ b/public/img/korap-overview.svg
@@ -0,0 +1,243 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="100%"
+     height="100%"
+     viewBox="0 0 1274.406 357.25"
+     version="1.2">
+  <defs>
+    <style type="text/css">
+<![CDATA[
+/* IDS-Green */
+#kalamar-logo {
+  fill: rgb(99, 111, 7);
+  stroke: none;
+}
+.green {
+  fill: #9bad0b;
+  stroke: rgb(99, 111, 7);
+  stroke-width: 5;
+}
+.arrow.green {
+  stroke: #9bad0b;
+}
+
+/* IDS-Pink */
+.pink {
+  fill: rgb(193, 0, 43);
+  stroke: #650016;
+  stroke-width: 5;
+}
+.pink.dark {
+  fill: #650016;
+  stroke: none;
+}
+.arrow.red {
+  stroke: rgb(193, 0, 43);
+}
+
+/* IDS-Blue */
+#karang-logo {
+  opacity: 1;
+  fill: #0b4d94;
+}
+#krill-logo {
+  fill: #0b4d94;
+  stroke: none;
+}
+.blue {
+  stroke: #0b4d94;
+  fill: rgb(0,158,224);
+  stroke-width: 5;
+}
+
+/* IDS-Orange */
+.orange {
+  fill: rgb(246,168, 0);
+  stroke: #e55d00;
+  stroke-width: 5; 
+}
+.orange.dark {
+  fill: #e55d00;
+  stroke: none;
+}
+.arrow.orange {
+  stroke: rgb(246,168, 0);
+}
+
+/* IDS-Grey */
+.grey {
+  fill: rgb(135,136,138); /* #8e8a6c; */
+  stroke: #4d4a3a;
+  stroke-width: 5;
+  stroke-linecap: round;
+  stroke-linejoin: round;
+}
+.grey.dark {
+  fill: #4d4a3a;
+}
+.arrow.grey {
+  stroke: rgb(135,136,138);
+}
+
+.connector {
+  fill:#4d4a3a;
+  stroke: none;
+}
+
+tspan {
+  text-align: start;
+  line-height: 125%;
+  font-size: 39.929px;
+  letter-spacing: 0;
+  word-spacing: 0;
+  fill: #fff;
+  font-family: Arial;
+}
+
+.white {
+  stroke: none;
+  fill: #fff;
+}
+
+.arrow {
+  fill: #fff;
+  stroke-width: 4;
+}
+
+/* Opacities */
+#kalamar, #krill, #kustvakt, #api, #koral, #data, #karang {
+  transition: opacity .3s ease;
+}
+
+#korap:not(:target) > a {
+  opacity: .3;
+}
+
+#korap:not(:target) > a:hover {
+  opacity: 1;
+}
+
+#korap > a:hover {
+  cursor: pointer;
+}
+
+#arrows {
+  transition: opacity .5s ease;
+}
+
+#korap:not(:target) #arrows {
+  opacity: 0;
+}
+
+#korap #karang:target,
+#korap #krill:target,
+#korap #kustvakt:target,
+#korap #api:target,
+#korap #data:target,
+#korap #koral:target,
+#korap #kalamar:target {
+  opacity: 1;
+}
+
+#korap:target:hover > a {
+  opacity: .3;
+}
+
+#korap:target:hover > a:hover {
+  opacity: 1;
+}
+
+#korap:target:hover #arrows {
+  opacity: 0;
+}
+]]>
+    </style>
+  </defs>
+  <g id="korap">
+    <a id="kalamar" xlink:href="doc/development/kalamar" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="2.493" y="3.33" class="green"/>
+      <text x="157.799" y="102.481"><tspan>Kalamar</tspan></text>
+      <path d="M35.855 141.43c6.05-36.58 24.68-50.103 37.84-54.99 2.096-8.49 10.88-15.632 15.788-18.784 1.124-10.84.192-16.933-12.25-14.972 7.702-18.85 16.25-8.35 26.822 2.066 8.034-14.17 21.118-22.105 36.333-24.932-17.902 23.507-21.82 30.025 7.64 26.133-21.703 16.495-16.286 18.607-12.14 30.796 5.954 15.374-16.355 16.995-1.15 33.21-19.586-7.935-12.065-10.84-7.85-26.36-2.25-7.68-7-5.65-15.228-6.02-4.762 9.83-9.094 10.66-17.374 14.044-4.01 6.943-7.27 11.354-14.476 13.387 0 0 2.836 5.245 2.195 17.743-14.784 5.32-21.81-2.356-46.15 8.68z" class="white"/>
+      <path d="M146.007 26.538c-7.497.793-16 3.113-22.897 6.214-9.934 3.558-13.458 9.19-19.424 18.347-8.728-16.29-32.82-20.74-32.73 17.074 15.318-29.15 19.965-2.347 14.535.414-5.374 2.732-10.526 10.306-14.778 16.07-3.78 2.078-8.807 4.633-15.022 11.404-9.504 1.32-17.54-.046-19.84 3.963-1.503 3.824-.654 22.403-1.052 27.84-.43 5.884-3.503 15.826-3.45 21.746.036 3.864 10.473-9.804 20.403-10.91 11.216-1.247 15.977-.528 24.44-1.442 2.688-.302 5.174-.87 6.825-2.52 3.544-3.753.137-16.08-.235-18.82 6.952-3.146 10.176-8.522 13.102-13.08 2.957-.75 12.09-2.78 16.44-12.794 5.707-.49 18.973-3.057 8.904 12.892-5.102 8.08 2.467 18.623 16.292 18.592 1.54 0-14.064-10.596-1.174-21.258 4.788-3.96.898-19.498-1.42-21.944 6.7-2.763 13.138-6.12 18.81-9.093-4.458-2.588-9.71-3.802-14.405-3.774 4.19-2.677 13.245-9.032 15.85-12.6-9.093-.676-15.097-.03-21.747 2.202 7.4-5.407 6.333-12.03 14.653-18.787-6.948 1.04-10.54 3.038-14.29 5.644 4.774-5.358 8.93-8.685 12.21-15.382zm-9.74 6.056c-8.686 8.767-10.94 8.793-14.527 13.49-4.74 6.206-4.353 11.33-5.138 14.262-1.39 5.2-6.04 3.804-10.225 12.158 11.103-4.866 19.323-9.753 36.205-14.384-7.406 6.835-19.104 13.42-19.74 14.286-1.71 2.496-4.263 7.883-8.735 11.987 1.886-5.796 1.343-10.326.196-9.296-4.344 3.903-3.61 15.104-9.908 19.4-15.462 10.55-17.81 1.128-19.937 2.764-3.094 2.382 4.067 4.728 6.923 5.554-9.75 17.674-12-.793-13.747.734-1.835 2.736-3.867 8.074 1.297 21.16 3.75 9.507-4.423 7.346-22.457 7.853-4.96.14-5.8.506-13.21 2.667-2.88.84-5.036.27-3.205-5.773 4.87-16.822 20.067-40.013 36.94-40.535 4.236.015-2.235-3.47-.906-5.48.895-1.344 1.323-2.41 3.816-5.31 2.505-2.91 5.62-5.665 8.366-6.604 7.76-2.653 12.666-8.223 16.39-13.895 3.725-5.672 7.642-11.726 10.796-15.313 6.575-5.582 14.05-8.726 20.807-9.723zm-36.31 22.83c-1.667 2.398-3.795 4.293-6.91 7.04-.55-7.328-3.32-16.563-11.962-12.72 4.977-6.615 13.128-4.316 18.873 5.68zm-9.138 18.72c-3.163.093-10.674 5.254-8.857 5.724 2.7.697 4.585-2.4 5.21-1.566.626.834-3.122 4.79-1.663 6.458 1.46 1.668 8.236-8.55 6.36-10.323-.234-.222-.6-.307-1.05-.294zm10.787 4.452c-9.528-.132-16.555 11.914-12.77 18.37 1.203 2.053 2.593-2.934 2.593-2.934s2.44 2.768 10.96-1.86c6.577-3.573 3.13-9.393 3.13-9.393s3.69-1.99.294-3.328c-1.438-.567-2.846-.838-4.207-.856zm27.985 1.247c1.772 1.668 7.99 13.615 2.618 18.788-8.38 8.067-4.794 15.146-1.616 18.064 0 0-13.17-3.853-2.596-17.874 4.004-5.31-1.35-14.96-8.21-13.905 3.544-2.606 7.293-4.098 9.804-5.072zm-26.59 3.547c2.62 5.073-4.548 9.956-10.618 8.367C95.198 87.484 98 84.224 103 83.39zm-2.57 1.786c-.73.01-1.63.394-2.372 1.1-1.188 1.132-1.57 2.65-.857 3.4.715.75 2.262.447 3.45-.684 1.188-1.13 1.57-2.65.856-3.4-.27-.28-.64-.42-1.078-.416z" id="kalamar-logo"/>
+    </a>
+    <a id="api" xlink:href="doc/api" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="2.493" y="187.33" class="grey"/>
+      <text x="157.799" y="282.481"><tspan>API</tspan></text>
+    </a>
+    <a xlink:href="doc/development/kustvakt" id="kustvakt" target="_parent">
+      <path d="M419.03 3.317c-15.816 0-28.53 12.746-28.53 28.563v293.593c0 15.817 12.714 28.563 28.53 28.563h21.126c15.817 0 28.563-12.746 28.563-28.563V242.63l.374-74.407c.05-9.887 7.956-17.844 17.844-17.844h174.5c9.678 0 17.485 7.623 17.812 17.218v157.875c0 15.817 12.714 28.563 28.53 28.563h21.126c14.43 0 26.31-10.597 28.282-24.47.47-2.16.718-4.41.718-6.718V34.536c0-2.296-.25-4.535-.718-6.688-1.945-13.902-13.83-24.53-28.282-24.53H419.032z" class="pink" />
+      <text x="540.648" y="83.901"><tspan>Kustvakt</tspan></text>
+      <path d="M421.486 94.5l-4.273-12.82 27.78-5.698-3.207-16.74 21.37-13.888c14.242-4.677 14.64-5.306 27.778-1.07l.712 13.535 4.63-.714 13.89 21.37s2.492 19.586-27.067 22.792c-29.56-1.07-24.22-18.876-61.614-6.767z" class="white"/>
+      <path d="M474.336 31.793c-4.61.065-33.295 1.987-33.88 3.156-.623 1.245-1.13 1.908-.922 3.154.208 1.247 8.35 2.802 8.35 2.802s.775 7.55 1.33 9.555c-1.138.873-9.108 4.803-10.743 7.075-.44 2.91.535 13.975 1.366 15.637-8.766 1.434-21.542 3.405-27.214 6.383.106 5.175 1.9 9.942 2.907 13.988-3.376-.317-4.45-2.058-4.202-6.808-5.247 3.297-3.98 11.41 2.358 12.18 6.61.802 19.347-4.987 28.632-5.195 16.576-.37 19.48 11.477 39.358 11.418 19.954-.06 25.055-18.45 44.925-11.932-3.673-7.218-9.023-6.794-17.39-3.386 1.453-1.87 6.827-8.102 17-5.266-5.316-6.664-10.01-5.484-11.877-3.58-.025-6.464-7.23-12.808-8.705-14.787-3.336-4.477-5.427-11.384-11.772-11.08.213-1.4.185-9.358-.23-11.436-.416-2.076-9.44-4.694-13.03-4.786-2.13-.055-5.23.975-5.23.975l.105-1.42c.008-.028 3.713-.544 5.054-1.258-.663-3.333-4.356-5.164-5.603-5.37-.076-.014-.276-.023-.584-.02zm-5 7.357l.143 1.773c-3.556.667-7.36 1.31-8.76 2.766l-.673-3.192c.142 0 9.29-1.348 9.29-1.348zm-14.43 2.02s.785 2.83 1.205 5l-3.19 2.093c-.106-.422-.85-6.702-.85-6.702zm47.283 2.076c-2.242.12-4.13 2.1-4.24 5.53 1.616-1.48 6.4-5.86 5.054 5.444 1.884-2.02 9.686-8.008 11.772 0 2.692-2.826 3.185-10.658-6.79-6.648-1.565-3.082-3.82-4.43-5.797-4.326zm-20 .053c2.38.42 5.192 1.274 6.312 2.534l.16 5.017-6.348-.637s.156-5.514-.124-6.914zm-5.017.885c0 1.4.18 4.946.32 6.276-1.82.21-9.033 2.282-10.993 3.122-.49-1.26-1.347-5.886-1.347-5.886 3.01-1.4 7.61-3.23 12.02-3.51zm-18.49 7.996c.056-.01.09 0 .087.02-.28 3.218 1.185 12.413 2.305 16.682-2.94.07-7.955 2-14.254 3.12-1.68-4.2-1.7-11.435-1.63-12.765 5.446-3.543 12.636-6.922 13.492-7.056zm25.404 5.16c1.322-.032 2.766.042 4.38.248-4.734 4.092-15.655 7.04-15.655 7.04l-.798-3.955c3.095-1.13 6.348-3.193 12.073-3.333zm11.1 1.79c1.488.17 1.198 13.14-.39 12.446-2.182-.95-1.344-11.747.247-12.427.05-.024.094-.025.142-.02zm12.267 6.33c.108 2.272 4.238 5.745 5.088 5.017 4.418-3.78 9.092 1.725 15.354-1.24-6.767-5.864-19.734-4.477-20.442-3.777zm-93.095-.195c-1.56-.038-3.468.465-6.33 1.932-1.372 2.562-1.277 8.198.177 10.69 12-8.367 16.07-.77 26.736-9.644-14.414 2.07-15.907-2.865-20.584-2.978zm58.594 1.844c.362 0 .713.04 1.063.088l-.744 3.936c-.222-.03-.444-.053-.674-.053-1.695 0-3.193.885-4.167 2.252-1.252-1.014-1.766-1.428-2.553-2.074 1.54-2.506 4.128-4.15 7.074-4.15zm5.46 2.18c1.876 1.728 3.074 4.333 3.085 7.25l-3.6.02c-.1-1.596-.77-3.013-1.79-4.008l2.304-3.262zm11.648 3.03c1.382 12.727-10.36 23.413-17.89 23.51-14.956.192-13.33-14.912-48.93-5.957-1.61-2.45-2.553-5.07-2.553-5.07 17.544-3.65 28.977-5.58 41.077-6.95 3.11 14.862 23.083 14.32 22.622-4.433 2.764-.71 5.672-1.1 5.672-1.1zm26.398 0c-.81.03-1.522.347-2.322 1.26 0 0 2.112 3.527 3.21 3.173 2.234-.72 3.952.01 5.37.07 1.47.067 2.396-2.238 2.447-3.633-4.678.416-6.923-.934-8.705-.87zm-17.57.604c4.037 2.252 7.33 5.27 9.114 8.084-2.494 7.25-3.38 13.403-18.58 15.39 0 0 10.124-16.154 9.467-23.474zm-26.61 1.968c1.162 0 2.1.905 2.25 2.074l3.388-.018c0-.125-.01-.25-.018-.372h3.6c0 .297-.013.596-.037.886-1.11-.07-2.23-.157-3.563-.248.003-.083.018-.164.018-.248h-3.387c.015.106.037.21.037.32 0 1.322-1.02 2.392-2.287 2.392-1.268 0-2.305-1.07-2.305-2.393 0-1.323 1.037-2.393 2.305-2.393zm-7.854.904c.988.218 1.497.337 2.89.638-.014.176-.036.353-.036.532 0 1.83.75 3.46 1.933 4.54l-1.543 2.516c-1.99-1.737-3.28-4.424-3.28-7.446 0-.262.017-.524.036-.78zm12.765 4.13l3.263 1.206c-1.45 2.937-4.264 4.93-7.5 4.93-.703 0-1.384-.107-2.038-.285l.638-3.05c.34.077.685.125 1.046.125 1.957 0 3.668-1.18 4.59-2.925zm42.64 14.308c-7.996-.057-19.325 6.024-20.584 17.977 0 0 11.35-17.607 26.026-13.136.33-1.45.23-3.383-.62-3.812-1.326-.67-2.978-1.015-4.823-1.028zm-78.008 1.418c-17.992.063-31.386 12.995-30.99 16.453.276 2.417 1.96 4.22 9.378 1.737-4.386-12.545 23.367-18.154 23.367-18.154-.59-.025-1.175-.037-1.755-.035zm5.495 2.465c-4.437.173-9.626 2.718-17.09 9.786 44.042-18.586 17.78 23.5 61.767-.886-26.914 5.67-33.337-9.344-44.677-8.9z" class="pink dark"/>
+    </a>
+    <a id="koral" xlink:href="doc/development/koral" target="_parent">
+      <rect width="165.736" height="181.714" rx="14" ry="14" x="491.543" y="171.852" class="orange"/>
+      <text x="526" y="322.649"><tspan>Koral</tspan></text>
+      <path d="M554.844 194.53c-.31.036-.518.18-.594.407-.8 2.4-4.594 11.75-4.594 11.75s-5.75-6.555-7.156-8.343c-1.405-1.79-4.625 3.118-3.813 5.53l8.72 7.407-2.813 4.22s-4.42-5.627-7.032-5.75c0 0-1.788.402-2.28 4.22l7 7.81c1.304 2.217 1.905 8.407 1.905 8.407s-4.067-3.952-6.75-4.718c-2.682-.768-3.258 5.18-1.78 7.25l8.968 6.593 1.594 9.03c-5.97 2.116-10.764 6.057-10.25 11.376.757 7.862 28.617 12.375 31.25-5.564.844-5.763-5.676-7.998-12.97-7.47l-.375-9.03 12.063-7.72 7.375 11.783-.032.28 6.345 10.313-1.594 14 12.72-9.688 15.156 8.03-5.062-14.03 6.875-3.72-10.564-5.968.782-13.156-12.97 13.314-13.687-16.906 11.908-9.094c6.692 3.28 11.128 8.27 17.875-2.844-5.147.123-13.407-1.344-13.407-1.344s2.502-3.5 2.625-6.062c-3.584-4.818-7.39-8.62-14.436-5.563.05 1.08 5.656 7.407 5.656 7.407l-11.03 9.75c.048-6.352 1.78-12.125 1.78-12.125s-.454-3.875-3.187-3.062c-2.093 1.55-4.532 9.563-4.532 9.563l-4.31-3s2.79-8.273 2.124-10.563c0 0-4.998-2.615-7.156-2.72-.125-.005-.24-.01-.344 0zm.78 21.564l8.438 1.594-.093 4.375-11.44 6.093-.874-7.03 3.97-5.032z" class="white" />
+      <path d="M555.573 193.407c-1.805-.013-3.174.516-3.164 1.775.04 5.13-3.26 10.364-3.26 10.364-3.38-3.177-4.196-6.494-6.717-7.974-2.165-1.272-4.735 3.352-4.584 5.488.156 2.228 3.827 5.82 7.962 9.503l-.893 1.538c-5.195-5.546-8.857-7.487-10.72-.967-.808 2.83 5.898 6.03 7.333 7.957 1.27 1.706 1.9 7.733 1.9 7.733s-6.502-7.244-8.167-2.744c-2.633 7.116-.16 7.125 8.233 14.785.297 1.962.73 6.24 1.683 10.428-10.913 4.447-7.744 12.892 5.354 11.106-2.452-.502-12.61-3.62-3.94-6.006.134.296.28.56.42.775 2.25 3.46 7.068 1.506 7.943.612 1.68-1.717 1.032-10.574.065-19.015 5.156-2.633 9.83-7.505 9.83-7.505 1.158 2.258 5.11 7.175 7.552 9.5-1.48-.248-2.078-.407-2.63-.29-3.38.705 8.212 11.916 8.212 11.916s-7.915 20.72-.646 17.287c3.48-1.643 13.79-8.747 13.79-8.747s15.462 8.322 17.66 8.322c3.224 0-7.458-18.072-7.458-18.072s10.096-3.108 8.684-5.553c-1.632-2.828-11.01-6.037-11.01-6.037s2.77-14.655-.71-14.593c-.11 0-.23.03-.354.065-3.174.85-11.68 10.813-13.697 13.84-2.536-3.564-9.215-9.904-11.004-12.518 2.546-2.384 7.135-6.804 10.124-9.827 2.184.79 7.05 4.05 10.138 3.552 3.508-.568 7.35-4.27 8.458-8.104.347-1.2-7.687.532-13.01-1.743.88-1.165 1.668-2.354 2.324-3.52 1.556-2.763-5.497-9.344-7.07-10.524-2.062-1.546-9.046.637-10.07 2.604-1.02 1.966 5.744 8.63 5.744 8.63l-8.726 7.87s.292-7.15 2.14-11.2c1.47-3.22-3.83-5.096-5.72-4.545-1.887.55-4.134 4.37-4.685 9.563-.884-.557-1.053-.972-1.864-1.536 1.992-4.856 3.186-9.3 2.518-10.87-.773-1.815-4.967-3.303-7.975-3.325zm1.743 3.164c1.376.1 2.842 1.163 2.842 1.163 0 1.075-1.184 4.11-2.81 7.716-.254-.027-.528-.033-.84-.033-6.005 0-6.016 6.877-3.937 9.717-1.303 2.412-2.558 4.57-3.55 6.005 0 0 5.96 33.23 3.744 32.67-1.99-.5-3.758-8.87-5.165-17.206-1.062 2.4-8.2-3.067-8.2-3.067 1.013-1.815 1.256-3.37 1.096-4.81 0 0 5.116 2.925 6.65 5.133-1.028-6.418-1.834-12.303-2.29-13.883 2.52-5.144 3.392-6.89 3.392-6.89 1.517-.326 2.392-1.512 2.702-2.748-1.687-.18-7.14-4.346-8.59-6.572.64-.74 1.088-1.367 1.424-2.227 2.112 2.227 5.985 5.77 7.195 7.695.018-.596.24-1.032.073-1.784 0 0 4.468-8.268 4.972-10.588.378-.253.833-.324 1.29-.29zm-14.568 2.995c1.246 1.054-2.44 5.484-3.164 3.874-.828-1.84 1.685-5.127 3.164-3.875zm39.654 1.59c.416-.01.87-.01 1.388 0 2.91 1.967 3.882 2.923 4.197 4.81-4.7 5.134-11.1 10.903-16.41 15.875-.48-1.65-.646-3.01-.677-4.132 3.528-3.298 8.95-7.51 12.89-12.13-3.056-2.376-7.633-4.305-1.388-4.423zm-12.53.776c.94.024 1.7.604 1.387 1.745-3.5 12.89-3.63 20.662 6.94 32.956 1.49 2.327-4.062.636-5.257-1.262-1.225-1.947-5.304-6.293-6.337-9.234-4.08 3.202-6.81 5.736-12.292 7.984l-.258-4.552c4.938-2.01 7.342-4.16 11.452-7.306-.457-2.18-.67-4.562-.58-7.135-2.94-.067-5.448-1.766-5.448-1.766.698-.865 1.044-1.747 1.065-2.713 0 0 1.956 1.09 4.576 1.96.295-2.544 1.24-6.208 2.297-9.094.393-1.073 1.513-1.605 2.454-1.582zm-13.194 5.204c4.14.846.69 7.882-1.454 7.292-3.08-.847-2.348-8.07 1.454-7.292zm-18.345 3.836c1.786-.095 5.648 4.85 4.1 4.745-3.02-.2-5.235-1.504-4.907-3.745.1-.68.395-.978.807-1zm52.818 2.39c3.117.282 5.155.58 7.62.354-2.578 4.76-11.19 3.78-7.62-.355zm-34.802 3.937c2.133.79 2.565 1.577 6.222 2.186l.162 2.454-9.16 5.433c-.225-1.757-.395-3.285-.452-4.132 1.044-1.806 2.144-3.84 3.228-5.94zm-17.982 9.072c2.91 1.02.24 8.643-1.55 6.52-1.724-2.043-.922-7.388 1.55-6.52zM597.01 230l-2.94 12.687s10.086 3.81 10.365 4.165c-.774 0-5.876 2.937-5.876 2.937l3.56 11.462-12.698-8.977-9.835 10.647 2.57-12.035-6.735-8.107 12.322-.093zm-3.68 8.07l-4.1 6.812-6.2.58 4.197 2.52-2.26 4.842c.132-.066 4.94-4.584 4.94-4.584l4.52 3.422-2.164-4.39 5.78-.68s-6.07-1.383-6.038-1.548c.034-.166 1.324-6.974 1.324-6.974zm-36.593 9.44c.192 1.757.33 2.61.192 4.396 0 0 10.436 1.333 4.422 10.202 5.283-3.395 7.76-13.052-4.615-14.6zm0 5.88c.023 1.875-.615 3.908-.615 3.908 2.793 1.347-1.17 4.014-3.487 4.23 8.02 2.745 10.99-7.388 4.1-8.137z" class="orange dark"/>
+    </a>
+    <a id="krill" xlink:href="doc/development/krill" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="778.493" y="3.33" class="blue"/>
+      <text x="941.799" y="98.481"><tspan>Krill</tspan></text>
+      <path d="M874.53 36.53c-3.008-.08-9.357 1.69-13.31 2 9.83 8.528 12.984.177 13.31-2zm-14.686 4.345c-16.103.196-26.953 13.71-33.938 26.688-6.01 12.365-10.007 26.23-7.375 34.718 7.824-17.475 21.11-38.202 36.25-45 14.442-8.23 18.62-9.34 8.345-16.25-1.12-.108-2.208-.168-3.28-.155zM914.062 75c-18.062 27.692-42.965 36.107-51.468 38-2.37.528-4.45 1.753-6.25 3.313.853-1.61 1.334-2.86.75-2.75-1.396.26-12.12 3.7-14.657 6.874l8.375 3.063c-1.094 2.158-1.632 4.05-1.53 4.938 0 0 10.43.47 25.155-2.907 19.59-4.492 39.905-36.545 39.625-50.53z" class="white"/>
+      <path d="M883.875 15.625c10.34 7.66 5.993 16.067.97 20.25 8.62-15.7-12.13-15.895-17.876-8.72 10.382-4.038 23.293-3.013 14.25 9.69-.48-.25-.99-.464-1.658-.595-1.374-.27-3.038-.316-4.312-.25-1.274.065-2.22.25-2.22.25 1.528 2.647-4.105 9.86-10.405 1.813-51.3 3.396-48.854 77.253-45.656 70.656 2.415-4.986 4.825-9.706 7.28-14.157-1.09-1.107-2.634-2.356-4.594-2.75.125-.585.206-.983.375-1.5 1.378-.065 4.158.606 5.97 1.124.71-1.24 1.41-2.437 2.125-3.624-1.65-1.36-4.54-3.664-6.406-4.188.308-.83.717-2.25.717-2.25 1.694.618 5.296 2.604 7.375 3.75.54-.858 1.116-1.736 1.657-2.563-1.34-1.25-4.643-4.186-7.376-5.843l.937-2.314c2.624 1.124 6.21 3.38 8.595 4.938.986-1.413 1.972-2.764 2.97-4.063-2.174-1.826-6.215-5.015-9.158-6.124l.938-1.75c3.772 1.012 8.24 3.65 10.438 5.063 1.436-1.728 2.91-3.317 4.375-4.782-1.625-1.63-5.252-4.88-10.25-7.188l1.75-2.156c5.023 2.052 9.53 5.24 11.406 6.625.954-.824 1.938-1.61 2.906-2.314-.68-1.584-2.7-5.766-7.438-11.093l1.688-1.25c4.363 3.878 7.82 7.594 9.78 9.78 1.51-.807 3.05-1.473 4.595-1.968 14.77-4.73 23.273-11.745 25.063-16.594 7.267-1.202 20.86-2.004 24.875 2.19 3 3.132-8.354 5.968-8.344 11.593.004 3.18 7.263 3.363 9.092 3.343-.833-.062-2.817-.55-4.937-2.937-2.178-2.454 9.984-9.262 7.28-13.22-3.316-4.858-13.554-5.22-21.405-4.688 5.873-2.1 13.19-5.563 19.656-4.124 5.714 1.27 3.76 6.53 8.625 9.5 3.484 2.124 7.033-5.282 7.033-5.282-8.768 6.79-5.09-5.754-13.5-7.593-9.403-2.057-16.22 1.597-21.375 3.406 3.37-4.88 6.384-13.206-5.813-18.095zm-15.188 19.47c-.233.016-.478.042-.718.093-1.925.408-3.25 1.808-2.97 3.124.28 1.317 2.045 2.065 3.97 1.657 1.923-.41 3.247-1.81 2.967-3.126-.244-1.152-1.615-1.865-3.25-1.75zm16.782 6.843c-1.476-.038-2.717.734-3.126 2.218-2.06 7.478 6.437-.238 9.656 14.344 2.624-11.23-2.762-16.468-6.53-16.563zm-24.75.718c15.786 4.29-6.762 11.918-14.283 5.563 4.717-3.285 8.142-4.51 14.282-5.564zm19.624 5.032c-1.33.04-2.433.76-2.907 2.124-2.68 7.73 6.772.18 9.157 15.75 3.688-12.145-2.258-18-6.25-17.874zm-7.72 5.156c-1.39.098-2.527.896-2.968 2.343-2.496 8.2 7.094-.048 10.22 16.157 3.37-12.865-3.077-18.793-7.25-18.5zm-10.155 4.78c-1.492.118-2.73.977-3.19 2.532-2.598 8.813 7.627-.152 11.126 17.188 3.495-13.82-3.466-20.072-7.937-19.72zm51.81 2.688c-6.13 31.07-30.51 44.957-60.655 53.532 2.796 5.117-5.764 10.07-8.313 3.406-4.077 2.383-6.927 5.625-8.718 9.344-1.266-.595-2.552-.954-3.813-1.125-3.48-4.884 3.316-13.07 15.158-12.782-2.088-1.933-12.493-1.004-16.782 4.874-1.274 1.748-1.844 5.336-1.218 7.844-14.778 1.298-18.61 16.086-7.563 14.844-8.842-2.054-4.16-11.566 9-12.53.427.32.955.532 1.594.718-6.957 4.104-10.416 12.8-8.783 16.843 1.377 3.41 8.076 8.026 14.438 5.532-7.714-.47-11.806-2.614-12.72-6.5-.955-4.07 3.802-11.222 8.69-14.437-.904 1.19-.403 1.835-.283 4.625.12 2.765 5.563 5.644 3.782 8.688-2.813 4.806 3.497 7.646 8.75 6.125-6.722-1.19-8.89-1.787-6.032-7.938 1.496-3.216-6.22-6.45-2.375-12 16.047 5.512 30.784 2.805 43-4.188-1.922-2.87-5.613-8.636-7.093-12.843l2.375-1c2.698 4.826 6.402 9.488 8.217 11.656 2.19-1.458 4.315-3.046 6.313-4.75-1.54-1.962-4.307-5.912-6.188-11.063l2.188-1.28c1.384 3.555 4.66 7.756 6.563 10.03 1.678-1.578 3.265-3.223 4.78-4.937-1.303-1.502-3.716-4.475-5.937-8.656l1.657-1.438c2.852 4.352 5.25 6.403 6.625 7.344 1.49-1.85 2.862-3.778 4.156-5.72-.8-.572-2.465-1.914-5.407-6.28l1.625-1.813c2.73 3.448 4.723 4.635 5.72 5.063 1.014-1.684 1.952-3.386 2.812-5.094-.937-.52-2.9-1.806-4.813-4.5l1.408-2.03c2.27 2.673 4.257 3.253 4.843 3.374.93-2.092 1.728-4.186 2.408-6.25-.783-.157-2.056-.71-4.282-2.28l.875-1.782c1.612 1.084 3.066 1.732 4.064 2.124 2.572-8.79 2.74-16.956-.063-22.75zm-64.405 3.75c-.57.038-1.17.308-1.72.844-1.268 1.244 3.377 2.123 3.564 7 2.793-3.976.626-8.004-1.845-7.844zm-6.406 6.594c-.435.01-.91.18-1.376.5-1.3.895 2.612 2.36 2.03 6.656 3.17-3.172 1.685-7.207-.655-7.156zm-4.908 7.063c-.41.03-.852.17-1.28.5-1.193.917 2.58 2.16 2.25 6.28 2.853-3.182 1.254-6.95-.97-6.78zm-5.718 6.093c-.336.026-.697.158-1.063.374-1.272.755 2.286 2.393 1.47 6.376 3.283-2.868 1.943-6.943-.406-6.75zm86.562 3.812c-2.952 2.147-5.638-.134-5.78 1.188-.33 3.04 4.496 3.097 5.78-1.188zM829.28 89.5c-.324.015-.67.084-1.03.28-1.256.685 2.115 2.402 1.188 6.22 3.27-2.655 2.12-6.603-.157-6.5zm80.5 7.844c-.113.03-.23.098-.31.25-1.487 2.792 3.117 4.715 6 1.094-3.204.81-4.886-1.552-5.69-1.344zm-5.624 8.687c-.12.018-.213.108-.312.25-1.828 2.647 2.57 5.102 5.906 1.782-3.33.443-4.758-2.146-5.594-2.03zm-6.562 7.94c-.126-.01-.275.06-.407.186-2.426 2.345 1.602 5.79 5.72 3.063-3.52-.233-4.43-3.198-5.313-3.25zm-28.532.28c11.89 15.694-28.537 19.37-9.593 2.78l9.592-2.78zm-18.656.156c-.318-.007-.632.03-.968.094-1.796.34-3.076 1.584-2.844 2.812.232 1.23 1.86 1.965 3.656 1.625 1.796-.34 3.076-1.615 2.844-2.843-.145-.768-.84-1.326-1.782-1.563-.282-.07-.588-.117-.906-.124zm39.47 6.813c-.077.02-.166.064-.25.124-3.114 2.175.752 6.737 5.812 4.437-4.145-.943-4.43-4.857-5.563-4.56zm-13.282 8.468c-.19 0-.356.013-.532.03-5.43.683-4.448 13.6 12.625 14.657-14.353-8.004-3.56-14.494-12.093-14.688zm-32.688 2.187c-4.257.064-5.76 10.276 7.47 14.78-9.91-9.707.312-12.57-6.595-14.624-.303-.09-.59-.16-.874-.155zm20.907.78c-5.106.123-5.405 12.193 10.343 14.782-12.57-8.78-1.94-13.766-9.843-14.75-.175-.022-.336-.034-.5-.03zm-10.594 1c-4.47.46-5.096 11.325 9.217 14.845-11.304-9.291-.804-13.257-8.25-14.78-.328-.068-.67-.094-.968-.064z" id="krill-logo"/>
+    </a>
+    <a id="karang" xlink:href="doc/development/karang" target="_parent">
+      <rect width="367.403" height="166.995" rx="31" ry="31" x="778.493" y="187.33" class="blue" />
+      <path d="M862.406 218.188c-3.29 0-6.062 2.77-6.062 6.062 0 .823.188 1.618.5 2.344l-.282-.594-27.625 12.688c-1.085-1.76-3.027-2.97-5.187-2.97-3.29 0-6.094 2.804-6.094 6.095 0 2.468 1.574 4.65 3.75 5.593l-.218.938 1.625.406.218-.906c.234.028.48.062.72.062 3.29 0 6.094-2.803 6.094-6.094 0-.56-.1-1.103-.25-1.625L857.25 227.5l-.156-.375c.945 1.725 2.677 2.974 4.687 3.188l.064 1.656 1.656-.064-.063-1.656c2.085-.372 3.84-1.848 4.625-3.78l34.907 5.218c-.39.736-.635 1.546-.69 2.406l-.155-.313-37.875 17.814-.063-1.28-1.656.06.064 1.657.78-.03-43 20.22.126.28c-.856-.468-1.825-.75-2.844-.75-3.29 0-6.062 2.803-6.062 6.094 0 3.29 2.77 6.094 6.062 6.094 1.225 0 2.374-.406 3.344-1.063l28.813 27.313c-.456.847-.72 1.808-.72 2.812 0 3.29 2.804 6.094 6.095 6.094 3.146 0 5.803-2.555 6.03-5.656l37.063-9.563c1.114 1.524 2.89 2.53 4.876 2.53 3.29 0 6.094-2.77 6.094-6.06 0-2.313-1.38-4.38-3.344-5.407L906 293.5l-1.688-.125-.062.97c-.352-.068-.726-.095-1.094-.095-1.353 0-2.635.463-3.656 1.25l.438-.437-1.22-1.157-1.155 1.22 1.187 1.124c-1.007 1.095-1.656 2.532-1.656 4.094 0 .123.023.253.03.375l-36.468 9.405 20.5-30.687.688.656 1.156-1.22-.875-.843 25.125-37.592c.174.03.353.046.53.062l-.06 1.094 1.655.125.094-1.314c.552-.11 1.068-.31 1.56-.562l.532 1.03 1.5-.78-.656-1.22c1.212-1.115 2-2.676 2-4.405 0-3.292-2.803-6.095-6.094-6.095-1.63 0-3.117.688-4.218 1.78l-35.625-5.31c.018-.193.03-.4.03-.595 0-3.29-2.803-6.063-6.094-6.063zm0 2.5c1.768 0 3.594 1.794 3.594 3.562 0 1.768-1.826 3.594-3.594 3.594-1.768 0-3.562-1.826-3.562-3.594 0-1.768 1.794-3.563 3.562-3.563zm45.907 10.187c1.767 0 3.593 1.826 3.593 3.594 0 1.767-1.826 3.56-3.593 3.56-1.768 0-3.563-1.793-3.563-3.56 0-1.77 1.795-3.595 3.563-3.595zm-44.75 2.688l-1.657.062.063 1.688 1.655-.063-.063-1.688zm.125 3.343l-1.657.063.064 1.686 1.656-.062-.063-1.688zm37.562 1l-29.313 22.97c-1.03-.795-2.296-1.282-3.656-1.282-1.374 0-2.657.502-3.686 1.312l-.03-.562-1.658.062.063 1.656.5-.03c-.782 1.027-1.25 2.302-1.25 3.656 0 .205.01.423.03.625l-39.22 8.718c-.05-.093-.1-.188-.155-.28l41.313-19.437h.187v-.063l36.875-17.344zm-77.5.313c1.768 0 3.563 1.825 3.563 3.593 0 1.767-1.795 3.562-3.563 3.562-1.768 0-3.563-1.795-3.563-3.563 0-1.767 1.795-3.593 3.563-3.593zm40.063 2.03l-1.657.063.063 1.687 1.655-.063-.063-1.687zm39.156.594l-23.314 34.844-.312-.282-1.157 1.22.532.5-19.845 29.655 9.594-35c1.26-.04 2.435-.49 3.405-1.217l.28.28 1.158-1.218-.25-.22c.82-1.038 1.312-2.333 1.312-3.717 0-.756-.17-1.48-.438-2.157l29.032-22.686zm10.874.75l-1.5.78.78 1.47 1.5-.78-.78-1.47zm-6.25 1.687l-.094 1.657 1.656.125.125-1.687-1.686-.094zm-43.657.345l-1.656.063.064 1.656 1.656-.063-.063-1.655zm51.438.938l-1.47.78.783 1.47 1.468-.782-.78-1.468zm-8 2.062l-.094 1.656 1.658.095.125-1.656-1.688-.095zm-43.313.344l-1.656.06.063 1.657 1.655-.062-.063-1.656zm52.875.56l-1.5.782.782 1.47 1.5-.782-.783-1.47zm-9.78 2.407l-.094 1.688 1.656.094.124-1.658-1.688-.125zm-86.376.032l-.405 1.624L822 252l.406-1.625-1.625-.406zm97.69.53l-1.47.78.78 1.47 1.47-.78-.78-1.47zm-98.5 2.72l-.376 1.624 1.625.406.374-1.625-1.625-.406zm86.967.06l-.093 1.69 1.656.092.125-1.656-1.687-.125zm13.094.19l-1.5.78.783 1.47 1.5-.782-.782-1.47zm1.533 2.968l-1.47.78.782 1.47 1.47-.782-.783-1.47zm-102.375.03l-.407 1.626 1.626.406.407-1.625-1.625-.406zm87.53.157l-.093 1.687 1.656.094.126-1.656-1.687-.125zm-42.28.375l-1.657.063.064 1.656 1.656-.064-.063-1.656zm58.687 2.406l-1.5.78.78 1.47 1.5-.78-.78-1.47zm-104.72.313l-.405 1.655 1.625.375.406-1.625-1.624-.406zm88.095.25l-.094 1.686 1.657.094.125-1.656-1.688-.125zm19.563 1.155c-3.29 0-6.094 2.803-6.094 6.094 0 3.29 2.802 6.092 6.092 6.092 3.29 0 6.063-2.802 6.063-6.093 0-3.292-2.772-6.095-6.063-6.095zm-57.782 1c1.77 0 3.595 1.795 3.595 3.563 0 1.767-1.826 3.562-3.594 3.562-1.767 0-3.56-1.795-3.56-3.563 0-1.767 1.793-3.562 3.56-3.562zm-50.686.875l-.407 1.625 1.657.375.375-1.625-1.626-.375zm88.687.313l-.092 1.656 1.656.124.125-1.656-1.69-.125zm19.783.343c1.767 0 3.562 1.795 3.562 3.563 0 1.767-1.795 3.56-3.563 3.56-1.767 0-3.593-1.793-3.593-3.56 0-1.77 1.825-3.564 3.592-3.564zm-109.25 2.594l-.407 1.625 1.625.375.408-1.625-1.625-.375zm89.25.406l-.094 1.656 1.655.125.125-1.687-1.687-.094zm-42.625 2.625c.494.667 1.1 1.233 1.812 1.658l-9.875 35.968c-.06-.002-.126 0-.188 0-1.116 0-2.18.32-3.093.875l-28.907-27.467c.293-.635.478-1.315.532-2.032l39.75-8.842-.032-.157zM816 269.5l-.375 1.625 1.625.375.375-1.625L816 269.5zm89.844.5l-.094 1.656 1.656.125.125-1.686-1.686-.094zm-31.313.78l-1.155 1.22 1.188 1.156 1.156-1.22-1.19-1.155zm2.408 2.314l-1.157 1.22 1.22 1.155 1.156-1.22-1.218-1.156zm28.687.25L905.53 275l1.658.125.125-1.688-1.688-.093zm-87.97.937c1.77 0 3.595 1.796 3.595 3.564s-1.826 3.562-3.594 3.562c-1.768 0-3.562-1.794-3.562-3.562 0-1.768 1.794-3.563 3.562-3.563zm87.75 2.408l-.092 1.656 1.656.125.124-1.69-1.688-.092zm-21.217 3.343l-1.157 1.22 1.22 1.156 1.156-1.22-1.218-1.155zm21 0l-.094 1.658 1.656.093.125-1.655-1.687-.094zm-18.563 2.314l-1.156 1.22 1.217 1.155 1.157-1.22-1.22-1.156zm18.344 1l-.095 1.687 1.656.095.126-1.656-1.687-.126zm-15.94 1.312l-1.155 1.22 1.22 1.155 1.155-1.217-1.22-1.157zm15.72 2.03l-.094 1.69 1.657.093.125-1.658-1.688-.125zm-13.28.283l-1.158 1.217 1.22 1.157 1.155-1.22-1.218-1.155zm2.405 2.31l-1.156 1.22 1.217 1.156 1.157-1.22-1.22-1.155zm10.656.75l-.092 1.69 1.656.092.125-1.656-1.69-.125zm-8.217 1.564l-1.157 1.22 1.188 1.155 1.156-1.22-1.188-1.156zm6.843 5.156c1.768 0 3.594 1.826 3.594 3.594 0 1.768-1.826 3.562-3.594 3.562-1.768 0-3.562-1.794-3.562-3.562 0-1.768 1.794-3.594 3.562-3.594zm-47.968 12.656c1.767 0 3.562 1.826 3.562 3.594 0 1.768-1.795 3.563-3.563 3.563-1.767 0-3.593-1.795-3.593-3.563 0-1.768 1.826-3.594 3.593-3.594z" id="karang-logo"/>
+      <text x="941.799" y="282.481"><tspan>Karang</tspan></text>
+    </a>
+    <a id="data" xlink:href="doc/data" target="_parent">
+      <path d="M1169.953 2.515h98.634c1.846 0 3.332 1.87 3.332 4.19V327.84c-29.33 26.96.053.02-29.37 26.912h-72.597c-1.846 0-3.332-1.87-3.332-4.192V6.706c0-2.322 1.487-4.19 3.333-4.19z" class="grey"/>
+      <path d="M1246.57 326.687c5.353 0 22.966 1.256 25.19 1.256-2.046 3.54-26.698 25.82-28.41 26.81 0-2.92-.112-19.913-.112-23.875 0-2.32 1.486-4.19 3.332-4.19z" class="grey dark"/>
+      <text x="-220.819" y="1231.892" transform="rotate(-90)"><tspan>Data</tspan></text>
+    </a>
+    <g id="arrows">
+      <path d="M452.968 237.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M754.968 251.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M754.968 61.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow red"/>
+      <path d="M352.968 109.235l7.5 7.5h-48.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.923-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h48.823l-7.5 7.5 52.496-15z" class="arrow green"/>
+      <path d="M352.968 215.235l7.5 7.5h-48.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h48.823l-7.5 7.5 52.496-15z" class="arrow grey"/>
+      <path d="M668.968 237.235l7.5 7.5h-32.823c-.247-.013-.495-.013-.742 0-3.927.193-7.342 3.924-7.148 7.85.194 3.927 3.963 7.343 7.89 7.148h32.823l-7.5 7.5 52.496-15z" class="arrow orange"/>
+      <path d="M1099.378 96.286h2.764v-18h-2.764zm5.528 6h2.764v-30h-2.764zm5.528 4h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764zm5.528 0h2.763v-38h-2.763zm5.527 0h2.764v-38h-2.763zm5.528 0h2.764v-38h-2.765zm5.528 0h2.764v-38h-2.764zm5.528 0h2.765v-38h-2.764zm5.53 0h2.762v-38h-2.763zm5.526 0h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764z" class="connector"/>
+      <path d="M1099.378 278.286h2.764v-18h-2.764zm5.528 6h2.764v-30h-2.764zm5.528 4h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764zm5.528 0h2.763v-38h-2.763zm5.527 0h2.764v-38h-2.763zm5.528 0h2.764v-38h-2.765zm5.528 0h2.764v-38h-2.764zm5.528 0h2.765v-38h-2.764zm5.53 0h2.762v-38h-2.763zm5.526 0h2.764v-38h-2.764zm5.528 0h2.764v-38h-2.764z" class="connector"/>
+    </g>
+  </g>
+  <!-- CSP supported hash 'sha256-VGXK99kFz+zmAQ0kxgleFrBWZgybFAPOl3GQtS7FQkI=' -->
+  <script type="text/javascript">
+<![CDATA[
+  var query = window.location.search.substring(1);
+  if (query) {
+    var vars = query.split('&');
+
+    var p = {};
+    for (var i = 0; i < vars.length; i++) {
+      var pair = vars[i].split('=');
+	    p[pair[0]] = pair[1];
+    };
+
+    if (p['base'] !== undefined || p['embedded'] !== undefined) {
+
+      var anchors = document.getElementsByTagName('a');
+
+      for (var i = 0; i < anchors.length; i++) {
+        var url = anchors[i].getAttribute('xlink:href');
+
+        if (p['base'] !== undefined) {
+          url = decodeURIComponent(p['base']) + url;
+        };
+
+        if (p['embedded'] !== undefined)
+          url += '?embedded=true';
+
+        anchors[i].setAttributeNS(
+	      'http://www.w3.org/1999/xlink',
+	      'xlink:href',
+	      url
+	      );
+      };
+    };
+  };
+]]>
+  </script>
+</svg>
diff --git a/public/img/member-of-the-leibniz-association.svg b/public/img/member-of-the-leibniz-association.svg
new file mode 100644
index 0000000..160e196
--- /dev/null
+++ b/public/img/member-of-the-leibniz-association.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="202.73514"
+   height="133.19444"
+   id="svg2"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="member-of-the-leibniz-association.svg">
+  <metadata
+     id="metadata16">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs14" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="640"
+     inkscape:window-height="480"
+     id="namedview12"
+     showgrid="false"
+     fit-margin-top="2"
+     fit-margin-left="2"
+     fit-margin-right="2"
+     fit-margin-bottom="2"
+     inkscape:zoom="1.4541968"
+     inkscape:cx="101.36757"
+     inkscape:cy="66.597229"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <g
+     transform="matrix(1.25,0,0,-1.25,2,131.19405)"
+     id="g4">
+    <path
+       d="m 125.179,23.9789 0,3.4231 c 0,0.6269 -0.095,1.0652 -0.283,1.3164 -0.19,0.2507 -0.504,0.3769 -0.949,0.3769 -0.238,0 -0.487,-0.0723 -0.747,-0.2148 -0.26,-0.1438 -0.46,-0.3196 -0.599,-0.5274 l 0,-4.3742 -1.043,0 0,5.8848 0.713,0 0.33,-0.7578 c 0.343,0.5793 0.907,0.8683 1.687,0.8683 1.289,0 1.934,-0.7844 1.934,-2.3527 l 0,-3.6426 -1.043,0 m -10.714,2.9563 c 0,-1.4758 0.522,-2.2141 1.567,-2.2141 0.487,0 0.869,0.1973 1.145,0.593 0.277,0.3964 0.416,0.9363 0.416,1.6211 0,1.4578 -0.522,2.1875 -1.561,2.1875 -0.476,0 -0.857,-0.1946 -1.14,-0.5821 -0.286,-0.3898 -0.427,-0.9238 -0.427,-1.6054 m -1.099,0 c 0,0.9082 0.244,1.6414 0.735,2.2011 0.488,0.5586 1.132,0.8379 1.931,0.8379 0.842,0 1.496,-0.2687 1.961,-0.8047 0.465,-0.5371 0.697,-1.2824 0.697,-2.2343 0,-0.9493 -0.238,-1.6973 -0.712,-2.2454 -0.478,-0.5468 -1.127,-0.821 -1.946,-0.821 -0.84,0 -1.494,0.2761 -1.963,0.83 -0.468,0.5535 -0.703,1.2989 -0.703,2.2364 m -3.514,5.1543 c 0.18,0 0.333,-0.0625 0.459,-0.1895 0.127,-0.1262 0.19,-0.2773 0.19,-0.4531 0,-0.1809 -0.063,-0.3321 -0.19,-0.459 -0.126,-0.1262 -0.279,-0.1895 -0.459,-0.1895 -0.176,0 -0.328,0.0633 -0.454,0.1895 -0.127,0.1269 -0.19,0.2781 -0.19,0.459 0,0.1785 0.063,0.332 0.188,0.4558 0.125,0.1243 0.276,0.1868 0.456,0.1868 m -0.572,-8.1106 0,5.0059 -0.807,0 0,0.88 1.852,0 0,-5.8859 -1.045,0 m -6.36,5.0606 -0.683,0 0,0.8253 0.683,0 0,1.2293 1.044,0.4024 0,-1.6317 1.616,0 0,-0.8253 -1.616,0 0,-2.9227 c 0,-0.4953 0.083,-0.8457 0.25,-1.0547 0.166,-0.209 0.435,-0.3137 0.805,-0.3137 0.267,0 0.544,0.0676 0.83,0.2032 l 0.153,-0.918 c -0.433,-0.1094 -0.906,-0.1648 -1.423,-0.1648 -0.465,0 -0.858,0.1726 -1.18,0.5183 -0.319,0.3477 -0.479,0.7844 -0.479,1.3117 l 0,3.3407 m -4.8282,-2.17 c -0.3289,0.0735 -0.5598,0.1094 -0.6926,0.1094 -0.5269,0 -0.9566,-0.1355 -1.2906,-0.4062 -0.3344,-0.2715 -0.5,-0.5918 -0.5,-0.961 0,-0.6121 0.3602,-0.9179 1.0816,-0.9179 0.5286,0 0.9961,0.2511 1.4016,0.7531 l 0,1.4226 z m 0.0984,-2.2148 c -0.416,-0.5242 -1.0562,-0.7852 -1.9175,-0.7852 -0.4614,0 -0.8618,0.1672 -1.1997,0.502 -0.3394,0.3359 -0.5093,0.7519 -0.5093,1.2512 0,0.5964 0.2617,1.1003 0.7832,1.5125 0.5215,0.4121 1.1875,0.6191 1.9976,0.6191 0.2207,0 0.4692,-0.0477 0.7473,-0.1434 0,0.9532 -0.4246,1.4286 -1.2742,1.4286 -0.6528,0 -1.1543,-0.1758 -1.5063,-0.5274 l -0.439,0.8742 c 0.1968,0.161 0.4715,0.2989 0.8203,0.4141 0.3504,0.116 0.6851,0.1738 1.0039,0.1738 0.8531,0 1.4734,-0.1945 1.8601,-0.5832 0.386,-0.3875 0.5789,-1.0058 0.5789,-1.8515 l 0,-2.1102 c 0,-0.5168 0.1543,-0.8605 0.4622,-1.0324 l 0,-0.5223 c -0.4247,0 -0.743,0.0606 -0.9524,0.1816 -0.2105,0.12 -0.3633,0.3204 -0.4551,0.5985 m -7.2222,7.4348 c 0.1797,0 0.3316,-0.0625 0.459,-0.1895 0.1257,-0.1262 0.189,-0.2773 0.189,-0.4531 0,-0.1809 -0.0633,-0.3321 -0.189,-0.459 -0.1274,-0.1262 -0.2793,-0.1895 -0.459,-0.1895 -0.1758,0 -0.3262,0.0633 -0.4535,0.1895 -0.1266,0.1269 -0.1891,0.2781 -0.1891,0.459 0,0.1785 0.0613,0.332 0.1863,0.4558 0.1238,0.1243 0.2766,0.1868 0.4563,0.1868 m -0.5727,-8.1106 0,5.0059 -0.8074,0 0,0.88 1.8523,0 0,-5.8859 -1.0449,0 m -3.4043,5.4074 -0.5164,-0.7375 c -0.1062,0.1074 -0.293,0.2082 -0.5637,0.3028 -0.2683,0.0957 -0.5332,0.1437 -0.7925,0.1437 -0.5676,0 -1.0188,-0.1992 -1.3516,-0.5969 -0.3344,-0.3972 -0.5012,-0.9422 -0.5012,-1.6355 0,-0.6875 0.1707,-1.2129 0.5125,-1.5734 0.3403,-0.3614 0.8125,-0.5411 1.416,-0.5411 0.4692,0 0.9426,0.1809 1.418,0.5442 l 0.4121,-0.8789 c -0.5594,-0.3633 -1.2547,-0.5449 -2.0816,-0.5449 -0.8031,0 -1.466,0.2695 -1.9906,0.8085 -0.5235,0.5379 -0.7848,1.2665 -0.7848,2.1856 0,0.9383 0.2715,1.6914 0.8152,2.2598 0.5442,0.5671 1.2891,0.8515 2.2344,0.8515 0.3035,0 0.634,-0.0644 0.9894,-0.1926 0.3551,-0.1289 0.6168,-0.2605 0.7848,-0.3953 M 75.4602,26.9352 c 0,-1.4758 0.5218,-2.2141 1.5664,-2.2141 0.4867,0 0.8683,0.1973 1.1457,0.593 0.2769,0.3964 0.4144,0.9363 0.4144,1.6211 0,1.4578 -0.5207,2.1875 -1.5601,2.1875 -0.4762,0 -0.8578,-0.1946 -1.1403,-0.5821 -0.2843,-0.3898 -0.4261,-0.9238 -0.4261,-1.6054 m -1.0989,0 c 0,0.9082 0.2438,1.6414 0.734,2.2011 0.4887,0.5586 1.1328,0.8379 1.9313,0.8379 0.8425,0 1.4953,-0.2687 1.9617,-0.8047 0.4648,-0.5371 0.6976,-1.2824 0.6976,-2.2343 0,-0.9493 -0.2386,-1.6973 -0.7148,-2.2454 -0.4762,-0.5468 -1.125,-0.821 -1.9445,-0.821 -0.8395,0 -1.4934,0.2761 -1.9625,0.83 -0.4688,0.5535 -0.7028,1.2989 -0.7028,2.2364 m -6.3222,-2.6047 0.3675,0.9894 c 0.5832,-0.3808 1.0524,-0.5715 1.4075,-0.5715 0.6449,0 0.9668,0.2715 0.9668,0.8137 0,0.3875 -0.3114,0.7207 -0.934,1 -0.4801,0.2195 -0.8031,0.3856 -0.9699,0.5 -0.1668,0.1121 -0.311,0.243 -0.434,0.3867 -0.1231,0.1446 -0.2141,0.2989 -0.275,0.4617 -0.0602,0.1633 -0.0914,0.3379 -0.0914,0.5254 0,0.4825 0.1761,0.8594 0.5285,1.1309 0.3519,0.2715 0.8121,0.4082 1.3789,0.4082 0.4293,0 0.9687,-0.1367 1.6211,-0.4082 L 71.309,28.6012 c -0.4141,0.3289 -0.8301,0.4929 -1.2481,0.4929 -0.2488,0 -0.4589,-0.0574 -0.6293,-0.1757 -0.1699,-0.1172 -0.2558,-0.2645 -0.2558,-0.4442 0,-0.3769 0.2148,-0.6633 0.643,-0.8574 l 0.748,-0.341 c 0.4582,-0.209 0.791,-0.4473 1,-0.7137 0.209,-0.2687 0.3133,-0.6035 0.3133,-1.0051 0,-0.5281 -0.1852,-0.9414 -0.5555,-1.2402 -0.3695,-0.2977 -0.8828,-0.448 -1.5379,-0.448 -0.6195,0 -1.2015,0.1542 -1.7476,0.4617 m -6.3227,0 0.368,0.9894 c 0.5832,-0.3808 1.0519,-0.5715 1.4066,-0.5715 0.6453,0 0.9676,0.2715 0.9676,0.8137 0,0.3875 -0.3109,0.7207 -0.9344,1 -0.4797,0.2195 -0.8023,0.3856 -0.9695,0.5 -0.1668,0.1121 -0.3109,0.243 -0.434,0.3867 -0.123,0.1446 -0.2145,0.2989 -0.2754,0.4617 -0.0598,0.1633 -0.091,0.3379 -0.091,0.5254 0,0.4825 0.1773,0.8594 0.5277,1.1309 0.3524,0.2715 0.8121,0.4082 1.3797,0.4082 0.4285,0 0.9688,-0.1367 1.6203,-0.4082 l -0.2957,-0.9656 c -0.414,0.3289 -0.8301,0.4929 -1.248,0.4929 -0.2488,0 -0.459,-0.0574 -0.6289,-0.1757 -0.1699,-0.1172 -0.2547,-0.2645 -0.2547,-0.4442 0,-0.3769 0.2137,-0.6633 0.6418,-0.8574 l 0.748,-0.341 c 0.4582,-0.209 0.791,-0.4473 1,-0.7137 0.209,-0.2687 0.3129,-0.6035 0.3129,-1.0051 0,-0.5281 -0.1847,-0.9414 -0.5551,-1.2402 -0.3699,-0.2977 -0.8828,-0.448 -1.5378,-0.448 -0.6204,0 -1.2016,0.1542 -1.7481,0.4617 m -5.3769,5.6984 -1.2473,-3.5441 2.3902,0 -1.1429,3.5441 z m 2.0113,-6.05 -0.5555,1.6973 -2.9941,0 -0.5938,-1.6973 -1.2308,0 3.2699,8.1602 0.291,0 3.0328,-8.1602 -1.2195,0 m -15.8039,0.9336 3.264,0 0,-0.9336 -4.9023,0 0,0.2746 3.3473,4.6766 -3.2918,0 0,0.9336 4.8136,0 0,-0.2969 -3.2308,-4.6543 m -5.0149,7.177 c 0.1793,0 0.3325,-0.0625 0.4598,-0.1895 0.1258,-0.1262 0.1891,-0.2773 0.1891,-0.4531 0,-0.1809 -0.0633,-0.3321 -0.1891,-0.459 -0.1273,-0.1262 -0.2805,-0.1895 -0.4598,-0.1895 -0.1758,0 -0.3265,0.0633 -0.4523,0.1895 -0.127,0.1269 -0.1902,0.2781 -0.1902,0.459 0,0.1785 0.0621,0.332 0.1871,0.4558 0.1242,0.1243 0.2757,0.1868 0.4554,0.1868 m -0.5707,-8.1106 0,5.0059 -0.8082,0 0,0.88 1.8512,0 0,-5.8859 -1.043,0 m -4.8008,0 0,3.4231 c 0,0.6269 -0.0937,1.0652 -0.2832,1.3164 -0.1886,0.2507 -0.5046,0.3769 -0.9476,0.3769 -0.2379,0 -0.4867,-0.0723 -0.7473,-0.2148 -0.2594,-0.1438 -0.4597,-0.3196 -0.5988,-0.5274 l 0,-4.3742 -1.0441,0 0,5.8848 0.714,0 0.3301,-0.7578 c 0.3441,0.5793 0.9062,0.8683 1.6867,0.8683 1.2895,0 1.9344,-0.7844 1.9344,-2.3527 l 0,-3.6426 -1.0442,0 m -10.6136,4.6543 0,-3.3965 c 0,-0.0586 0.1301,-0.1543 0.3894,-0.2879 0.2606,-0.134 0.4582,-0.2004 0.5946,-0.2004 0.7097,0 1.2203,0.17 1.5265,0.511 0.3082,0.3406 0.4621,0.9121 0.4621,1.7136 0,0.6672 -0.1797,1.1875 -0.5386,1.5618 -0.3594,0.373 -0.8422,0.5605 -1.45,0.5605 -0.1289,0 -0.3075,-0.0558 -0.5364,-0.1652 -0.2289,-0.1102 -0.3777,-0.209 -0.4476,-0.2969 m -0.1543,-4.2312 -0.3676,-0.5325 -0.5223,0 0,8.4063 1.0442,0 0,-2.8457 c 0.0992,0.1347 0.2847,0.2597 0.5582,0.373 0.2726,0.1145 0.541,0.1711 0.8047,0.1711 0.8058,0 1.459,-0.2793 1.959,-0.8351 0.5,-0.5567 0.75,-1.2606 0.75,-2.1114 0,-0.9804 -0.2512,-1.7539 -0.7532,-2.3152 -0.5019,-0.5625 -1.1808,-0.843 -2.039,-0.843 -0.2778,0 -0.5516,0.052 -0.8207,0.1555 -0.2692,0.1055 -0.4743,0.2305 -0.6133,0.377 m -4.7887,7.6875 c 0.1789,0 0.332,-0.0625 0.459,-0.1895 0.1262,-0.1262 0.1891,-0.2773 0.1891,-0.4531 0,-0.1809 -0.0629,-0.3321 -0.1891,-0.459 -0.127,-0.1262 -0.2801,-0.1895 -0.459,-0.1895 -0.1762,0 -0.3269,0.0633 -0.4531,0.1895 -0.127,0.1269 -0.1899,0.2781 -0.1899,0.459 0,0.1785 0.0621,0.332 0.1871,0.4558 0.1239,0.1243 0.2758,0.1868 0.4559,0.1868 m -0.5723,-8.1106 0,5.0059 -0.8066,0 0,0.88 1.8512,0 0,-5.8859 -1.0446,0 m -5.9863,5.1164 c -0.46522,0 -0.85468,-0.1504 -1.16991,-0.4512 C 8.57422,28.3578 8.4043,28.0035 8.36445,27.5785 l 3.25785,0 c 0,0.4211 -0.1321,0.7727 -0.3953,1.0539 -0.2895,0.3086 -0.6836,0.4629 -1.1817,0.4629 m 2.5328,-2.2754 -4.24177,0 c 0,-0.6894 0.18906,-1.2179 0.56601,-1.5879 0.33282,-0.3222 0.76172,-0.4843 1.28636,-0.4843 0.5965,0 1.0945,0.1738 1.4945,0.5234 l 0.4391,-0.7539 C 11.9613,24.3559 11.7145,24.2164 11.3805,24.1 10.9633,23.9457 10.4973,23.8688 9.98438,23.8688 c -0.74024,0 -1.36836,0.2507 -1.88438,0.7527 -0.57461,0.5527 -0.86289,1.2969 -0.86289,2.2316 0,0.9707 0.29531,1.7489 0.88516,2.3348 0.52695,0.5234 1.15195,0.7863 1.87382,0.7863 0.83831,0 1.49611,-0.2363 1.97231,-0.709 0.4617,-0.4543 0.6925,-1.0578 0.6925,-1.8086 0,-0.2296 -0.0277,-0.4425 -0.0828,-0.6367 m -12.338647,5.209 0,-8.05 4.736717,0 0,0.9883 -3.63789,0 0,7.0617 -1.098827,0"
+       style="fill:#1c63b7;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path6"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 143.468,68.5855 c -1.512,0.625 -6.024,-1.707 -4.672,-5.5917 1.379,-3.97 11.623,2.7214 4.672,5.5917 m 5.394,-45.3996 c 0,0 -5.946,-11.4519 -6.605,-12.4675 -0.801,-1.23246 -4.947,-7.19535 -11.02,-8.0352 -6.073,-0.83906 -9.394,2.67461 -9.33,4.80547 0.065,2.13086 2.048,4.91993 8.699,8.21993 14.915,7.3906 16.228,7.9578 16.228,7.9578 1.077,0.4258 3.382,1.7961 2.028,-0.4805 m 0.649,27.877 c -0.02,-0.0711 -0.038,-0.1328 -0.054,-0.1797 l 0.054,0.1797 z m 9.347,-18.2527 c -0.25,0.6894 -0.759,1.6101 -2.805,-0.9055 -3.137,-3.8504 -2.713,-1.4238 -3.008,1.0996 -0.05,0.4258 0.26,1.5762 -1.892,3.3926 -1.123,0.9504 -6.356,2.4082 -5.175,3.6054 3.009,3.0539 2.222,2.7559 3.32,4.1125 1.099,1.3575 5.168,5.3622 4.974,11.0457 -0.193,5.6856 -8.397,5.17 -8.397,5.17 -5.362,-0.9707 -3.101,-5.8797 0.774,-5.5555 3.614,0.2996 3.135,-2.7336 2.862,-3.7109 -0.002,-0.0071 -0.449,-1.1817 -1.345,-2.595 -1.201,-1.8933 -2.681,-4.6152 -4.104,-5.9929 -0.774,-0.7512 -4.93,-3.4016 -1.934,-4.8848 4.97,-2.4629 8.722,-7.6875 6.783,-10.5957 -1.938,-2.9055 -17.182,-8.6867 -20.349,-10.0762 -3.066,-1.3476 -9.108,-1.7441 -8.98,-9.62497 0.129,-7.880468 8.53,-7.812499 12.21,-6.848436 6.436,1.685936 9.122,4.196096 11.562,6.977346 2.594,2.95586 7.752,14.66406 7.881,14.79296 0.131,0.1297 1.81,6.9129 4.781,7.6875 2.971,0.7742 3.205,1.8992 2.842,2.9063 m -71.535,38.239 c -0.4042,-4.2801 2.2317,-2.8906 2.2317,-2.8906 4.9031,2.5246 1.0246,4.8652 1.0246,4.8652 0,0 -2.8527,2.3047 -3.2563,-1.9746 m 16.063,-14.334 c -0.514,-0.8047 -1.42,1.0664 -3.254,-1.2664 -0.7636,-0.9707 -0.2851,-2.1554 -1.2211,-3.1945 -1.0449,-1.1609 -1.939,-2.0672 -1.0972,1.1621 0.8394,3.2316 0.5437,1.8711 1.0625,3.0742 0.5078,1.1797 2.7698,7.1739 2.9428,7.6504 0.098,0.2735 2.085,4.1633 4.11,7.1047 0,0 5.451,4.8125 3.254,-3.8742 -1.473,-5.8242 -3.131,-6.4695 -5.797,-10.6563 m 0.112,-8.4004 c -0.711,-2.5847 -1.758,-6.8554 -2.946,-7.9558 -1.0469,-0.9699 -2.4329,-3.4141 -3.6516,1.043 -1.2195,4.4578 1.9465,8.2039 1.9465,8.2039 0,0 1.3441,1.8086 2.1971,1.7277 1.049,-0.0988 3.166,-0.4356 2.454,-3.0188 M 36.7152,48.816 c -0.441,-0.1848 -1.6754,0.8778 -1.6289,1.4356 0.091,1.0925 1.2219,-0.0332 2.5199,0 1.3192,0.0339 -0.425,-1.2414 -0.891,-1.4356 m 33.966,38.3211 c 12.4024,11.341 12.0551,11.0402 13.05,11.4356 1.1883,0.4707 5.4985,2.4493 6.3286,1.4853 1.0183,-1.1795 1.1004,-3.9404 -1.0957,-6.1365 -2.1973,-2.1973 -9.4243,-9.5742 -13.9539,-11.4348 -4.2969,-1.7644 -19.0278,-8.7879 -4.329,4.6504 M 123.745,44.0648 c 1.118,-0.9207 2.237,-2.3691 6.251,1.3821 4.015,3.7508 1.974,2.1719 4.148,-2.7649 2.171,-4.9343 3.548,-2.2136 3.684,-1.2508 0.338,2.4102 -0.399,7.1376 -0.905,9.0555 -0.425,1.6125 -3.189,2.4094 -4.293,1.6067 -1.045,-0.7579 -3.817,-3.8829 -5.662,-4.4746 -1.842,-0.5918 -0.381,1.1835 -0.842,4.1453 -0.462,2.9621 -1.548,4.3058 -2.707,3.8066 -0.781,-0.3367 -2.49,-2.0848 -3.293,-1.6348 -1.558,0.877 -2.638,4.6418 -10.266,0.4621 -8.884,-4.8703 -0.922,6.1844 -0.922,6.1844 0,0 5.923,8.0949 2.37,13.9524 -3.553,5.8562 -11.189,-6.7129 -11.189,-6.7129 0,0 -4.0128,-7.9629 -5.7897,-16.386 -1.7773,-8.4246 -5.4082,-7.4707 -6.7695,-5.6679 -1.4715,1.9492 -1.0625,9.6152 -6.3262,6.3906 -5.2645,-3.2234 -5.1992,-9.6738 -8.3582,-2.368 -3.159,7.3035 -6.4805,2.6121 -6.9102,1.8426 -0.6007,-1.077 -0.2898,-3.4375 -1.184,-3.948 -1.0078,-0.5774 -2.266,1.4929 -3.0269,1.7753 -0.8191,0.3036 -6.1359,-4.664 -8.5523,-9.2695 -3.4809,-6.6379 -9.0649,9.3223 -8.5227,10.3203 0.475,0.875 14.0781,19.7098 15.3633,22.4434 1.3367,2.8426 3.2894,3.6863 4.2777,3.8191 0.9867,0.1321 13.5563,2.2375 22.6399,11.8457 9.0808,9.6086 7.6992,11.9775 3.355,14.4135 -4.3429,2.433 -16.725,-9.6955 -17.309,-10.135 C 72.5836,92.5777 62.3453,81.0512 61.6223,79.6039 60.8984,78.1559 44.0512,79.0777 44.0512,79.0777 c -1.9539,-0.9562 0.209,-1.7578 0.209,-1.7578 0,0 7.5574,-1.0988 12.2742,-0.9707 4.716,0.1309 1.6008,-2.6262 1.0449,-3.2844 -3.652,-4.3281 -10.5422,-16.0945 -12.9973,-18.5496 -2.4535,-2.4531 -7.1578,0.2782 -7.4277,0.3231 -0.2777,0.0461 -7.2996,1.0988 -5.8789,-4.2625 1.4219,-5.3625 5.6879,-2.9824 7.7519,-3.4883 0.6329,-0.1563 1.527,-1.2578 1.8731,-1.8086 1.0461,-1.6641 1.541,-4.3019 2.6379,-5.9328 1.6058,-2.3867 7.698,-8.3125 12.4148,0.2473 4.8949,8.8847 8.0102,5.5554 8.2692,0.7097 0.2589,-4.8445 1.8089,-3.0351 3.5531,-2.2605 1.7437,0.7754 0.2578,4.1355 0.4508,8.5273 0.1941,4.3934 3.8121,-1.9375 3.5543,-3.6828 -0.2578,-1.743 2.4539,-1.4207 4.8461,-0.4512 2.3894,0.9688 0.5156,2.4543 3.8093,5.4903 3.2953,3.0371 3.4618,-4.0899 4.3235,-5.752 0.691,-1.334 4.139,-4.1316 5.8844,-0.3836 1.7441,3.7461 4.4734,2.9324 3.8804,-0.8847 -0.5933,-3.8176 2.6914,-5.3184 3.7524,-5.2657 1.0066,0.0516 6.7794,3.2254 6.8434,9.6082 0.067,6.3848 4.631,6.3477 5.397,6.4493 0.772,0.1035 6.646,1.0539 6.121,-0.6571 -0.527,-1.7101 -3.16,-6.6457 -0.133,-6.5812 3.027,0.0656 1.777,2.6984 4.607,5.6594 2.829,2.9617 1.514,-5.1321 2.633,-6.054"
+       style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path8"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 67.2047,98.6945 c -0.0215,0.3867 -0.0699,0.7024 -0.1449,0.9481 -0.0754,0.2453 -0.1883,0.4334 -0.3387,0.5634 -0.1504,0.131 -0.3473,0.196 -0.5906,0.196 -0.3688,0 -0.6633,-0.147 -0.884,-0.443 -0.2195,-0.2949 -0.3496,-0.7168 -0.3891,-1.2645 l 2.3473,0 z m 0.9023,-2.1808 c -0.2293,-0.2399 -0.4394,-0.4278 -0.6308,-0.5641 -0.1918,-0.1359 -0.4024,-0.2426 -0.6317,-0.3195 -0.2289,-0.077 -0.4812,-0.1153 -0.757,-0.1153 -0.7379,0 -1.2945,0.2211 -1.6703,0.6629 -0.3762,0.4426 -0.5641,1.0953 -0.5641,1.9582 0,0.5336 0.0957,1.0043 0.2871,1.4125 0.1918,0.4082 0.4649,0.7226 0.8192,0.9456 0.3547,0.222 0.7629,0.333 1.2246,0.333 0.3621,0 0.6695,-0.057 0.9238,-0.172 0.2543,-0.115 0.4574,-0.271 0.6094,-0.47 0.1523,-0.1987 0.2707,-0.4495 0.3547,-0.7522 0.0843,-0.3023 0.1316,-0.6973 0.1426,-1.1844 l -3.384,0 0,-0.0964 c 0,-0.4223 0.0472,-0.7778 0.1425,-1.0661 0.095,-0.2886 0.2504,-0.514 0.4668,-0.6765 0.2168,-0.1633 0.4993,-0.2449 0.8461,-0.2449 0.2938,0 0.5579,0.0546 0.7926,0.1636 0.2344,0.1094 0.468,0.2875 0.7008,0.5348 l 0.3277,-0.3492 m -8.9215,3.3785 0.0215,-0.0055 c 0.2793,0.2833 0.5004,0.4803 0.6637,0.5933 0.1625,0.113 0.3234,0.198 0.4832,0.256 0.1594,0.057 0.3301,0.085 0.5129,0.085 0.1969,0 0.3727,-0.023 0.5262,-0.069 0.1539,-0.047 0.289,-0.118 0.4054,-0.213 0.1164,-0.094 0.2114,-0.211 0.2852,-0.348 0.073,-0.139 0.1277,-0.3031 0.1637,-0.4945 0.0355,-0.1922 0.0535,-0.4348 0.0535,-0.7281 l 0,-2.025 c 0,-0.3114 0.0133,-0.5235 0.0406,-0.6368 0.0262,-0.1121 0.075,-0.2 0.1445,-0.2625 0.0703,-0.0632 0.2106,-0.123 0.4219,-0.1804 l 0,-0.2629 -2.1164,0 0,0.2629 c 0.1398,0.0429 0.2398,0.0808 0.3008,0.1129 0.0609,0.0324 0.1121,0.0773 0.1535,0.1343 0.041,0.0571 0.0731,0.1461 0.0965,0.2661 0.023,0.1195 0.0348,0.3011 0.0348,0.5449 l 0,1.4074 c 0,0.4758 -0.0239,0.8406 -0.0727,1.0926 -0.0481,0.2531 -0.1434,0.4414 -0.2844,0.5668 -0.1414,0.1253 -0.339,0.1883 -0.5937,0.1883 -0.143,0 -0.2719,-0.025 -0.3867,-0.075 -0.1149,-0.051 -0.2469,-0.1399 -0.3973,-0.2688 -0.1504,-0.1289 -0.2645,-0.2613 -0.341,-0.3977 -0.077,-0.1363 -0.1157,-0.2812 -0.1157,-0.4351 l 0,-2.057 c 0,-0.2438 0.0063,-0.4168 0.0192,-0.5211 0.0121,-0.1039 0.0363,-0.1907 0.0723,-0.2602 0.0355,-0.0703 0.0902,-0.1273 0.164,-0.1719 0.0731,-0.0449 0.1867,-0.0867 0.3406,-0.1265 l 0,-0.2629 -2.1269,0 0,0.2629 c 0.1578,0.0429 0.2707,0.084 0.3387,0.1238 0.0675,0.0395 0.1203,0.0891 0.1586,0.1504 0.0371,0.0609 0.0648,0.1484 0.0828,0.2629 0.0179,0.1148 0.0269,0.2957 0.0269,0.5426 l 0,4.4956 c 0,0.344 -0.0023,0.584 -0.0082,0.72 -0.0051,0.136 -0.0195,0.251 -0.043,0.346 -0.023,0.095 -0.055,0.169 -0.0968,0.223 -0.041,0.054 -0.0965,0.097 -0.166,0.129 -0.0704,0.032 -0.1961,0.064 -0.3789,0.097 l 0,0.279 1.2945,0.054 0.3222,0 0,-3.3948 m -5.4839,0.5748 c 0.1793,0.029 0.3242,0.078 0.4351,0.15 0.111,0.072 0.1977,0.164 0.261,0.277 0.0625,0.113 0.1117,0.254 0.1472,0.424 0.0356,0.17 0.0735,0.418 0.1129,0.744 l 0.7625,0 0,-1.326 1.7352,0 0,-0.543 -1.7352,0 0,-2.3903 c 0,-0.3472 0.0145,-0.6238 0.043,-0.83 0.0289,-0.2055 0.0828,-0.3668 0.1613,-0.4832 0.0785,-0.1165 0.1684,-0.1993 0.2684,-0.2497 0.1004,-0.0503 0.2293,-0.0753 0.3867,-0.0753 0.1433,0 0.2773,0.03 0.4027,0.0886 0.1258,0.0594 0.2492,0.1446 0.3707,0.2551 l 0.2418,-0.2898 c -0.2543,-0.2473 -0.4953,-0.4262 -0.7226,-0.5372 -0.227,-0.1109 -0.4625,-0.1664 -0.7063,-0.1664 -0.4617,0 -0.8055,0.1368 -1.0308,0.411 -0.2258,0.2734 -0.3387,0.7027 -0.3387,1.2863 l 0,2.9809 -0.7949,0 0,0.274 m -46.01058,2.454 -1.81485,0 -2.07422,-5.2261 -1.88515,5.2261 -1.9168,0 0,-0.262 c 0.164062,-0.048 0.280859,-0.09 0.349219,-0.127 0.067578,-0.037 0.121484,-0.088 0.163281,-0.151 0.041406,-0.062 0.070703,-0.15 0.088672,-0.262 0.017578,-0.114 0.026953,-0.293 0.026953,-0.54 l 0,-4.647 c 0,-0.2644 -0.0125,-0.4617 -0.035547,-0.5906 C 0.569922,96.2133 0.521094,96.1129 0.444922,96.0434 0.369922,95.973 0.221875,95.9105 0,95.8531 l 0,-0.2636 1.95977,0 0,0.2636 c -0.16485,0.043 -0.28399,0.086 -0.35665,0.1289 -0.07421,0.043 -0.1289,0.0965 -0.16718,0.161 -0.03711,0.0644 -0.06406,0.1523 -0.08008,0.2629 -0.01602,0.1113 -0.02383,0.2859 -0.02383,0.5261 l 0,1.966 c 0,0.6055 -0.0082,1.194 -0.025,1.768 -0.01601,0.572 -0.0332,0.968 -0.05117,1.186 l 0.0918,0 1.97617,-5.409 0.61797,0 2.12695,5.323 0.09102,0 C 6.13867,101.562 6.12031,101.183 6.10391,100.63 6.08789,100.078 6.08008,99.5297 6.08008,98.9887 l 0,-2.0567 c 0,-0.2898 -0.01524,-0.498 -0.04297,-0.623 C 6.00781,96.184 5.95391,96.0895 5.87617,96.025 5.79688,95.9605 5.65469,95.9027 5.45078,95.8531 l 0,-0.2636 2.24024,0 0,0.2636 C 7.52578,95.8961 7.40664,95.9391 7.33398,95.982 7.25977,96.025 7.20508,96.0785 7.1668,96.143 7.12969,96.2074 7.10312,96.2953 7.08672,96.4059 7.0707,96.5172 7.06289,96.6918 7.06289,96.932 l 0,4.647 c 0,0.247 0.00899,0.429 0.02891,0.548 0.01992,0.118 0.05039,0.207 0.0914,0.265 0.0418,0.06 0.09649,0.108 0.1668,0.149 0.06992,0.039 0.18281,0.078 0.34102,0.118 l 0,0.262 z M 12.8258,96.852 C 12.593,96.6051 12.359,96.4262 12.125,96.3168 c -0.2348,-0.1082 -0.4988,-0.1641 -0.7922,-0.1641 -0.348,0 -0.6297,0.0821 -0.8461,0.2453 -0.2168,0.1629 -0.373,0.3887 -0.4676,0.6778 -0.09527,0.2871 -0.14215,0.6426 -0.14215,1.0652 l 0,0.0957 3.38355,0 c -0.0105,0.4875 -0.0574,0.8828 -0.1429,1.1856 -0.084,0.3019 -0.2016,0.5527 -0.3539,0.7517 -0.152,0.199 -0.3551,0.355 -0.6098,0.47 -0.2539,0.114 -0.5621,0.172 -0.923,0.172 -0.4618,0 -0.8711,-0.111 -1.225,-0.333 C 9.65078,100.26 9.37812,99.9449 9.18711,99.5375 8.99531,99.1293 8.89883,98.6586 8.89883,98.1254 c 0,-0.8633 0.18789,-1.5164 0.56406,-1.9578 0.37617,-0.4426 0.93321,-0.6633 1.67111,-0.6633 0.2758,0 0.5281,0.0383 0.757,0.1152 0.2289,0.0762 0.4402,0.1828 0.6309,0.3196 0.1922,0.1367 0.4019,0.3242 0.6308,0.5644 l -0.3269,0.3485 z m -2.92189,1.8312 c 0.03906,0.5477 0.16879,0.9695 0.38909,1.2645 0.2207,0.2973 0.5152,0.4433 0.884,0.4433 0.2429,0 0.4398,-0.064 0.591,-0.196 0.15,-0.131 0.2629,-0.3184 0.3379,-0.5638 0.075,-0.2449 0.1242,-0.5613 0.1453,-0.948 l -2.34729,0 z m 5.83279,2.0898 -0.3281,0 -1.2566,-0.049 0,-0.284 c 0.1621,-0.028 0.2859,-0.063 0.3738,-0.104 0.0871,-0.041 0.1527,-0.105 0.1961,-0.189 0.0433,-0.084 0.0679,-0.1954 0.075,-0.3361 0.0066,-0.1394 0.0113,-0.3242 0.0113,-0.5527 l 0,-2.3418 c 0,-0.2508 -0.0113,-0.4355 -0.0332,-0.5535 -0.0211,-0.1172 -0.0531,-0.2063 -0.0965,-0.2629 -0.043,-0.0574 -0.0933,-0.1016 -0.1527,-0.1348 -0.059,-0.032 -0.157,-0.0691 -0.293,-0.1121 l 0,-0.2636 2.1051,0 0,0.2636 c -0.1317,0.0352 -0.2309,0.0703 -0.2981,0.1043 -0.0656,0.0332 -0.1168,0.0696 -0.1531,0.1074 -0.0355,0.0372 -0.0648,0.0872 -0.0879,0.1485 -0.0238,0.0597 -0.041,0.1445 -0.0508,0.2519 -0.0113,0.1067 -0.016,0.2629 -0.016,0.4668 l 0,2.0137 c 0,0.1582 0.034,0.3059 0.102,0.4414 0.068,0.1359 0.1687,0.2668 0.3027,0.3918 0.1344,0.125 0.266,0.2211 0.3949,0.2871 0.1293,0.066 0.2672,0.1 0.4133,0.1 0.1039,0 0.1973,-0.01 0.2801,-0.03 0.082,-0.02 0.1539,-0.048 0.2148,-0.089 0.0602,-0.039 0.1204,-0.0954 0.179,-0.1704 0.0597,-0.0762 0.1082,-0.1739 0.1449,-0.2961 0.0383,-0.1219 0.0664,-0.2832 0.084,-0.4832 0.0179,-0.2012 0.0273,-0.4602 0.0273,-0.7793 l 0,-1.4063 c 0,-0.2441 -0.0121,-0.4258 -0.0352,-0.5461 -0.0238,-0.1191 -0.0562,-0.209 -0.0972,-0.2656 -0.041,-0.0574 -0.0918,-0.1016 -0.1528,-0.1348 -0.0609,-0.032 -0.1613,-0.0691 -0.3007,-0.1121 l 0,-0.2636 2.1109,0 0,0.2636 c -0.1613,0.043 -0.2762,0.0848 -0.3441,0.1258 -0.068,0.041 -0.1188,0.0899 -0.1532,0.1484 -0.0339,0.0567 -0.0597,0.1368 -0.0781,0.2415 -0.0176,0.1035 -0.0266,0.2917 -0.0266,0.5632 l 0,1.961 c 0,0.1867 0.0332,0.3476 0.0969,0.4863 0.0653,0.1379 0.1692,0.2746 0.3141,0.4113 0.1449,0.1356 0.2797,0.2314 0.4027,0.2894 0.1242,0.057 0.2571,0.086 0.4,0.086 0.1363,0 0.2461,-0.015 0.3281,-0.043 0.0821,-0.029 0.154,-0.068 0.2149,-0.119 0.0609,-0.0493 0.1152,-0.1091 0.1641,-0.1763 0.0484,-0.0683 0.0894,-0.1613 0.123,-0.2793 0.0344,-0.1183 0.059,-0.2773 0.0754,-0.4757 0.016,-0.1981 0.0238,-0.45 0.0238,-0.7547 l 0,-1.4063 c 0,-0.2441 -0.0113,-0.4258 -0.0344,-0.5461 -0.0238,-0.1191 -0.0554,-0.209 -0.0964,-0.2656 -0.0411,-0.0574 -0.0922,-0.1016 -0.1536,-0.1348 -0.0609,-0.032 -0.1605,-0.0691 -0.3007,-0.1121 l 0,-0.2636 2.1109,0 0,0.2636 c -0.1609,0.043 -0.2758,0.0848 -0.3438,0.1258 -0.0683,0.041 -0.1191,0.0899 -0.1535,0.1484 -0.0336,0.0567 -0.0597,0.1368 -0.0773,0.2415 -0.0184,0.1035 -0.0274,0.2917 -0.0274,0.5632 l 0,2.0254 c 0,0.3692 -0.0269,0.6633 -0.0832,0.8809 -0.0546,0.2177 -0.1429,0.3997 -0.2625,0.5447 -0.1203,0.145 -0.2671,0.253 -0.441,0.322 -0.1734,0.07 -0.3804,0.105 -0.6203,0.105 -0.2,0 -0.3879,-0.035 -0.5609,-0.105 -0.1742,-0.069 -0.3442,-0.168 -0.5102,-0.298 -0.1672,-0.129 -0.384,-0.328 -0.6527,-0.6008 -0.086,0.3398 -0.2422,0.5918 -0.4668,0.7568 -0.2262,0.165 -0.5184,0.247 -0.8762,0.247 -0.118,0 -0.2332,-0.014 -0.3461,-0.043 -0.1129,-0.029 -0.234,-0.076 -0.3629,-0.142 -0.1293,-0.066 -0.2621,-0.154 -0.4004,-0.263 -0.1375,-0.11 -0.3136,-0.272 -0.5289,-0.4854 l -0.075,0.0203 0.059,0.8761 z m 8.9961,2.502 -0.3156,0 -1.3004,-0.053 0,-0.28 c 0.182,-0.031 0.309,-0.063 0.3781,-0.096 0.0699,-0.032 0.1262,-0.075 0.1672,-0.129 0.041,-0.053 0.0727,-0.128 0.0969,-0.222 0.0226,-0.096 0.0371,-0.21 0.043,-0.347 0.005,-0.137 0.0082,-0.376 0.0082,-0.72 l 0,-5.8385 0.3695,-0.0852 0.3762,0.3273 c 0.2582,-0.1222 0.5043,-0.207 0.739,-0.255 0.234,-0.0489 0.484,-0.0723 0.7489,-0.0723 0.4734,0 0.882,0.1016 1.2273,0.3078 0.3457,0.2059 0.6066,0.5106 0.7848,0.9129 0.1769,0.4035 0.2648,0.8977 0.2648,1.4805 0,0.5656 -0.0734,1.0441 -0.223,1.4336 -0.1481,0.3909 -0.359,0.6829 -0.6329,0.8779 -0.2738,0.196 -0.6031,0.293 -0.9859,0.293 -0.2109,0 -0.4051,-0.031 -0.5828,-0.094 -0.1773,-0.063 -0.3492,-0.153 -0.5152,-0.271 -0.1668,-0.117 -0.375,-0.308 -0.6258,-0.5684 l -0.0223,0.0046 0,3.3938 z m 0,-4.3293 c 0,0.1652 0.0344,0.3125 0.1,0.4414 0.066,0.1289 0.1699,0.259 0.3113,0.3918 0.1418,0.1328 0.2836,0.2301 0.4266,0.2931 0.1441,0.062 0.3172,0.094 0.5211,0.094 0.4094,0 0.7141,-0.1793 0.916,-0.5348 0.2024,-0.3562 0.3043,-0.8886 0.3043,-1.5976 0,-0.702 -0.1113,-1.2285 -0.3332,-1.5789 -0.2223,-0.3516 -0.548,-0.5266 -0.9777,-0.5266 -0.1723,0 -0.3282,0.0168 -0.4676,0.0508 -0.1395,0.0344 -0.2656,0.0969 -0.3789,0.1856 -0.1125,0.0898 -0.1985,0.1875 -0.2578,0.296 -0.059,0.1063 -0.1008,0.2422 -0.1258,0.4043 -0.025,0.1629 -0.0383,0.3829 -0.0383,0.6582 l 0,1.4227 z m 8.632,-2.0937 c -0.2332,-0.2469 -0.4668,-0.4258 -0.7007,-0.5352 -0.2356,-0.1082 -0.4993,-0.1641 -0.7918,-0.1641 -0.3485,0 -0.6305,0.0821 -0.8465,0.2453 -0.2168,0.1629 -0.3731,0.3887 -0.4676,0.6778 -0.0941,0.2871 -0.1422,0.6426 -0.1422,1.0652 l 0,0.0957 3.3836,0 c -0.0105,0.4875 -0.0578,0.8828 -0.1418,1.1856 -0.0851,0.3019 -0.2027,0.5527 -0.3551,0.7517 -0.1519,0.199 -0.355,0.355 -0.6097,0.47 -0.2539,0.114 -0.5621,0.172 -0.9231,0.172 -0.4617,0 -0.8711,-0.111 -1.225,-0.333 -0.3539,-0.223 -0.6277,-0.5381 -0.8187,-0.9455 -0.1926,-0.4082 -0.2871,-0.8789 -0.2871,-1.4121 0,-0.8633 0.1879,-1.5164 0.5636,-1.9578 0.3762,-0.4426 0.9325,-0.6633 1.6703,-0.6633 0.2758,0 0.5278,0.0383 0.7567,0.1152 0.2289,0.0762 0.4402,0.1828 0.6312,0.3196 0.1918,0.1367 0.402,0.3242 0.6309,0.5644 l -0.327,0.3485 z m -2.9218,1.8312 c 0.039,0.5477 0.1687,0.9695 0.389,1.2645 0.2207,0.2973 0.5149,0.4433 0.8836,0.4433 0.2434,0 0.4403,-0.064 0.5914,-0.196 0.15,-0.131 0.2629,-0.3184 0.3379,-0.5638 0.0746,-0.2449 0.1242,-0.5613 0.1449,-0.948 l -2.3468,0 z m 5.8328,2.0898 -0.3281,0 -1.2567,-0.054 0,-0.279 c 0.1621,-0.028 0.286,-0.063 0.3738,-0.104 0.0872,-0.041 0.1532,-0.105 0.1957,-0.189 0.043,-0.084 0.0688,-0.1954 0.0754,-0.3361 0.0071,-0.1394 0.011,-0.3242 0.011,-0.5527 l 0,-2.3418 c 0,-0.2508 -0.011,-0.4355 -0.0321,-0.5535 C 35.293,96.2457 35.2605,96.1566 35.218,96.1 c -0.0434,-0.0574 -0.0942,-0.1016 -0.1532,-0.1348 -0.0589,-0.032 -0.157,-0.0691 -0.2929,-0.1121 l 0,-0.2636 2.1652,0 0,0.2636 c -0.1832,0.0321 -0.3203,0.077 -0.4113,0.1336 -0.0918,0.0578 -0.157,0.1485 -0.1957,0.2715 -0.0403,0.1242 -0.059,0.3477 -0.059,0.6738 l 0,1.8801 c 0,0.1719 0.0219,0.3211 0.0668,0.4461 0.0437,0.125 0.1262,0.259 0.2441,0.4035 0.1176,0.1426 0.2407,0.252 0.3676,0.3262 0.127,0.0761 0.2555,0.1131 0.3844,0.1131 0.168,0 0.3008,-0.044 0.398,-0.1307 0.0961,-0.0879 0.1879,-0.2297 0.2731,-0.4219 l 0.6066,0 0,1.2356 c -0.1679,0.021 -0.3558,0.032 -0.5637,0.032 -0.2472,0 -0.4679,-0.038 -0.6632,-0.112 -0.195,-0.075 -0.377,-0.183 -0.545,-0.321 -0.1679,-0.137 -0.3511,-0.327 -0.5476,-0.5662 l -0.0754,0.0168 0.059,0.9394 z m 9.082,-4.966 c 0.3617,0.2024 0.641,0.5078 0.8379,0.916 0.1973,0.4082 0.2961,0.9094 0.2961,1.504 0,0.8339 -0.1969,1.4746 -0.591,1.92 -0.3942,0.446 -0.9738,0.669 -1.7399,0.669 -0.4593,0 -0.8671,-0.1 -1.225,-0.299 -0.3578,-0.198 -0.6398,-0.502 -0.8461,-0.91 -0.2058,-0.4082 -0.3089,-0.9082 -0.3089,-1.4992 0,-0.8582 0.1961,-1.5078 0.5879,-1.9461 0.3929,-0.4387 0.9613,-0.6574 1.7058,-0.6574 0.4942,0 0.9227,0.1008 1.2832,0.3027 m -2.2148,4.0207 c 0.2308,0.3763 0.5632,0.5633 0.9957,0.5633 0.2582,0 0.4875,-0.081 0.6879,-0.244 0.2004,-0.163 0.3593,-0.4181 0.4754,-0.7658 0.116,-0.3464 0.175,-0.7839 0.175,-1.3105 0,-0.282 -0.0239,-0.5535 -0.0704,-0.8133 -0.0468,-0.259 -0.123,-0.4883 -0.2281,-0.6855 -0.1058,-0.1965 -0.2426,-0.3528 -0.4105,-0.4699 -0.1688,-0.1161 -0.3731,-0.1739 -0.6133,-0.1739 -0.4367,0 -0.7719,0.1985 -1.0067,0.593 -0.2339,0.3965 -0.3519,0.9629 -0.3519,1.7 0,0.6953 0.116,1.2305 0.3469,1.6066 m 7.1937,0.8963 -1.2832,0 0,0.565 c 0,0.271 0.0113,0.492 0.0356,0.664 0.0226,0.17 0.0589,0.311 0.1066,0.426 0.0481,0.115 0.107,0.205 0.1754,0.273 0.068,0.068 0.1418,0.119 0.2227,0.151 0.08,0.033 0.18,0.048 0.2984,0.048 0.1637,0 0.2918,-0.044 0.3836,-0.131 0.091,-0.088 0.1711,-0.238 0.2387,-0.449 l 0.5316,0 0,0.973 c -0.1961,0.04 -0.4363,0.058 -0.7195,0.058 -0.3227,0 -0.6024,-0.035 -0.8407,-0.104 -0.2379,-0.069 -0.4621,-0.191 -0.6711,-0.362 -0.2097,-0.172 -0.3691,-0.381 -0.4781,-0.624 -0.1097,-0.244 -0.1801,-0.56 -0.2117,-0.951 -0.0152,-0.164 -0.0344,-0.292 -0.057,-0.384 -0.0231,-0.09 -0.05,-0.16 -0.0801,-0.206 -0.0309,-0.046 -0.0668,-0.083 -0.1078,-0.108 -0.041,-0.024 -0.084,-0.044 -0.1289,-0.056 -0.045,-0.012 -0.1356,-0.03 -0.2711,-0.05 l 0,-0.275 0.65,0 0,-3.25 c 0,-0.2468 -0.009,-0.4277 -0.027,-0.5418 C 48.0852,96.275 48.057,96.1871 48.0199,96.1273 47.982,96.066 47.9285,96.016 47.8609,95.9762 47.793,95.9371 47.6809,95.8961 47.523,95.8531 l 0,-0.2636 2.1965,0 0,0.2636 c -0.1605,0.0352 -0.2785,0.0723 -0.3519,0.1102 -0.0727,0.0371 -0.1328,0.0871 -0.1766,0.1496 -0.0449,0.0633 -0.0793,0.1551 -0.1019,0.2773 -0.0243,0.1211 -0.0356,0.3016 -0.0356,0.5418 l 0,3.25 1.2832,0 0,0.542"
+       style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="path10"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/public/img/windows-tile.png b/public/img/windows-tile.png
new file mode 100644
index 0000000..3bfa985
--- /dev/null
+++ b/public/img/windows-tile.png
Binary files differ
diff --git a/public/js/kalamar-0.40.3-de.js b/public/js/kalamar-0.40.3-de.js
new file mode 100644
index 0000000..81ce0f5
--- /dev/null
+++ b/public/js/kalamar-0.40.3-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,_=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||_)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&_&&_[i]&&(c=_[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function _(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function v(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return _(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,_(i,!0),v(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},v,x(n,_),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var _=["nodesep","edgesep","ranksep","marginx","marginy"],v={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var _=e.node(e.predecessors(h)[0]),v=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+_.order+v.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)_(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===v(t,t.node(e.v),l)&&u!==v(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function _(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function v(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=_},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,_=/['\n\r\t\u2028\u2029\\]/g,v=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},N={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},S={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},P=N[typeof window]&&window||this,O=N[typeof n]&&n&&!n.nodeType&&n,R=N[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=N[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+S[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(P=j);var Y=function t(e){var n=(e=e?Y.defaults(P.Object(),e,Y.pick(P,v)):P).Array,i=e.Boolean,r=e.Date,S=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=S.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Dt(gt=I.keys)&&gt,_t=O.max,vt=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=S,wt[A]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Nt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Nt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function St(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function Pt(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=Pt(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&N[typeof t]||e&&N[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var _=m,v=e[g];if(i)for(;_--&&!(s=Ot(t[_],v,n,i,r,o)););else if(!(s=Ot(t[g],v,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Nt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof S.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!N[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Wt),Qt=j("("+Gt(Yt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&N[typeof r])for(var u=-1,h=N[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&N[typeof r])for(var l=-1,u=N[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=N[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!N[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?_t(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var _e=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),ve=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,vt(_t(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?_t(0,i+n):n||0}else if(n){var r=Se(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Ne(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:_t(0,e);return W(t,i)}function Se(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Pe(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=_t(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(_t(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),_=g<=0;_?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return _&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(_=!0,o=t.apply(a,i)),!_||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=Pt(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?Pt(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Q;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return St(t,Pt(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),Pt(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=_e,Et.indexBy=ve,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,vt(_t(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=St(r,Pt(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=Pt(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=_t(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Ne,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(Pt(arguments,!0,!0))},Et.uniq=Pe,Et.values=le,Et.where=Ce,Et.without=function(t){return St(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(St(i,n).concat(St(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Ne,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Ne,Et.unique=Pe,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?_t(0,i+n):vt(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return vt(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Se,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",v=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(v,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(_,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=S(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,_t(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=vt(_t(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Y)._=Y:O._=Y:P._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const _=n;g.addEventListener("mouseenter",(function(){_.inFocus(this)}));const v=g.appendChild(n._c("text"));v.setAttribute("x",d+u),v.setAttribute("y",m+3),v.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);v.appendChild(y);const b=v.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),v),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,_=13,v=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===_)&&e(t),n===v&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function _(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function v(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=_(),0;var i=s(n,E);if(i)return A+=_(),v(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=_();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&v(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,N=0;E.t.lastIndex=N,T=E.t.exec(n);)L=y(n.substr(N,T.index-N),T[0]),N=T.index+L;for(y(n.substr(N)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,P.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=S(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=S(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;N(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function _(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function v(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),P=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),N.className="introjs-arrow",P.className="introjs-tooltiptext",P.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),v(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),S.className="introjs-tooltip",S.appendChild(P),S.appendChild(O),S.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),S.appendChild(N),x.appendChild(S),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},v(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},v(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",v(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),S.appendChild(I),h.call(o,t.element,S,N,q),b.call(this,t.scrollTo,t,S)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&_.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=S().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function N(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||N(e))}function S(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function P(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");v(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),N(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Q=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Q.instances[A(n,"introjs-instance")]=n,n};return Q.version="2.9.3",Q.instances={},Q.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Q})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},void 0!==KorAP.Notifications&&KorAP.Notifications.forEach((function(t){var e=t[1];t[2]&&(e+='<code class="src">'+t[2]+"</code>"),s.log(e,t[0],1e4)}));var _=m.getElementById("cq"),v=KorAP.vc;if(_){if(_.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{v.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(v.getName()),v.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){v.onMinimize=function(){r.classList.remove("active"),delete g.vc},v.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var C=function(){v.isOpen()?v.minimize():v.open()};r.onclick=C,g.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==v?(_.value=v.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),N=m.getElementById("searchform"),S=m.getElementById("vc-view");N&&S&&(N.insertBefore(L.element(),S),KorAP.Panel.query=L);let P=KorAP.Plugins;if(P&&P.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{P.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.40.3-de.js.map b/public/js/kalamar-0.40.3-de.js.map
new file mode 100644
index 0000000..c0a77d4
--- /dev/null
+++ b/public/js/kalamar-0.40.3-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.40.3-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","tourshow","tourshowR","vcname","vcchoose","Notifications","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","Plugins"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * cq = corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n  \r\n\r\n  /**\r\n   * General method to retrieve JSON information\r\n   */\r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  }\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n    \r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    if (KorAP.Notifications !== undefined) {\r\n      KorAP.Notifications.forEach(function(n) {\r\n        var msg = n[1];\r\n        if (n[2]) {\r\n          msg += '<code class=\"src\">'+n[2]+'</code>';\r\n        };\r\n        alertifyClass.log(msg, n[0], 10000);\r\n      });\r\n    };\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let p = KorAP.Plugins;\r\n    if (p && p.length > 0) {\r\n      // Load Plugin Server first\r\n      KorAP.Plugin = pluginClass.create();\r\n\r\n      // Add services container to head\r\n      d.head.appendChild(KorAP.Plugin.element());\r\n\r\n      // Add pipe form\r\n      KorAP.Pipe = pipeClass.create();\r\n      d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n\r\n      try {\r\n      \r\n        // Register all plugins\r\n        p.forEach(i => KorAP.Plugin.register(i));\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n      }\r\n    };\r\n\r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.40.3-en.js b/public/js/kalamar-0.40.3-en.js
new file mode 100644
index 0000000..05005ca
--- /dev/null
+++ b/public/js/kalamar-0.40.3-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function v(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),v=u.map,g=v&&v["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||g)&&v){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=v[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&g&&g[i]&&(c=g[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function g(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=v(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return v(t,i)})):v(t,s):(o=(r=b(t=v(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return g(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,v,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),v=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,g(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&v||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),v=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new v({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,A(n,g),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(A(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,A(r,E),i.pick(r,x)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var g=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},x=["labelpos"];function A(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var v=o(t,a);v<l&&(m=0,c=i.cloneDeep(a),l=v)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var v=s(m,c);if(h&&(v.vs=i.flatten([h,v.vs,d],!0),e.predecessors(h).length)){var g=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(v,"barycenter")||(v.barycenter=0,v.weight=0),v.barycenter=(v.barycenter*v.weight+g.order+_.order)/(v.weight+2),v.weight+=2}return v}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)g(n,t,e,v(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function v(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function g(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=v,u.exchangeEdges=g},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,v=/\bthis\b/,g=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",x="[object Object]",A="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[x]=C["[object RegExp]"]=C[A]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},N={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},P={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=N[typeof window]&&window||this,O=N[typeof n]&&n&&!n.nodeType&&n,R=N[typeof e]&&e&&!e.nodeType&&e,j=R&&R.exports===O&&O,I=N[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+P[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Y(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!I||I.global!==I&&I.window!==I||(S=I);var W=function t(e){var n=(e=e?W.defaults(S.Object(),e,W.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,P=e.Function,O=e.Math,R=e.Number,j=e.Object,I=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=j.prototype,Z=e._,X=J.toString,tt=I("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=P.prototype.toString,ot=Dt(ot=j.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=j.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=j.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,vt=Dt(vt=j.keys)&&vt,gt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=P,wt[x]=j,wt["[object Number]"]=R,wt["[object RegExp]"]=I,wt[A]=q,kt.prototype=Et.prototype;var xt=Et.support={};function At(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Y(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case A:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Y(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(xt.funcNames&&(i=!t.name),!(i=i||!xt.funcDecomp))){var r=rt.call(t);xt.funcNames||(i=!d.test(r)),i||(i=v.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return je(t,e)}function Nt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Y(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Y(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Nt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Pt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&N[typeof t]||e&&N[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=x),c==b&&(c=x),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case A:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=x)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var v=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,v=e.length,(s=v==m)||i)for(;v--;){var g=m,_=e[v];if(i)for(;g--&&!(s=Ot(t[g],_,n,i,r,o)););else if(!(s=Ot(t[v],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return v++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--v>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function jt(t,e){return t+it(bt()*(e-t+1))}function It(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Y(u))[2]&&(u[2]=Y(u[2])),u[3]&&(u[3]=Y(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?At:Nt)([t,e,n,i,r,o])}function qt(t){return Yt[t]}function Bt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}xt.funcDecomp=!Dt(e.WinRTError)&&v.test(t),xt.funcNames="string"==typeof P.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=x||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Wt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=vt?function(t){return oe(t)?vt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!N[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Yt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Wt=ie(Yt),Qt=I("("+Gt(Wt).join("|")+")","g"),$t=I("["+Gt(Yt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&N[typeof r])for(var u=-1,h=N[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&N[typeof r])for(var l=-1,u=N[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=N[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!N[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=x)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==A||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?gt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ve(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ge=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ve(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function xe(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=jt(0,++e);r[e]=r[n],r[n]=t})),r}function Ae(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Y(t,0,_t(gt(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?gt(0,i+n):n||0}else if(n){var r=Pe(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Ne(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:gt(0,e);return Y(t,i)}function Pe(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),It(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function je(t,e){return arguments.length>2?Mt(t,17,Y(arguments,2),null,e):Mt(t,1,null,null,e)}function Ie(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=gt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(gt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var v=h-(s-u),g=v<=0;g?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,v))}return g&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(g=!0,o=t.apply(a,i)),!g||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=je,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Y(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=Ie,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Q;var e=Y(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=Y(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Pt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ve,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ge,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Y(t,0,_t(gt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Y(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Y(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Pt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Y(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Y(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=gt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Ne,Et.shuffle=xe,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,Ie(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Y(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return It(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Pt(t,Y(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?It(Pt(i,n).concat(Pt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Ne,Et.each=me,Et.eachRight=ve,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Ne,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ve(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==A||n==b||n==x&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?gt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return jt(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=Ae,Et.sortedIndex=Pe,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,v="__p += '",_=I((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),v+=t.slice(d,a).replace(g,F),n&&(v+="' +\n__e("+n+") +\n'"),s&&(r=!0,v+="';\n"+s+";\n__p += '"),i&&(v+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),v+="';\n";var b=n.variable,w=b;w||(v="with ("+(b="obj")+") {\n"+v+"\n}\n"),v=(r?v.replace(a,""):v).replace(c,"$1").replace(l,"$1;"),v="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+v+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=P(s,"return "+v+E).apply(void 0,h)}catch(t){throw t.source=v,t}return e?k(e):(k.source=v,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=Ae,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Y(t,gt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[jt(0,t.length-1)]:void 0;var i=xe(t);return i.length=_t(gt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?j?(R.exports=W)._=W:O._=W:S._=W}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const v=this._c("g");v.setAttribute("class","label"),n._labelsElement.appendChild(v),v.arcRef=c;const g=n;v.addEventListener("mouseenter",(function(){g.inFocus(this)}));const _=v.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=v.insertBefore(n._c("rect"),_),x=w+2*n.xPadding;k.setAttribute("x",d+u-x/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",x),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},v=!1,g=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",v=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){v.hide(),v.unbind(r.body,"keyup",l),v.unbind(o,"focus",u),h&&v.unbind(i,"click",e),f&&v.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===g)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||v.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),v||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(v=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(v=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;v=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function v(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function g(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(A);var t=E.sL?c(E.sL,A,!0,k[E.sL]):l(A);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),v(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(A);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(A);i;){t+=e(A.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=v(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(A)}return t+e(A.substr(n))}()}function _(t,n){var i=t.cN?v(t.cN,"",!0):"";t.rB?(x+=i,A=""):t.eB?(x+=e(n)+i,A=""):(x+=i,A=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(A+=t,void 0===n)return x+=g(),0;var i=s(n,E);if(i)return x+=g(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(A+=n),x+=g();do{E.cN&&(x+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(x+=e(n)),A="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return A+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},x="";for(w=E;w!=b;w=w.parent)w.cN&&(x=v(w.cN,"",!0)+x);var A="",C=0;try{for(var T,L,N=0;E.t.lastIndex=N,T=E.t.exec(n);)L=y(n.substr(N,T.index-N),T[0]),N=T.index+L;for(y(n.substr(N)),w=E;w.parent;w=w.parent)w.cN&&(x+="</span>");return{r:C,value:x,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?v[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[v[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},v={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){v[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&A.on(window,"keydown",i,this,!0),A.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(v.call(this,document.querySelector(".introjs-helperLayer")),v.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),v.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return j.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),A.off(window,"keydown",i,this,!0),A.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=P(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=P(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function v(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;N(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function g(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),v.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&Y(r,t.element),v.call(o,s),v.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+W.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",W.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var x=document.createElement("div"),A=document.createElement("div"),N=document.createElement("div"),P=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),j=document.createElement("div");x.className=d,A.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&Y(r,t.element),v.call(o,x),v.call(o,A),this._targetElement.appendChild(x),this._targetElement.appendChild(A),N.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var I=document.createElement("ul");I.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),I.appendChild(i)})),O.appendChild(I),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",W.call(this)),M.style.cssText="width:"+W.call(this)+"%;",R.appendChild(M),j.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(j.style.display="none"),P.className="introjs-tooltip",P.appendChild(S),P.appendChild(O),P.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,A.appendChild(q)),P.appendChild(N),A.appendChild(P),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},j.appendChild(i),this._introItems.length>1&&(j.appendChild(n),j.appendChild(e)),P.appendChild(j),h.call(o,t.element,P,N,q),b.call(this,t.scrollTo,t,P)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&g.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=P().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,x=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),A=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+x(n)+(i?"_"+x(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function N(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||N(e))}function P(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),A.on(document,"click",O,this,!1),A.on(window,"resize",j,this,!0)}function j(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function I(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(I(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=I(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function B(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(I(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),N(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),v.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function Y(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function W(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Q=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Q.instances[x(n,"introjs-instance")]=n,n};return Q.version="2.9.3",Q.instances={},Q.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Q})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},v=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},void 0!==KorAP.Notifications&&KorAP.Notifications.forEach((function(t){var e=t[1];t[2]&&(e+='<code class="src">'+t[2]+"</code>"),s.log(e,t[0],1e4)}));var g=m.getElementById("cq"),_=KorAP.vc;if(g){if(g.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),g.parentNode.insertBefore(r,g)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),x=l.create(v);if(null!=k){k.appendChild(x.actions.element());var A=m.getElementById("search");A.insertBefore(x.element(),A.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&x.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&x.addAlignAction(),KorAP.Panel.result=x,r){_.onMinimize=function(){r.classList.remove("active"),delete v.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),v.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,v.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",v),void 0!==_?(g.value=_.toQuery(),""==g.value&&g.removeAttribute("name")):(g.removeAttribute("value"),g.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),N=m.getElementById("searchform"),P=m.getElementById("vc-view");N&&P&&(N.insertBefore(L.element(),P),KorAP.Panel.query=L);let S=KorAP.Plugins;if(S&&S.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{S.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.40.3-en.js.map b/public/js/kalamar-0.40.3-en.js.map
new file mode 100644
index 0000000..3a5e2c2
--- /dev/null
+++ b/public/js/kalamar-0.40.3-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.40.3-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","tourshow","tourshowR","vcname","vcchoose","Notifications","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","Plugins"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * cq = corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n  \r\n\r\n  /**\r\n   * General method to retrieve JSON information\r\n   */\r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  }\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n    \r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    if (KorAP.Notifications !== undefined) {\r\n      KorAP.Notifications.forEach(function(n) {\r\n        var msg = n[1];\r\n        if (n[2]) {\r\n          msg += '<code class=\"src\">'+n[2]+'</code>';\r\n        };\r\n        alertifyClass.log(msg, n[0], 10000);\r\n      });\r\n    };\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let p = KorAP.Plugins;\r\n    if (p && p.length > 0) {\r\n      // Load Plugin Server first\r\n      KorAP.Plugin = pluginClass.create();\r\n\r\n      // Add services container to head\r\n      d.head.appendChild(KorAP.Plugin.element());\r\n\r\n      // Add pipe form\r\n      KorAP.Pipe = pipeClass.create();\r\n      d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n\r\n      try {\r\n      \r\n        // Register all plugins\r\n        p.forEach(i => KorAP.Plugin.register(i));\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n      }\r\n    };\r\n\r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.0-de.js b/public/js/kalamar-0.41.0-de.js
new file mode 100644
index 0000000..554074e
--- /dev/null
+++ b/public/js/kalamar-0.41.0-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,v=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||v)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=T(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=T(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=T(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function T(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+v.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)v(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",T={"[object Function]":!1};T[b]=T[w]=T[E]=T[k]=T["[object Number]"]=T[A]=T["[object RegExp]"]=T[x]=!0;var C={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=P[typeof window]&&window||this,R=P[typeof n]&&n&&!n.nodeType&&n,O=P[typeof e]&&e&&!e.nodeType&&e,I=O&&O.exports===R&&R,j=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function H(t){return"\\"+N[t]}function F(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function W(t){var e=t.cache;e&&W(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function G(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Q=function t(e){var n=(e=e?Q.defaults(S.Object(),e,Q.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,R=e.Math,O=e.Number,I=e.Object,j=e.RegExp,q=e.String,Y=e.TypeError,$=[],J=I.prototype,X=e._,Z=J.toString,tt=j("^"+q(Z).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=R.ceil,nt=e.clearTimeout,it=R.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Dt(gt=I.keys)&&gt,vt=R.max,_t=R.min,yt=e.parseInt,bt=R.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=N,wt[A]=I,wt["[object Number]"]=O,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=G(n);at.apply(t,arguments)}if(this instanceof r){var o=Ct(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Tt(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=Z.call(t);if(!T[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=F()),r||(r=F());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?G(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Tt(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Ct(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=G(i);at.apply(f,arguments)}if((r||l)&&(f||(f=G(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Ct(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function Nt(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&W(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Rt(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=Z.call(t),c=Z.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Rt(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=F()),o||(o=F());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var v=m,_=e[g];if(i)for(;v--&&!(s=Rt(t[v],_,n,i,r,o)););else if(!(s=Rt(t[g],_,n,i,r,o)))break}}else Zt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Rt(t[a],e,n,i,r,o)})),s&&!i&&Zt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Ot(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Ot(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?F():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),W(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Y;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=G(u))[2]&&(u[2]=G(u[2])),u[3]&&(u[3]=G(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Pt)([t,e,n,i,r,o])}function qt(t){return Gt[t]}function Ut(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Ct=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ht(t){var e,n;return!(!t||Z.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Zt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ft(t){return Qt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==w||!1},Wt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Gt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qt=ie(Gt),Yt=j("("+Wt(Qt).join("|")+")","g"),$t=j("["+Wt(Gt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&Wt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&Wt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=P[typeof r]&&Wt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Wt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Zt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Wt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==Z.call(t)||!1}var ae=ot?function(t){if(!t||Z.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ht(t)}:Ht;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&Z.call(t)==x||!1}function le(t){for(var e=-1,i=Wt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Wt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Te=fe;function Ce(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return G(t,0,_t(vt(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return G(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Re(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Oe(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,G(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Y;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),v=g<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function He(t){return function(e){return e[t]}}function Fe(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Y;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,G(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Y;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Ct(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return He(t);var r=Wt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Rt(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Xt,Et.defer=function(t){if(!re(t))throw new Y;var e=G(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Y;var n=G(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Zt,Et.forInRight=function(t,e,n){var i=[];Zt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return G(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=F(),r=Ut(),o=r===K,s=F();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&W(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=G(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Wt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Y;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=G(arguments,1,n),o=-1,s=F(),a=F();++o<n;)Ot(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Zt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Y;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Wt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,G(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,G(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=He,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=F())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),W(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Y;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),C.leading=i,C.maxWait=e,C.trailing=r,je(t,e,C)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?G(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Ct(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Te,Et.without=function(t){return Nt(t,G(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Re,Et.zipObject=Oe,Et.collect=ye,Et.drop=Pe,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Oe,Et.select=fe,Et.tail=Pe,Et.unique=Se,Et.unzip=Re,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Tt(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Tt(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&Z.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&Z.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=Z.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Rt(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==Z.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=X,this},Et.noop=qe,Et.now=De,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Wt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Xt({},n,i);var r,o=Xt({},n.imports,i.imports),s=Wt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",_=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(v,H),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=N(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Yt,Ft)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Ce,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return G(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Ce,Et.head=Ce,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=Fe,Et.prototype.valueOf=Fe,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();R&&O?I?(O.exports=Q)._=Q:R._=Q:S._=Q}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const v=n;g.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,v=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(T+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(T+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=v(),0;var i=s(n,E);if(i)return A+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=v();do{E.cN&&(A+="</span>"),T+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",T=0;try{for(var C,L,P=0;E.t.lastIndex=P,C=E.t.exec(n);)L=y(n.substr(P,C.index-P),C[0]),P=C.index+L;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:T,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){C(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=N(),T(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;P(e.element)?T(t,"introjs-fixedTooltip"):C(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=W(t.element))!==document.body&&G(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){C(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Q.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Q.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),P=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),R=document.createElement("div"),O=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=W(t.element))!==document.body&&G(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),P.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,R.className="introjs-bullets",!1===this._options.showBullets&&(R.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),R.appendChild(j),O.className="introjs-progress",!1===this._options.showProgress&&(O.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Q.call(this)),M.style.cssText="width:"+Q.call(this)+"%;",O.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(R),N.appendChild(O);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(P),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,P,q),b.call(this,t.scrollTo,t,N)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&T(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,T(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&T(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&T(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;T(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&T(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&T(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){C(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function P(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||P(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function R(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function O(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}H.call(this),x.on(document,"click",R,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&F.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];R.call(this),e&&T(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):O.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&C(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function H(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||T(r,"introjs-hint-no-anim"),P(n.element)&&T(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,F.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function F(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=R.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function W(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function G(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Q(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Y=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Y.instances[A(n,"introjs-instance")]=n,n};return Y.version="2.9.3",Y.instances={},Y.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return O.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Y})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()},KorAP.API.putJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("PUT",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("Content-Type","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){4==this.readyState&&(200===this.status?KorAP.log(this.status,"api.js says: A HTTP PUT Method was invoked such that error status 200 was recieved.          This should not be possible, 201 should be returned.\n"+this.statusText):201!==this.status&&KorAP.log(this.status,this.statusText))},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send(e)},KorAP.API.deleteAtURL=function(t,e,n){const i=new XMLHttpRequest;i.open("DELETE",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:e}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){4==this.readyState&&(200!==this.status?(KorAP.log(this.status,this.statusText),"function"==typeof n&&n({status:this.status,statusText:this.statusText})):200===this.status&&"function"==typeof n&&n({status:this.status,statusText:this.statusText}))},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()},KorAP.API.getQueryList=function(t){KorAP.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList")},KorAP.API.getQuery=function(t,e){KorAP.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t)},KorAP.API.putQuery=function(t,e){KorAP.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t)},KorAP.API.deleteQuery=function(t,e){KorAP.deleteAtURL(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;m.body.classList.remove("no-js"),KorAP.URL=m.body.getAttribute("data-korap-url")||"";const g=m.getElementById("koralQuery");null!==g&&(KorAP.koralQuery=JSON.parse(g.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},void 0!==KorAP.Notifications&&KorAP.Notifications.forEach((function(t){var e=t[1];t[2]&&(e+='<code class="src">'+t[2]+"</code>"),s.log(e,t[0],1e4)}));var v=m.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){_.onMinimize=function(){r.classList.remove("active"),delete g.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var T=function(){_.isOpen()?_.minimize():_.open()};r.onclick=T,g.vc&&T.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var C=m.getElementById("searchform");null!==C&&C.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),P=m.getElementById("searchform"),N=m.getElementById("vc-view");P&&N&&(P.insertBefore(L.element(),N),KorAP.Panel.query=L);let S=KorAP.Plugins;if(S&&S.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{S.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.0-de.js.map b/public/js/kalamar-0.41.0-de.js.map
new file mode 100644
index 0000000..e82441c
--- /dev/null
+++ b/public/js/kalamar-0.41.0-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.0-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","putJSON","deleteAtURL","getQueryList","getQuery","qn","putQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","Notifications","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","Plugins"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n  \r\n\r\n  /**\r\n   * General method to retrieve JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File is located\r\n   * @param {function} onload The callback function that recieves the retrieved JSON as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSON} json The JSON that is getting transfered. Be sure to have this be a JSON (stringify)\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.putJSON = function (url, json, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"PUT\", url, true); //D PUT is not cacheable, but I hope that doesn't matter: https://developer.mozilla.org/en-US/docs/Glossary/Cacheable\r\n                                // There is also POST, I couldn't decide why not to use PUT, though POST may be safer to use\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Do I need this?\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n\t      \r\n        if (this.status === 200) {\r\n          KorAP.log(this.status, \"api.js says: A HTTP PUT Method was invoked such that error status 200 was recieved.\\\r\n          This should not be possible, 201 should be returned.\\n\" + this.statusText)\r\n        }\r\n        else if (this.status !== 201) {\r\n          KorAP.log(this.status, this.statusText);\r\n          //TODO Show the user his request failed!\r\n        };\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send(json);\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteAtURL = function (url, title, cb) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"DELETE\", url, true);\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Could this be bad? Maybe we want to delete non JSON files later.\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n        \r\n        //If we add a callback function for error handling to put and get, I would do it exactly like this.\r\n        //It being the last parameter means calls of getJSON don't need to be changed.\r\n\r\n        if (this.status !== 200) {\r\n          KorAP.log(this.status, this.statusText)\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        }\r\n        else if (this.status === 200) { //D Does this achieve anything?\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        };\r\n        //TODO show the user his request failed.\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} cb The callback function that recieves the JSON Listof queries\r\n   */\r\n  KorAP.API.getQueryList = function (cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\", cb, \"getSavedQueryList\");\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} cb The callback function that recieves the query JSON Object\r\n   */\r\n  KorAP.API.getQuery = function (qn, cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\" + qn, cb, \"getSavedQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {function} json The query. Be sure to have this be a JSON (stringify)\r\n   */\r\n  KorAP.API.putQuery = function (qn, json){\r\n    KorAP.putJSON(KorAP.URL + \"/query/\" + qn, json, \"putQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, cb){\r\n    KorAP.deleteAtURL(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, cb);\r\n  };\r\n});\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Remove the no-js class from the body\r\n  d.body.classList.remove('no-js');\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n    \r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    if (KorAP.Notifications !== undefined) {\r\n      KorAP.Notifications.forEach(function(n) {\r\n        var msg = n[1];\r\n        if (n[2]) {\r\n          msg += '<code class=\"src\">'+n[2]+'</code>';\r\n        };\r\n        alertifyClass.log(msg, n[0], 10000);\r\n      });\r\n    };\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let p = KorAP.Plugins;\r\n    if (p && p.length > 0) {\r\n      // Load Plugin Server first\r\n      KorAP.Plugin = pluginClass.create();\r\n\r\n      // Add services container to head\r\n      d.head.appendChild(KorAP.Plugin.element());\r\n\r\n      // Add pipe form\r\n      KorAP.Pipe = pipeClass.create();\r\n      d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n\r\n      try {\r\n      \r\n        // Register all plugins\r\n        p.forEach(i => KorAP.Plugin.register(i));\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n      }\r\n    };\r\n\r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.0-en.js b/public/js/kalamar-0.41.0-en.js
new file mode 100644
index 0000000..de7807f
--- /dev/null
+++ b/public/js/kalamar-0.41.0-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function v(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),v=u.map,g=v&&v["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||g)&&v){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=v[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&g&&g[i]&&(c=g[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function g(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=v(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return v(t,i)})):v(t,s):(o=(r=b(t=v(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return g(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,v,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),v=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,g(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&v||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),v=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new v({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,g),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var g=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var v=o(t,a);v<l&&(m=0,c=i.cloneDeep(a),l=v)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var v=s(m,c);if(h&&(v.vs=i.flatten([h,v.vs,d],!0),e.predecessors(h).length)){var g=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(v,"barycenter")||(v.barycenter=0,v.weight=0),v.barycenter=(v.barycenter*v.weight+g.order+_.order)/(v.weight+2),v.weight+=2}return v}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)g(n,t,e,v(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function v(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function g(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=v,u.exchangeEdges=g},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,v=/\bthis\b/,g=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=P[typeof window]&&window||this,R=P[typeof n]&&n&&!n.nodeType&&n,O=P[typeof e]&&e&&!e.nodeType&&e,j=O&&O.exports===R&&R,I=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function H(t){return"\\"+N[t]}function F(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!I||I.global!==I&&I.window!==I||(S=I);var Y=function t(e){var n=(e=e?Y.defaults(S.Object(),e,Y.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,R=e.Math,O=e.Number,j=e.Object,I=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=j.prototype,X=e._,Z=J.toString,tt=I("^"+q(Z).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=R.ceil,nt=e.clearTimeout,it=R.floor,rt=N.prototype.toString,ot=Dt(ot=j.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=j.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=j.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,vt=Dt(vt=j.keys)&&vt,gt=R.max,_t=R.min,yt=e.parseInt,bt=R.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=N,wt[A]=j,wt["[object Number]"]=O,wt["[object RegExp]"]=I,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=Z.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=F()),r||(r=F());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=v.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return je(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Nt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Rt(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=Z.call(t),c=Z.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Rt(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=F()),o||(o=F());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var v=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,v=e.length,(s=v==m)||i)for(;v--;){var g=m,_=e[v];if(i)for(;g--&&!(s=Rt(t[g],_,n,i,r,o)););else if(!(s=Rt(t[v],_,n,i,r,o)))break}}else Zt(e,(function(e,a,c){if(st.call(c,a))return v++,s=st.call(t,a)&&Rt(t[a],e,n,i,r,o)})),s&&!i&&Zt(t,(function(t,e,n){if(st.call(n,e))return s=--v>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Ot(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Ot(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function jt(t,e){return t+it(bt()*(e-t+1))}function It(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?F():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Pt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Bt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&v.test(t),At.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ht(t){var e,n;return!(!t||Z.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Zt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ft(t){return Yt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==w||!1},Gt=vt?function(t){return oe(t)?vt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Wt),Qt=I("("+Gt(Yt).join("|")+")","g"),$t=I("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=P[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Zt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==Z.call(t)||!1}var ae=ot?function(t){if(!t||Z.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ht(t)}:Ht;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&Z.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?gt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ve(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ge=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ve(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=jt(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,_t(gt(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?gt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:gt(0,e);return W(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),It(t,e,n)}function Re(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Oe(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function je(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function Ie(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=gt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(gt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var v=h-(s-u),g=v<=0;g?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,v))}return g&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(g=!0,o=t.apply(a,i)),!g||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function He(t){return function(e){return e[t]}}function Fe(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=je,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return He(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Rt(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=Ie,Et.defaults=Xt,Et.defer=function(t){if(!re(t))throw new Q;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ve,Et.forIn=Zt,Et.forInRight=function(t,e,n){var i=[];Zt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ge,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,_t(gt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=F(),r=Bt(),o=r===K,s=F();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=F(),a=F();++o<n;)Ot(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Zt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=He,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=gt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=F())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,Ie(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return It(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?It(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Re,Et.zipObject=Oe,Et.collect=ye,Et.drop=Pe,Et.each=me,Et.eachRight=ve,Et.extend=Jt,Et.methods=ne,Et.object=Oe,Et.select=fe,Et.tail=Pe,Et.unique=Se,Et.unzip=Re,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ve(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&Z.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&Z.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=Z.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Rt(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==Z.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?gt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=X,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return jt(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Xt({},n,i);var r,o=Xt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,v="__p += '",_=I((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),v+=t.slice(d,a).replace(g,H),n&&(v+="' +\n__e("+n+") +\n'"),s&&(r=!0,v+="';\n"+s+";\n__p += '"),i&&(v+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),v+="';\n";var b=n.variable,w=b;w||(v="with ("+(b="obj")+") {\n"+v+"\n}\n"),v=(r?v.replace(a,""):v).replace(c,"$1").replace(l,"$1;"),v="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+v+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=N(s,"return "+v+E).apply(void 0,h)}catch(t){throw t.source=v,t}return e?k(e):(k.source=v,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ft)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,gt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[jt(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(gt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=Fe,Et.prototype.valueOf=Fe,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();R&&O?j?(O.exports=Y)._=Y:R._=Y:S._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const v=this._c("g");v.setAttribute("class","label"),n._labelsElement.appendChild(v),v.arcRef=c;const g=n;v.addEventListener("mouseenter",(function(){g.inFocus(this)}));const _=v.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=v.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},v=!1,g=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",v=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){v.hide(),v.unbind(r.body,"keyup",l),v.unbind(o,"focus",u),h&&v.unbind(i,"click",e),f&&v.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===g)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||v.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),v||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(v=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(v=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;v=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function v(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function g(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),v(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=v(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?v(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=g(),0;var i=s(n,E);if(i)return A+=g(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=g();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=v(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,P=0;E.t.lastIndex=P,T=E.t.exec(n);)L=y(n.substr(P,T.index-P),T[0]),P=T.index+L;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?v[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[v[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},v={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){v[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(v.call(this,document.querySelector(".introjs-helperLayer")),v.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),v.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return j.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function v(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;P(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function g(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),v.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),v.call(o,s),v.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),P=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),R=document.createElement("div"),O=document.createElement("div"),j=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),v.call(o,A),v.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),P.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,R.className="introjs-bullets",!1===this._options.showBullets&&(R.style.display="none");var I=document.createElement("ul");I.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),I.appendChild(i)})),R.appendChild(I),O.className="introjs-progress",!1===this._options.showProgress&&(O.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",O.appendChild(M),j.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(j.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(R),N.appendChild(O);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(P),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},j.appendChild(i),this._introItems.length>1&&(j.appendChild(n),j.appendChild(e)),N.appendChild(j),h.call(o,t.element,N,P,q),b.call(this,t.scrollTo,t,N)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&g.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function P(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||P(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function R(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function O(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}H.call(this),x.on(document,"click",R,this,!1),x.on(window,"resize",j,this,!0)}function j(){E(this._introItems,function(t){void 0!==t.targetElement&&F.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function I(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];R.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(I(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=I(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):O.call(this,this._targetElement)}function B(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(I(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function H(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),P(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,F.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function F(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=R.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),v.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Q=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Q.instances[A(n,"introjs-instance")]=n,n};return Q.version="2.9.3",Q.instances={},Q.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return O.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Q})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()},KorAP.API.putJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("PUT",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("Content-Type","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){4==this.readyState&&(200===this.status?KorAP.log(this.status,"api.js says: A HTTP PUT Method was invoked such that error status 200 was recieved.          This should not be possible, 201 should be returned.\n"+this.statusText):201!==this.status&&KorAP.log(this.status,this.statusText))},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send(e)},KorAP.API.deleteAtURL=function(t,e,n){const i=new XMLHttpRequest;i.open("DELETE",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:e}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){4==this.readyState&&(200!==this.status?(KorAP.log(this.status,this.statusText),"function"==typeof n&&n({status:this.status,statusText:this.statusText})):200===this.status&&"function"==typeof n&&n({status:this.status,statusText:this.statusText}))},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()},KorAP.API.getQueryList=function(t){KorAP.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList")},KorAP.API.getQuery=function(t,e){KorAP.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t)},KorAP.API.putQuery=function(t,e){KorAP.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t)},KorAP.API.deleteQuery=function(t,e){KorAP.deleteAtURL(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;m.body.classList.remove("no-js"),KorAP.URL=m.body.getAttribute("data-korap-url")||"";const v=m.getElementById("koralQuery");null!==v&&(KorAP.koralQuery=JSON.parse(v.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},v=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},void 0!==KorAP.Notifications&&KorAP.Notifications.forEach((function(t){var e=t[1];t[2]&&(e+='<code class="src">'+t[2]+"</code>"),s.log(e,t[0],1e4)}));var g=m.getElementById("cq"),_=KorAP.vc;if(g){if(g.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),g.parentNode.insertBefore(r,g)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(v);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){_.onMinimize=function(){r.classList.remove("active"),delete v.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),v.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,v.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",v),void 0!==_?(g.value=_.toQuery(),""==g.value&&g.removeAttribute("name")):(g.removeAttribute("value"),g.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),P=m.getElementById("searchform"),N=m.getElementById("vc-view");P&&N&&(P.insertBefore(L.element(),N),KorAP.Panel.query=L);let S=KorAP.Plugins;if(S&&S.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{S.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.0-en.js.map b/public/js/kalamar-0.41.0-en.js.map
new file mode 100644
index 0000000..a059ebc
--- /dev/null
+++ b/public/js/kalamar-0.41.0-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.0-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","putJSON","deleteAtURL","getQueryList","getQuery","qn","putQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","Notifications","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","Plugins"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n  \r\n\r\n  /**\r\n   * General method to retrieve JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File is located\r\n   * @param {function} onload The callback function that recieves the retrieved JSON as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSON} json The JSON that is getting transfered. Be sure to have this be a JSON (stringify)\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.putJSON = function (url, json, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"PUT\", url, true); //D PUT is not cacheable, but I hope that doesn't matter: https://developer.mozilla.org/en-US/docs/Glossary/Cacheable\r\n                                // There is also POST, I couldn't decide why not to use PUT, though POST may be safer to use\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Do I need this?\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n\t      \r\n        if (this.status === 200) {\r\n          KorAP.log(this.status, \"api.js says: A HTTP PUT Method was invoked such that error status 200 was recieved.\\\r\n          This should not be possible, 201 should be returned.\\n\" + this.statusText)\r\n        }\r\n        else if (this.status !== 201) {\r\n          KorAP.log(this.status, this.statusText);\r\n          //TODO Show the user his request failed!\r\n        };\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send(json);\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteAtURL = function (url, title, cb) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"DELETE\", url, true);\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Could this be bad? Maybe we want to delete non JSON files later.\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n        \r\n        //If we add a callback function for error handling to put and get, I would do it exactly like this.\r\n        //It being the last parameter means calls of getJSON don't need to be changed.\r\n\r\n        if (this.status !== 200) {\r\n          KorAP.log(this.status, this.statusText)\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        }\r\n        else if (this.status === 200) { //D Does this achieve anything?\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        };\r\n        //TODO show the user his request failed.\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} cb The callback function that recieves the JSON Listof queries\r\n   */\r\n  KorAP.API.getQueryList = function (cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\", cb, \"getSavedQueryList\");\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} cb The callback function that recieves the query JSON Object\r\n   */\r\n  KorAP.API.getQuery = function (qn, cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\" + qn, cb, \"getSavedQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {function} json The query. Be sure to have this be a JSON (stringify)\r\n   */\r\n  KorAP.API.putQuery = function (qn, json){\r\n    KorAP.putJSON(KorAP.URL + \"/query/\" + qn, json, \"putQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, cb){\r\n    KorAP.deleteAtURL(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, cb);\r\n  };\r\n});\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Remove the no-js class from the body\r\n  d.body.classList.remove('no-js');\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n    \r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    if (KorAP.Notifications !== undefined) {\r\n      KorAP.Notifications.forEach(function(n) {\r\n        var msg = n[1];\r\n        if (n[2]) {\r\n          msg += '<code class=\"src\">'+n[2]+'</code>';\r\n        };\r\n        alertifyClass.log(msg, n[0], 10000);\r\n      });\r\n    };\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let p = KorAP.Plugins;\r\n    if (p && p.length > 0) {\r\n      // Load Plugin Server first\r\n      KorAP.Plugin = pluginClass.create();\r\n\r\n      // Add services container to head\r\n      d.head.appendChild(KorAP.Plugin.element());\r\n\r\n      // Add pipe form\r\n      KorAP.Pipe = pipeClass.create();\r\n      d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n\r\n      try {\r\n      \r\n        // Register all plugins\r\n        p.forEach(i => KorAP.Plugin.register(i));\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n      }\r\n    };\r\n\r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.1-de.js b/public/js/kalamar-0.41.1-de.js
new file mode 100644
index 0000000..2b226d1
--- /dev/null
+++ b/public/js/kalamar-0.41.1-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,_=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||_)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&_&&_[i]&&(c=_[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function _(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function v(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return _(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,_(i,!0),v(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),n("hint/foundries/storedQueries",["hint/foundries"],(function(t){t["-"].push(["Stored Queries","storedQ/=","stored online"]),t["storedQ/="]=[["Baum","baum","DescBaum"],["Holz","holz","DescParagraph"],["Blatt","blatt","DescText"]]})),e(["hint/foundries/base","hint/foundries/dereko","hint/foundries/storedQueries"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},v,x(n,_),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var _=["nodesep","edgesep","ranksep","marginx","marginy"],v={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var _=e.node(e.predecessors(h)[0]),v=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+_.order+v.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)_(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===v(t,t.node(e.v),l)&&u!==v(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function _(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function v(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=_},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,_=/['\n\r\t\u2028\u2029\\]/g,v=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},N={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},S={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},P=N[typeof window]&&window||this,O=N[typeof n]&&n&&!n.nodeType&&n,R=N[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=N[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function D(t){return t.charCodeAt(0)}function U(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=z();s.false=s.null=s.true=s[void 0]=!1;var a=z();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+S[t]}function H(){return i.pop()||[]}function z(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function V(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(P=j);var Y=function t(e){var n=(e=e?Y.defaults(P.Object(),e,Y.pick(P,v)):P).Array,i=e.Boolean,r=e.Date,S=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=S.prototype.toString,ot=Ut(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Ut(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Ut(dt=I.create)&&dt,ft=Ut(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Ut(gt=I.keys)&&gt,_t=O.max,vt=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!Vt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=S,wt[A]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Vt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(V(i),V(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Nt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Nt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function St(t,e){var n=-1,i=Dt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function Pt(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Vt(a)||zt(a))){e||(a=Pt(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&N[typeof t]||e&&N[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var _=m,v=e[g];if(i)for(;_--&&!(s=Ot(t[_],v,n,i,r,o)););else if(!(s=Ot(t[g],v,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(V(r),V(o)),s}function Rt(t,e,n,i,r){(Vt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Vt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Vt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Dt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(V(c.array),G(c)):n&&V(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Nt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Dt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Ut(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Ut(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof S.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function zt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var Vt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!N[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Wt),Qt=j("("+Gt(Yt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&N[typeof r])for(var u=-1,h=N[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&N[typeof r])for(var l=-1,u=N[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=N[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!N[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Ut(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Dt(),o=t?t.length:0,s=!1;return n=(n<0?_t(0,o+n):n)||0,Vt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var _e=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),ve=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Vt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?D:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,vt(_t(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?_t(0,i+n):n||0}else if(n){var r=Se(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Ne(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:_t(0,e);return W(t,i)}function Se(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Pe(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Vt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=_t(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(_t(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(Ue()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=Ue(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=Ue(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=Ue(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),_=g<=0;_?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return _&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(_=!0,o=t.apply(a,i)),!_||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var De,Ue=Ut(Ue=r.now)&&Ue||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=Pt(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?Pt(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Q;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return St(t,Pt(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),Pt(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=_e,Et.indexBy=ve,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,vt(_t(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Dt(),o=r===K,s=H();++e<n;){var a=arguments[e];(Vt(a)||zt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return V(i),V(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return V(s),V(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Vt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?D:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=St(r,Pt(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=Pt(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=_t(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Ne,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=Vt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=z();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(U);s--;){var c=a[s];a[s]=c.value,o||V(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=Vt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(Pt(arguments,!0,!0))},Et.uniq=Pe,Et.values=le,Et.where=Ce,Et.without=function(t){return St(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Vt(n)||zt(n))var i=i?jt(St(i,n).concat(St(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Ne,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Ne,Et.unique=Pe,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=zt,Et.isArray=Vt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?_t(0,i+n):vt(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=Ue,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return vt(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Se,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",v=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(v,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(_,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=S(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((De={},te(Et,(function(t,e){Et.prototype[e]||(De[e]=t)})),De),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,_t(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=vt(_t(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Y)._=Y:O._=Y:P._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const _=n;g.addEventListener("mouseenter",(function(){_.inFocus(this)}));const v=g.appendChild(n._c("text"));v.setAttribute("x",d+u),v.setAttribute("y",m+3),v.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);v.appendChild(y);const b=v.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),v),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,_=13,v=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===_)&&e(t),n===v&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function _(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function v(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=_(),0;var i=s(n,E);if(i)return A+=_(),v(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=_();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&v(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,N=0;E.t.lastIndex=N,T=E.t.exec(n);)L=y(n.substr(N,T.index-N),T[0]),N=T.index+L;for(y(n.substr(N)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,P.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=V(t),s=V(e),c=S(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=S(),o=V(e).height+10,s=V(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=V(e.element),i=this._options.helperElementPadding;N(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function _(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function v(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),P=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),N.className="introjs-arrow",P.className="introjs-tooltiptext",P.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),v(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),S.className="introjs-tooltip",S.appendChild(P),S.appendChild(O),S.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),S.appendChild(N),x.appendChild(S),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},v(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},v(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",v(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),S.appendChild(I),h.call(o,t.element,S,N,q),b.call(this,t.scrollTo,t,S)}var D=o._targetElement.querySelector(".introjs-disableInteraction");D&&D.parentNode.removeChild(D),t.disableInteraction&&_.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=S().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function N(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||N(e))}function S(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function P(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=V(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){D.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function D(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function U(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");v(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),z.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),N(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=V.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function z(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function V(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Q=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Q.instances[A(n,"introjs-instance")]=n,n};return Q.version="2.9.3",Q.instances={},Q.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return D.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return U.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return z.call(this,t),this}},Q})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const g=m.getElementById("koralQuery");null!==g&&(KorAP.koralQuery=JSON.parse(g.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var _=m.getElementById("cq"),v=KorAP.vc;if(_){if(_.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{v.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(v.getName()),v.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){v.onMinimize=function(){r.classList.remove("active"),delete g.vc},v.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var C=function(){v.isOpen()?v.minimize():v.open()};r.onclick=C,g.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==v?(_.value=v.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),N=m.getElementById("searchform"),S=m.getElementById("vc-view");let P;if(N&&S&&(N.insertBefore(L.element(),S),KorAP.Panel.query=L),P=m.getElementById("kalamar-plugins")){let t=P.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.1-de.js.map b/public/js/kalamar-0.41.1-de.js.map
new file mode 100644
index 0000000..b14dc9b
--- /dev/null
+++ b/public/js/kalamar-0.41.1-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.1-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","getPluginList","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"CAAC;;;;;AASD,IAAIA,EAAWC,EAASC,GACvB,SAAUC,GACP,IAAIC,EAAMC,EAAKC,EAASC,EACpBC,EAAU,GACVC,EAAU,GACVC,EAAS,GACTC,EAAW,GACXC,EAASC,OAAOC,UAAUC,eAC1BC,EAAM,GAAGC,MACTC,EAAiB,QAErB,SAASC,EAAQC,EAAKC,GAClB,OAAOT,EAAOU,KAAKF,EAAKC,GAW5B,SAASE,EAAUC,EAAMC,GACrB,IAAIC,EAAWC,EAAaC,EAAUC,EAAUC,EAC5CC,EAAQC,EAAcC,EAAOC,EAAGC,EAAGC,EACnCC,EAAYZ,GAAYA,EAASa,MAAM,KACvCC,EAAM7B,EAAO6B,IACbC,EAAWD,GAAOA,EAAI,MAAS,GAGnC,GAAIf,EAAM,CAwBN,IAtBAM,GADAN,EAAOA,EAAKc,MAAM,MACDG,OAAS,EAMtB/B,EAAOgC,cAAgBxB,EAAeyB,KAAKnB,EAAKM,MAChDN,EAAKM,GAAaN,EAAKM,GAAWc,QAAQ1B,EAAgB,KAIpC,MAAtBM,EAAK,GAAGqB,OAAO,IAAcR,IAO7Bb,EADsBa,EAAUpB,MAAM,EAAGoB,EAAUI,OAAS,GACjCK,OAAOtB,IAIjCU,EAAI,EAAGA,EAAIV,EAAKiB,OAAQP,IAEzB,GAAa,OADbE,EAAOZ,EAAKU,IAERV,EAAKuB,OAAOb,EAAG,GACfA,GAAK,OACF,GAAa,OAATE,EAAe,CAMtB,GAAU,IAANF,GAAkB,IAANA,GAAuB,OAAZV,EAAK,IAAgC,OAAhBA,EAAKU,EAAI,GACrD,SACOA,EAAI,IACXV,EAAKuB,OAAOb,EAAI,EAAG,GACnBA,GAAK,GAMjBV,EAAOA,EAAKwB,KAAK,KAIrB,IAAKX,GAAaG,IAAYD,EAAK,CAG/B,IAAKL,GAFLR,EAAYF,EAAKc,MAAM,MAEJG,OAAQP,EAAI,EAAGA,GAAK,EAAG,CAGtC,GAFAP,EAAcD,EAAUT,MAAM,EAAGiB,GAAGc,KAAK,KAErCX,EAGA,IAAKF,EAAIE,EAAUI,OAAQN,EAAI,EAAGA,GAAK,EAKnC,IAJAP,EAAWW,EAAIF,EAAUpB,MAAM,EAAGkB,GAAGa,KAAK,SAKtCpB,EAAWA,EAASD,IACN,CAEVE,EAAWD,EACXG,EAASG,EACT,MAMhB,GAAIL,EACA,OAMCG,GAAgBQ,GAAWA,EAAQb,KACpCK,EAAeQ,EAAQb,GACvBM,EAAQC,IAIXL,GAAYG,IACbH,EAAWG,EACXD,EAASE,GAGTJ,IACAH,EAAUqB,OAAO,EAAGhB,EAAQF,GAC5BL,EAAOE,EAAUsB,KAAK,MAI9B,OAAOxB,EAGX,SAASyB,EAAYC,EAASC,GAC1B,OAAO,WAIH,IAAIC,EAAOpC,EAAIM,KAAK+B,UAAW,GAQ/B,MAHuB,iBAAZD,EAAK,IAAmC,IAAhBA,EAAKX,QACpCW,EAAKE,KAAK,MAEPjD,EAAIkD,WAjJvB,EAiJoCH,EAAKN,OAAO,CAACI,EAASC,MAUtD,SAASK,EAASC,GACd,OAAO,SAAUC,GACblD,EAAQiD,GAAWC,GAI3B,SAASC,EAAQnC,GACb,GAAIL,EAAQV,EAASe,GAAO,CACxB,IAAI4B,EAAO3C,EAAQe,UACZf,EAAQe,GACfb,EAASa,IAAQ,EACjBpB,EAAKmD,WAtKjB,EAsK8BH,GAGtB,IAAKjC,EAAQX,EAASgB,KAAUL,EAAQR,EAAUa,GAC9C,MAAM,IAAIoC,MAAM,MAAQpC,GAE5B,OAAOhB,EAAQgB,GAMnB,SAASqC,EAAYrC,GACjB,IAAIsC,EACAC,EAAQvC,EAAOA,EAAKwC,QAAQ,MAAQ,EAKxC,OAJID,GAAS,IACTD,EAAStC,EAAKyC,UAAU,EAAGF,GAC3BvC,EAAOA,EAAKyC,UAAUF,EAAQ,EAAGvC,EAAKiB,SAEnC,CAACqB,EAAQtC,GAKpB,SAAS0C,EAAahB,GAClB,OAAOA,EAAUW,EAAYX,GAAW,GA+C5C,SAASiB,EAAW3C,GAChB,OAAO,WACH,OAAQd,GAAUA,EAAOA,QAAUA,EAAOA,OAAOc,IAAU,IAzCnElB,EAAU,SAAUkB,EAAM4C,GACtB,IAAIC,EAnDenB,EAoDfoB,EAAQT,EAAYrC,GACpBsC,EAASQ,EAAM,GACfC,EAAkBH,EAAS,GA2B/B,OAzBA5C,EAAO8C,EAAM,GAETR,IAEAO,EAASV,EADTG,EAASvC,EAAUuC,EAAQS,KAK3BT,EAEItC,EADA6C,GAAUA,EAAO9C,UACV8C,EAAO9C,UAAUC,GAlEb0B,EAkEiCqB,EAjE7C,SAAU/C,GACb,OAAOD,EAAUC,EAAM0B,MAkEZ3B,EAAUC,EAAM+C,IAK3BT,GADAQ,EAAQT,EADRrC,EAAOD,EAAUC,EAAM+C,KAER,GACf/C,EAAO8C,EAAM,GACTR,IACAO,EAASV,EAAQG,KAKlB,CACHU,EAAGV,EAASA,EAAS,IAAMtC,EAAOA,EAClCiD,EAAGjD,EACHkD,GAAIZ,EACJa,EAAGN,IAUX9D,EAAW,CACPN,QAAS,SAAUuB,GACf,OAAOyB,EAAYzB,IAEvBoD,QAAS,SAAUpD,GACf,IAAIqD,EAAIrE,EAAQgB,GAChB,YAAiB,IAANqD,EACAA,EAECrE,EAAQgB,GAAQ,IAGhCsD,OAAQ,SAAUtD,GACd,MAAO,CACHuD,GAAIvD,EACJwD,IAAK,GACLJ,QAASpE,EAAQgB,GACjBd,OAAQyD,EAAW3C,MAK/BpB,EAAO,SAAUoB,EAAMyD,EAAMC,EAAUhC,GACnC,IAAIiC,EAAW1B,EAAS2B,EAAK7C,EAAKL,EAAGkC,EAGjCiB,EAFAjC,EAAO,GACPkC,SAAsBJ,EAQ1B,GAHAd,EAAWF,EADXhB,EAAUA,GAAW1B,GAIA,cAAjB8D,GAAiD,aAAjBA,EAA6B,CAK7D,IADAL,GAAQA,EAAKxC,QAAUyC,EAASzC,OAAS,CAAC,UAAW,UAAW,UAAYwC,EACvE/C,EAAI,EAAGA,EAAI+C,EAAKxC,OAAQP,GAAK,EAK9B,GAAgB,aAHhBuB,GADAlB,EAAMjC,EAAQ2E,EAAK/C,GAAIkC,IACTI,GAIVpB,EAAKlB,GAAK3B,EAASN,QAAQuB,QACxB,GAAgB,YAAZiC,EAEPL,EAAKlB,GAAK3B,EAASqE,QAAQpD,GAC3B6D,GAAe,OACZ,GAAgB,WAAZ5B,EAEP0B,EAAY/B,EAAKlB,GAAK3B,EAASuE,OAAOtD,QACnC,GAAIL,EAAQX,EAASiD,IACjBtC,EAAQV,EAASgD,IACjBtC,EAAQR,EAAU8C,GACzBL,EAAKlB,GAAKyB,EAAQF,OACf,CAAA,IAAIlB,EAAIoC,EAIX,MAAM,IAAIf,MAAMpC,EAAO,YAAciC,GAHrClB,EAAIoC,EAAEY,KAAKhD,EAAIkC,EAAGxB,EAAYC,GAAS,GAAOM,EAASC,GAAU,IACjEL,EAAKlB,GAAK1B,EAAQiD,GAM1B2B,EAAMF,EAAWA,EAAS3B,MAAM/C,EAAQgB,GAAO4B,QAAQoC,EAEnDhE,IAII2D,QA1TpB,IA0TiCA,EAAUP,SACnBO,EAAUP,UAAYpE,EAAQgB,GAClChB,EAAQgB,GAAQ2D,EAAUP,aA5T9C,IA6T2BQ,GAAkBC,IAEzB7E,EAAQgB,GAAQ4D,SAGjB5D,IAGPhB,EAAQgB,GAAQ0D,IAIxBlF,EAAYC,EAAUI,EAAM,SAAU4E,EAAMC,EAAUhC,EAASC,EAAWsC,GACtE,GAAoB,iBAATR,EACP,OAAI1E,EAAS0E,GAEF1E,EAAS0E,GAAMC,GAMnBvB,EAAQrD,EAAQ2E,EAAMf,EAAagB,IAAWV,GAClD,IAAKS,EAAKlC,OAAQ,CAMrB,IAJArC,EAASuE,GACEA,MACP5E,EAAIK,EAAOuE,KAAMvE,EAAOwE,WAEvBA,EACD,OAGAA,EAASnC,QAGTkC,EAAOC,EACPA,EAAWhC,EACXA,EAAU,MAEV+B,OArWhB,EAkYQ,OAxBAC,EAAWA,GAAY,aAIA,mBAAZhC,IACPA,EAAUC,EACVA,EAAYsC,GAIZtC,EACA/C,OArXZ,EAqXwB6E,EAAMC,EAAUhC,GAQ5BwC,YAAW,WACPtF,OA9XhB,EA8X4B6E,EAAMC,EAAUhC,KAC7B,GAGA7C,GAOXA,EAAIK,OAAS,SAAUiF,GACnB,OAAOtF,EAAIsF,IAMf3F,EAAU4F,SAAWpF,GAErBN,EAAS,SAAUsB,EAAMyD,EAAMC,GAC3B,GAAoB,iBAAT1D,EACP,MAAM,IAAIoC,MAAM,6DAIfqB,EAAKlC,SAINmC,EAAWD,EACXA,EAAO,IAGN9D,EAAQX,EAASgB,IAAUL,EAAQV,EAASe,KAC7Cf,EAAQe,GAAQ,CAACA,EAAMyD,EAAMC,MAI9BW,IAAM,CACTC,QAAQ,GAtahB,GA0aA5F,EAAO,cAAc,eAIrB6F,OAAOC,MAAQD,OAAOC,OAAS,QAGZR,IAAfS,MAAMC,OAERD,MAAMnF,UAAUoF,KAAO,WACrBC,KAAKC,kBACLD,KAAKE,mBAIT,MAAMC,EAAW,IAAIC,OAAO,YAAc,KAC1CC,OAAO1F,UAAU2F,MAAQ,WACvB,MAAO,IAAMN,KAAKvD,QAAQ0D,EAAU,QAAU,KAGhD,MAAMI,EAAY,IAAIH,OAAO,YAAc,KAC3CC,OAAO1F,UAAU6F,YAAc,WAC7B,OAAOR,KAAKvD,QAAQ8D,EAAW,SAGjC,MAAME,EAAW,IAAIL,OAAO,qBAAsB,KAC5CM,EAAW,IAAIN,OAAO,UAAW,KA8BvC,SAASO,EAAiBC,GAExB,KAAOA,EAAKC,YACVD,EAAKE,YAAYF,EAAKC,YAM1B,SAASE,EAAgBrC,GACvB,OAAKA,EAAU,UAAiB,GAAXA,EAAEsC,QACdtC,EAAEuC,SACJvC,EAAEsC,QAGX,SAASE,EAAUC,GACjB,OAAQ,IAAMA,EAAIC,SAAS,KAAKC,QAAQ,GA7C1ChB,OAAO1F,UAAU2G,QAAU,WACzB,OAAOtB,KAAKuB,cAAc9E,QAAQgE,EAAU,IAAIhE,QAAQiE,EAAU,MAIpEc,YAAY7G,UAAU8G,YAAc,SAAUC,EAAIC,GAChD,MAAMC,EAAK5B,KAAK6B,UACZD,EAAGE,SAASJ,IACdE,EAAGG,IAAIJ,GACPC,EAAGI,OAAON,KAGVE,EAAGI,OAAOL,GACVC,EAAGG,IAAIL,KAKXF,YAAY7G,UAAUsH,KAAO,SAAUC,GACrC,OAAOlC,KAAKmC,YAAYC,SAASC,cAAcH,KAIjDV,YAAY7G,UAAU2H,KAAO,SAAUC,GACrC,OAAOvC,KAAKmC,YAAYC,SAASI,eAAeD,KAuClDxI,EAAO,OAAO,IAAG,WAEf8F,MAAM4C,IAAM5C,MAAM4C,KAAO,GACzB5C,MAAM6C,OAAS7C,MAAM6C,QAAU,GAE/B,MAAMC,EAAM9C,MAAM6C,OAsBlB,OArBAC,EAAIC,GAAMD,EAAIC,IAAO,KACrBD,EAAIE,IAAMF,EAAIE,KAAO,MAGrBhD,MAAMiD,cAAgB,WACpB,QAAqBzD,IAAjBQ,MAAMkD,OAAsB,CAC9B,MAAMC,EAAQZ,SAASC,cAAc,SACrCD,SAASa,KAAKd,YAAYa,GAC1BnD,MAAMkD,OAASC,EAAME,MAEvB,OAAOrD,MAAMkD,QAKflD,MAAMsD,IAAMtD,MAAMsD,KAAO,SAAUC,EAAMC,EAAKC,GACxCA,IACFD,GAAO,SAAWC,GACpBC,QAAQJ,IAAIC,EAAO,KAAOC,IAGrBxD,SAGTA,MAAM2D,iBAAmB3D,MAAM2D,kBAAoB,CAAEC,IAAM,IAI3D1J,EAAO,iBAAiB,CAAC,SAAS,WAEhC,MAAM2J,EAAK7D,MAAM2D,iBA4EjB,OA1EAE,EAAGC,QAAU,SAAUC,EAAcrG,GAEnC,IAAKqG,EACH,OAEF,IAAIC,EAAO7D,KAAK4D,GAIhB,GAAKC,EAAL,CAGA,GAAKtG,EAAMuG,SAAS,KAApB,CAmBK,CACH,MAAMC,EAAIxG,EAAMpB,MAAM,KACtB,IAAI6H,EAAKD,EAAE,GAAK,IACZE,EAAKF,EAAE,GAAK,IACZxB,EAAO,GAGX,IAAK,IAAIxG,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMiI,EAAI,CAChBH,EAAK9H,GAAG,GACVwG,GAAQsB,EAAK9H,GAAG,GAEhBwG,GAAQsB,EAAK9H,GAAG,GAClB,MAKJ,GAAoB,IAAhBwG,EAAKjG,OACP,OAKF,GAFAuH,EAAO7D,KAAK4D,EAAeI,IAEtBH,EACH,OAGF,IAAK,IAAI9H,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMkI,EAIhB,OAHIJ,EAAK9H,GAAG,KACVwG,GAAQ,KAAOsB,EAAK9H,GAAG,IAElBwG,EAKb,MAAO,GA1DLhF,GAAS,IAKT,IAAK,IAAIxB,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMwB,EAChB,OAAIsG,EAAK9H,GAAG,GACH8H,EAAK9H,GAAG,QAEf,IAkDH2H,KAGT3J,EAAO,sBAAsB,CAAC,mBAAmB,SAAU2J,GACzDA,EAAG,KAAKvG,KACN,CAAC,kBAAmB,UAAW,cAGjCuG,EAAG,WAAa,CACd,CAAC,IAAK,IAAK,YACX,CAAC,IAAK,IAAK,aACX,CAAC,IAAK,IAAK,YAIf3J,EAAO,wBAAwB,CAAC,mBAAmB,SAAU2J,GAC3DA,EAAG,KAAKvG,KACN,CAAC,SAAU,YAAa,iBAI5BpD,EAAO,+BAA+B,CAAC,mBAAmB,SAAU2J,GAClEA,EAAG,KAAKvG,KACN,CAAC,iBAAkB,YAAa,kBAIlCuG,EAAG,aAAe,CAChB,CAAC,OAAQ,OAAQ,YACjB,CAAC,OAAQ,OAAQ,iBACjB,CAAC,QAAS,QAAS,gBAIvB5J,EAAQ,CACN,sBACA,wBACA,iCAGFC,EAAO,WAAW,eAclBA,EAAO,YAAY,CASjBmK,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOlE,MAAMoE,MAAMD,IAUnCE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOTuE,QAAU,SAAUA,GAGlB,OAFyB,IAArBrH,UAAUZ,SACZ0D,KAAKwE,SAAWpC,SAASI,eAAe+B,IACnCvE,KAAKwE,UAOdC,OAAS,SAAUA,GAGjB,OAFyB,IAArBvH,UAAUZ,SACZ0D,KAAK0E,QAAUD,GACVzE,KAAK0E,SAQdC,QAAU,WACR,OAAO3E,KAAK4E,UASdC,OAAS,SAAUC,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,UACZgD,EACPlD,EAAGG,IAAI,UAEPH,EAAGI,OAAO,WAWdgD,OAAS,SAAUF,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,WACZgD,EACPlD,EAAGG,IAAI,WAEPH,EAAGI,OAAO,YAMd+C,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMC,EAAK9C,SAASC,cAAc,MAUlC,YAPwBhD,IAApBW,KAAc,UAChBkF,EAAY,QAAIlF,KAAKmF,QAAQC,KAAKpF,OAIpCkF,EAAG/C,YAAYnC,KAAKuE,WAEbvE,KAAKiF,IAAMC,GAQpBG,UAAY,SAAU1H,GAGpB,GAAIqC,KAAKsF,UAAY3H,EACnB,OAGmB,OAAjBqC,KAAKsF,SACPtF,KAAKuF,WAGP,MAAMC,EAAWxF,KAAK+E,UAAUU,WAChC,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAQ,EAAGP,GAAK,EAAGA,IACvCiE,KAAK0F,WAAWF,EAASzJ,GAAI4B,GAG/BqC,KAAKsF,QAAU3H,GAOjB4H,SAAW,WACT,GAAqB,OAAjBvF,KAAKsF,QACP,OAEF,MAAM5G,EAAIsB,KAAK+E,UAETY,EAAQjH,EAAEkH,qBAAqB,QAErC,IAAK,IAAI7J,EAAI4J,EAAMrJ,OAAS,EAAGP,GAAK,EAAGA,IAGrC4J,EAAM5J,GAAG8J,WAAWC,aAEnB1D,SAASI,eACPmD,EAAM5J,GAAG8E,WAAWkF,WAEtBJ,EAAM5J,IAKT2C,EAAEtD,YACF4E,KAAKsF,QAAU,MAKjBI,WAAa,SAAUM,EAAMC,GAC3B,GAAsB,IAAlBD,EAAKE,SAAgB,CAEvB,MAAM3D,EAASyD,EAAKD,UACdI,EAAS5D,EAAKhB,cAGpB,GAAI0E,EAAc,CAOhB,MAAMG,GAFNH,EAAeA,EAAaI,QAEElK,MAAM,KAEpC,IAAImK,EACAC,GAAO,EACPC,EAAM,EAqBV,GAjBAJ,EAASK,SAAQ,SAAS1K,GAGxBuK,EAAUH,EAAOtI,QAAQ9B,GACrBuK,EAAU,KAGD,IAATC,GAAcD,EAAUC,GAC1BA,EAAMD,EACNE,EAAMzK,EAAEO,QAEDgK,IAAYC,GAAOxK,EAAEO,OAASkK,IACrCA,EAAMzK,EAAEO,YAKRiK,GAAO,EAAG,CAGTA,EAAM,GACRP,EAAKH,WAAWa,aACdtE,SAASI,eAAeD,EAAKlB,OAAO,EAAGkF,IACvCP,GAKJ,MAAMW,EAAKvE,SAASC,cAAc,QAClCsE,EAAGxE,YACDC,SAASI,eAAeD,EAAKlB,OAAOkF,EAAKC,KAE3CR,EAAKH,WAAWa,aAAaC,EAAIX,GAGjC,MAAMY,EAAQrE,EAAKlB,OAAOkF,EAAMC,GAEhC,GAAII,EAAMtK,OAAS,EAAG,CACpB,MAAMuK,EAASzE,SAASI,eAAeoE,GACvCZ,EAAKH,WAAWa,aACdG,EACAb,GAEFhG,KAAK0F,WAAWmB,EAAQZ,GAGzBD,EAAKH,WAAW/E,YAAYkF,SAK7B,CACH,MAAMR,EAAWQ,EAAKP,WACtB,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAQ,EAAGP,GAAK,EAAGA,IACxCiE,KAAK0F,WAAWF,EAASzJ,GAAIkK,KAMlC7B,MAAQ,SAAUD,GAEhB,QAAkB9E,IAAd8E,EAAO,GACT,MAAM,IAAI1G,MAAM,sBAGlB,MAAMqJ,EAAI9G,KAcV,OAZA8G,EAAEvC,QAAQJ,EAAO,IAEbA,EAAO7H,OAAS,IAClBwK,EAAEpC,QAAUP,EAAO,GAEfA,EAAO7H,OAAS,IAClBwK,EAAEC,SAAW5C,EAAO,KAGxB2C,EAAElC,SAAW,IAAMkC,EAAEvC,UAAUyC,YAAYzF,cAC3CuF,EAAExB,QAAU,KAELtF,MAOTmF,QAAU,SAAUzG,GAClB,MAAMuI,EAAIjH,KAAKkH,OAGfD,EAAEtJ,OAAO,IAELqC,KAAK+G,UACP/G,KAAK+G,SAAS3J,MAAM4C,KAAMtB,GAE5BuI,EAAEE,QAOJD,KAAO,WACL,OAAOlH,KAAKoH,SAMhBrN,EAAO,cAAc,CAKnBmK,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WACN,MAAM0C,EAAI9G,KAYV,OAVA8G,EAAEO,QAAU,GAGZP,EAAE7B,IAAM7C,SAASC,cAAc,QAC/ByE,EAAE7B,IAAIpD,UAAUE,IAAI,aAGC1C,IAAjByH,EAAW,UACbA,EAAE7B,IAAa,QAAI6B,EAAE3B,QAAQC,KAAK0B,IAE7BA,GAITQ,QAAU,WACR,OAAOtH,KAAKiF,IAAIsC,UACZvH,KAAKqH,SAUXhD,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOT6E,OAAS,SAAUC,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,UACZgD,EACPlD,EAAGG,IAAI,UAEPH,EAAGI,OAAO,WAOdwF,MAAQ,WACN,OAAOxH,KAAKqH,QAAQ/K,OAAS,GAQ/BiB,MAAQ,SAAUkK,GAChB,OAAyB,IAArBvK,UAAUZ,QACZ0D,KAAKqH,QAAUI,EACRzH,KAAKsH,WAEPtH,KAAKqH,SAOdtF,IAAM,SAAU0F,GAEd,OADAzH,KAAKqH,SAAWI,EACTzH,KAAKsH,WAOdI,MAAQ,WAEN,OADA1H,KAAKqH,QAAU,GACRrH,KAAKsH,WAQdnC,QAAU,aAMVwC,KAAO,WACL,MAAMb,EAAI9G,KAYV,OATI8G,EAAEO,QAAQ/K,OAAS,EACrBwK,EAAEO,QAAUP,EAAEO,QAAQvJ,UACrB,EAAGgJ,EAAEO,QAAQ/K,OAAS,GAIvBwK,EAAEO,QAAU,GAGPP,EAAEQ,WAOXvC,QAAU,WACR,OAAO/E,KAAKiF,KAOdiC,KAAO,WACL,OAAOlH,KAAKoH,SAMhBrN,EAAO,mBAAmB,CAKxBmK,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WAGN,OAFApE,KAAKiF,IAAM7C,SAASC,cAAc,OAClCrC,KAAKiF,IAAIpD,UAAUE,IAAI,eAChB/B,MAUTqE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOT+E,QAAU,WACR,OAAO/E,KAAKiF,KAOdlD,IAAM,SAAU6F,GACd5H,KAAKiF,IAAI9C,YAAYC,SAASC,cAAc,SACzCF,YAAYC,SAASI,eAAeoF,EAAM,GAAK,QAOpDC,MAAQ,WACN,KAAO7H,KAAKiF,IAAIpE,YACdb,KAAKiF,IAAIpE,WAAWmB,YAc1BjI,EAAO,cAAc,CAQnBmK,OAAS,SAAUgD,GACjB,OAAOxM,OAAOwJ,OAAOlE,MAAMoE,MAAM8C,IAUnC5K,OAAS,SAAUP,GACjB,OAAyB,IAArBmB,UAAUZ,OACL0D,KAAK8H,SACV/L,GAAKiE,KAAK8H,UAEd9H,KAAK8H,QAAU/L,GADNiE,OAWX+H,MAAQ,SAAUhM,GAChB,OAAyB,IAArBmB,UAAUZ,OACL0D,KAAKgI,QACVjM,GAAKiE,KAAKgI,SAEdhI,KAAKgI,OAASjM,GADLiE,OAWX6E,OAAS,SAAUC,GAajB,OAZyB,IAArB5H,UAAUZ,SACRwI,EACE9E,KAAKiI,UACRjI,KAAKiF,IAAIpD,UAAUE,IAAI,UACvB/B,KAAKiI,SAAU,GAGTjI,KAAKiI,UACbjI,KAAKiF,IAAIpD,UAAUG,OAAO,UAC1BhC,KAAKiI,SAAU,IAGXjI,KAAKiI,SASdC,UAAY,SAAUC,GAGpB,MACMC,EAAkBD,GADJnI,KAAKqI,aAAerI,KAAKsI,eAIvCC,EAAMvI,KAAKwI,OACfC,SAASL,EAAiBpI,KAAK0I,UAAY1I,KAAK2I,OAAOC,iBAG7CvJ,IAARkJ,GACFvI,KAAKoH,MAAMyB,OAAON,IAUtBO,UAAY,SAAUC,GACpB,MAAMC,EAAaD,EAAS/I,KAAKqI,aAC3BE,EAAMvI,KAAKwI,OAAOC,SAASO,GAAahJ,KAAK0I,SAAW,UAElDrJ,IAARkJ,GACFvI,KAAKoH,MAAMyB,OAAON,IAUtBC,OAAS,SAAUD,GACjB,OAAyB,IAArBrL,UAAUZ,OACL0D,KAAKiJ,SAGVV,EAAMvI,KAAK0I,SACbH,EAAMvI,KAAK0I,SACJH,EAAM,IACbA,EAAM,GAGJA,IAAQvI,KAAKiJ,SAIjBjJ,KAAKiJ,QAAUV,EACfvI,KAAKkJ,QAAQC,MAAMC,IAAOpJ,KAAKqJ,MAAQd,EAAO,IACvCA,QANP,IAaFxD,QAAU,WACR,OAAO/E,KAAKiF,KAQdqE,OAAS,WAEP,MAAMxC,EAAI9G,KACJuJ,EAAIzC,EAAE7B,IAAIkE,MAGZrC,EAAEgB,SAAWhB,EAAEkB,OACjBuB,EAAEC,QAAU,QAIZD,EAAEC,QAAU,QAGd1C,EAAE2C,QAAa3C,EAAEkB,OAASlB,EAAEgB,QAAW,IACvChB,EAAE4B,SAAW5B,EAAEgB,QAAUhB,EAAEkB,OAC3BlB,EAAEuC,OAAY,IAAMvC,EAAE2C,SAAW3C,EAAE4B,SACnC5B,EAAEoC,QAAQC,MAAMO,OAAS5C,EAAE2C,QAAU,MAKvCrF,MAAQ,SAAU8C,GAChB,MAAMJ,EAAI9G,KAEV8G,EAAEM,MAAQF,EAEVJ,EAAEmC,QAAU,EACZnC,EAAE6B,OAAS,GACX7B,EAAEmB,SAAU,EAEZ,MAAM0B,EAAK7C,EAAE7B,IAAM7C,SAASC,cAAc,OAmB1C,OAlBAsH,EAAGC,aAAa,QAAS,SAEzB9C,EAAEoC,QAAUS,EAAGxH,YACbC,SAASC,cAAc,SAGzByE,EAAE+C,OAASF,EAAGxH,YAAYC,SAASC,cAAc,QAGjDyE,EAAE+C,OAAOC,iBAAiB,aAAa,SAAUpL,GAC/CA,EAAEqB,UACD,GAGH+G,EAAE+C,OAAOC,iBAAiB,QAAShD,EAAEiD,YAAY3E,KAAK0B,IAAI,GAE1DA,EAAEoC,QAAQY,iBAAiB,YAAahD,EAAEkD,WAAW5E,KAAK0B,IAAI,GAEvDA,GAKTmD,kBAAoB,WAClBjK,KAAKqI,aAAgBrI,KAAKiF,IAAIiF,aAC9BlK,KAAKsI,cAAgBtI,KAAKkJ,QAAQgB,cAKpCC,WAAa,SAAUzL,GACrBsB,KAAKkI,UAAUxJ,EAAE0L,QAAUpK,KAAK2I,OAAO0B,MACvC3L,EAAEqB,QAKJuK,SAAW,SAAU5L,GACnBsB,KAAK6E,QAAO,GACZjF,OAAO2K,oBAAoB,YAAavK,KAAK2I,OAAO6B,KACpD5K,OAAO2K,oBAAoB,UAAWvK,KAAK2I,OAAO8B,IAClDzK,KAAKoH,MAAMsD,SAKbV,WAAa,SAAUtL,GAErB,MAAMiM,EAAK3K,KAAK2I,OAGhBgC,EAAGN,KAAO3L,EAAE0L,QACZO,EAAG/B,WAAa5I,KAAKiJ,QAGrB0B,EAAGH,IAAOxK,KAAKmK,WAAW/E,KAAKpF,MAC/B2K,EAAGF,GAAOzK,KAAKsK,SAASlF,KAAKpF,MAG7BA,KAAKiK,oBAELjK,KAAK6E,QAAO,GAEZjF,OAAOkK,iBAAiB,YAAaa,EAAGH,KACxC5K,OAAOkK,iBAAiB,UAAWa,EAAGF,IAEtC/L,EAAEqB,QAKJgK,YAAc,SAAUrL,GACtBsB,KAAKiK,oBAELjK,KAAK8I,UACHpK,EAAE0L,QAAUpK,KAAK6J,OAAOe,iBAAiB,GAAGxB,KAE9C1K,EAAEqB,UAsBNhG,EAAO,OAAO,CACZ,YACA,cACA,mBACA,cACA,SACC,SAAU8Q,EACAC,EACAC,EACAC,GAUX,MAAO,CAcL9G,OAAS,SAAU+G,EAAM9G,GACvB,OAAOzJ,OAAOwJ,OAAOlE,MAAMoE,MAAM6G,EAAM9G,IAIzCC,MAAQ,SAAU6G,EAAM9G,QAEP9E,IAAX8E,IACFA,EAAS,IAEX,MAAM2C,EAAI9G,KAEV8G,EAAEoE,WAAa/G,EAAkB,WAAK0G,OAGRxL,IAA1B8E,EAAoB,YACtB2C,EAAExB,QAAUnB,EAAoB,YAAED,SAGlC4C,EAAExB,QAAUwF,EAAmB5G,SAEjC4C,EAAExB,QAAQ8B,MAAQN,OAGiBzH,IAA/B8E,EAAyB,iBAC3B2C,EAAEqE,aAAehH,EAAyB,iBAAED,SAG5C4C,EAAEqE,aAAeJ,EAAwB7G,SAE3C4C,EAAEqE,aAAa/D,MAAQN,EAGvBA,EAAEoC,QAAU8B,EAAY9G,OAAO4C,GAG/B,IAAI6C,EAAKvH,SAASC,cAAc,MAkDhC,OAjDAsH,EAAGR,MAAMiC,QAAU,EACnBzB,EAAGC,aAAa,WAAY,GAC5BD,EAAG9H,UAAUE,IAAI,OAAQ,QACzB4H,EAAGxH,YAAY2E,EAAExB,QAAQP,WACzB4E,EAAGxH,YAAY2E,EAAEqE,aAAapG,WAC9B4E,EAAGxH,YAAY2E,EAAEoC,QAAQnE,WAGzB4E,EAAS,KAAI7C,EAGb6C,EAAGG,iBACD,UACAhD,EAAEuE,SAASjG,KAAK0B,IAChB,GAIF6C,EAAGG,iBACD,WACAhD,EAAEwE,UAAUlG,KAAK0B,IACjB,GAIF6C,EAAGG,iBACD,QACAhD,EAAEyE,YAAYnG,KAAK0B,IACnB,GAIF,CAAC,aAAc,WAAY,aAAaL,QACtC/H,GAAKiL,EAAGG,iBAAiBpL,EAAGoI,EAAE0E,OAAOpG,KAAK0B,IAAI,IAIhDA,EAAE7B,IAAM0E,EAER7C,EAAEkB,OAjGY,EAmGdlB,EAAE2E,OAAS,IAAIC,MAIf5E,EAAE6E,UAAUV,GAEZnE,EAAE8E,UAAW,EAEN9E,GAIT6E,UAAY,SAAUV,GACpB,MAAMnE,EAAI9G,KAEV8G,EAAE+E,WAAQxM,EAGV,IAAK,IAAItD,EAAI,EAAGA,EAAI+K,EAAE2E,OAAOnP,OAAQP,WAC5B+K,EAAE2E,OAAO1P,GAAU,aACnB+K,EAAE2E,OAAO1P,GAGlB+K,EAAE2E,OAAS,IAAIC,MACf5E,EAAEgF,cAIFhF,EAAEqE,aAAatD,QAGfoD,EAAKxE,SAAQ,SAAS1K,GACpB,MAAMd,EAAM+E,KAAKkL,WAAWhH,OAAOnI,GAGnCd,EAAW,MAAI+E,KACfA,KAAKmL,aAAapJ,IAAIhG,GACtBiE,KAAKyL,OAAOtO,KAAKlC,KAChB6L,GAEHA,EAAEoC,QAAQ5M,OAAOwK,EAAEiF,cAChBhE,MAAMjB,EAAEkB,QACRsB,SAEHxC,EAAEkF,cAAe,EAEjBlF,EAAE0B,OAAS,EACX1B,EAAEmF,SAAW,GAIfC,UAAY,WACV,MAAMpF,EAAI9G,KAeV,QAZgBX,IAAZyH,EAAE+E,MACJ/E,EAAE+E,MAAQ,GAEgB,IAAnB/E,EAAE+E,MAAMvP,SACfwK,EAAEqF,WAAU,GACZrF,EAAE+E,MAAMvP,OAAS,GAInBwK,EAAE0B,OAAS,EAGP1B,EAAEnJ,SAASrB,QAAU,EAAG,CAG1B,IAAIP,EAAI,EACR,KAAOA,EAAI+K,EAAE2E,OAAOnP,OAAQP,IAC1B+K,EAAE+E,MAAM1O,KAAKpB,GACb+K,EAAE2E,OAAO1P,GAAGwJ,WAKd,OAFAuB,EAAEoC,QAAQ5M,OAAOP,GAAGuN,UAEb,EAOT,MAAM8C,EAAatF,EAAEnJ,SAAS4D,cAAcpF,MAAM,KAGlD,IAAIkQ,EAAY,EAiChB,OA7BAvF,EAAE2E,OAAOhF,SAAQ,SAAS6F,EAAI/F,GAE5B,IAAIgG,EAAS,EAEbH,EAAW3F,SAAQ,SAASjI,GAGrB8N,EAAG3H,UAAUb,SAAS,IAAMtF,GAC/B+N,GAAU,EAIHD,EAAG3H,UAAUb,SAAStF,KAC7B+N,GAAU,MAIVA,EAASF,GACXrM,KAAK6L,MAAQ,CAACtF,GACd8F,EAAYE,GAELA,GAAUF,GACjBrM,KAAK6L,MAAM1O,KAAKoJ,KAEjBO,GAEHA,EAAEoC,QAAQ5M,OAAOwK,EAAE+E,MAAMvP,QAAQgN,SAG1BxC,EAAE+E,MAAMvP,OAAS,GAS1BkQ,QAAU,WACR,MAAM1F,EAAI9G,KAGGX,MAATyH,EAAE7B,YACG6B,EAAE7B,IAAU,KAGrB6B,EAAE2E,OAAOhF,SAAQ,SAAS1K,UACjBA,EAAS,gBAIX+K,EAAExB,QAAe,aACjBwB,EAAEqE,aAAoB,aACtBrE,EAAEoC,QAAe,OAO1BwB,MAAQ,WACN1K,KAAKiF,IAAIyF,SAKXa,YAAc,SAAU7M,GACtB,MAAM+N,EAAQ/N,EAAEgO,OAAS,IACrBD,EAAQ,EACVzM,KAAK2M,OACEF,EAAQ,GACfzM,KAAK4M,OACPlO,EAAEqB,QAKJyL,OAAS,SAAU9M,GACPsB,KAAK6M,SAEf,GAAe,eAAXnO,EAAE0E,KACJpD,KAAK8M,WAAapO,EAAEqO,QAAQ,GAAG3C,aAE5B,GAAe,aAAX1L,EAAE0E,KACTpD,KAAK8M,gBAAazN,OAEf,GAAe,cAAXX,EAAE0E,KAAsB,CAC/B,MAAM4J,EAAKtO,EAAEqO,QAAQ,GAOhB/M,KAAK8M,WAAa,GAAME,EAAG5C,SAC9BpK,KAAKiN,WACLjN,KAAK8M,WAAaE,EAAG5C,SAEbpK,KAAK8M,WAAa,GAAME,EAAG5C,UACnCpK,KAAKkN,SACLlN,KAAK8M,WAAaE,EAAG5C,SAEvB1L,EAAEqB,SAKNsL,SAAW,SAAU3M,GACnB,MAAMoI,EAAI9G,KAEV,OAAQe,EAAerC,IAEvB,KAAK,GACHA,EAAEqB,OACF+G,EAAEK,OACF,MAEF,KAAK,GACHzI,EAAEqB,OACF+G,EAAE8F,OACF,MAEF,KAAK,GACHlO,EAAEqB,OACF+G,EAAEqG,SACF,MAEF,KAAK,GACHzO,EAAEqB,OACF+G,EAAE6F,OACF,MAEF,KAAK,GACHjO,EAAEqB,OACF+G,EAAEsG,WACF,MAEF,KAAK,GACH,GAAItG,EAAExB,QAAQT,SACZ,MAEF,MAAMwI,EAAOvG,EAAEwG,SAASxG,EAAEmF,eAEF5M,IAApBgO,EAAc,SAChBA,EAAc,QAAEjI,KAAKiI,GAAMjQ,QAG7BsB,EAAEqB,OACF,MAEF,KAAK,GAEC+G,EAAExB,QAAQT,SACZiC,EAAExB,QAAQH,QAAQzG,GAIlBoI,EAAEwG,SAASxG,EAAEmF,UAAU9G,QAAQzG,GACjCA,EAAEqB,OACF,MAEF,KAAK,EACH+G,EAAExB,QAAQqC,OACVb,EAAEyG,OACF7O,EAAEqB,SAONuL,UAAY,SAAU5M,GACD,IAAfA,EAAEuC,WACJvC,EAAEqB,OAGFC,KAAKsF,QAAQvD,IACX1B,OAAOmN,aAAazM,EAAerC,KAGrCsB,KAAKuN,SAST1E,OAAS,SAAU4E,GACjB,MAAM3G,EAAI9G,KAGV,GAAIyN,EAAK,EACPA,EAAK,MAIF,CAAA,GAAI3G,EAAEiF,aAAejF,EAAEiB,QAC1B,OAAO,EAIA0F,EAAM3G,EAAEiF,aAAejF,EAAEiB,UAChC0F,EAAM3G,EAAEiF,aAAejF,EAAEiB,SAI3B,OAAIjB,EAAE0B,SAAWiF,IAGjB3G,EAAE4G,WAAWD,IAEN,IAOT1I,QAAU,WACR,OAAO/E,KAAKiF,KAOd0I,UAAY,WACV,OAAO3N,KAAKkL,YAQdnD,MAAQ,SAAUA,GAChB,OAAyB,IAArB7K,UAAUZ,QACR0D,KAAKgI,SAAWD,IAClB/H,KAAKgI,OAASD,EACd/H,KAAKkJ,QAAQnB,MAAMA,GAAOuB,UAErBtJ,MAEFA,KAAKgI,QAUd3D,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAUTuN,KAAO,SAAU1I,GACf,MAAMiC,EAAI9G,KAOV,GAJA8G,EAAE8G,UACF9G,EAAEgF,eAGGhF,EAAEoF,YAQL,OALApF,EAAExB,QAAQT,QAAO,GAGjBiC,EAAE7B,IAAIpD,UAAUE,IAAI,YAEb,EAGT,IAAIyG,EAAS,EAGb,GAAyB,IAArBtL,UAAUZ,OAAc,CAW1B,GARIuI,EAAS,EACXA,EAAS,EAEFA,GAAUiC,EAAEiF,eACnBlH,EAASiC,EAAEiF,aAAe,GAIxBlH,GAAUiC,EAAEkB,OAAQ,CACtBQ,EAAS3D,EACT,MAAMgJ,EAAY/G,EAAEiF,aAAejF,EAAEkB,OACjCQ,EAASqF,IACXrF,EAASqF,GAIb/G,EAAEmF,SAAWpH,OAINiC,EAAEkF,aACTlF,EAAEmF,SAAW,EAKbnF,EAAEmF,UAAY,EAoBhB,OAjBAnF,EAAE0B,OAASA,EACX1B,EAAE4G,WAAWlF,IAGO,IAAhB1B,EAAEmF,UACJnF,EAAEwG,SAASxG,EAAEmF,UAAUpH,QAAO,GAIhCiC,EAAExB,QAAQT,QAAO,GAGjBiC,EAAE7B,IAAIpD,UAAUE,IAAI,WAGpB+E,EAAEqF,WAAU,IAEL,GAOThF,KAAO,WACAnH,KAAK4L,WACR5L,KAAK8L,cACL9L,KAAKsF,QAAQoC,QACb1H,KAAK8N,SACL9N,KAAKiF,IAAIpD,UAAUG,OAAO,aAU9B8L,OAAS,aAOTnQ,OAAS,SAAUoQ,GACjB,OAAyB,IAArB7Q,UAAUZ,QACZ0D,KAAKsF,QAAQ/H,MAAMwQ,GACZ/N,MAEFA,KAAKsF,QAAQ/H,SAOtByQ,YAAc,WACZ,OAAOhO,KAAKmL,cAOd0B,OAAS,WACP,OAAO7M,KAAKkJ,SAOd4C,YAAc,WAEZ,MAAMtG,EAAWxF,KAAKiF,IAAIQ,WAG1B,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAS,EAAGP,GAAK,EAAGA,IACxCiE,KAAKiF,IAAInE,YACP0E,EAASzJ,KAWfsR,KAAO,SAAUzP,GACf,OAAOoC,KAAKyL,OAAO7N,IAUrB0P,SAAW,SAAU1P,GACnB,QAAmByB,IAAfW,KAAK6L,OACF7L,KAAKkM,YAGZ,OAAOlM,KAAKyL,OAAOzL,KAAK6L,MAAMjO,KAUhCqQ,UAAY,SAAUrQ,GACpB,KAAIA,GAASoC,KAAK+H,SAGlB,OAAO/H,KAAKsN,SAAStN,KAAKwI,OAAS5K,IAOrCtB,OAAS,WACP,OAAO0D,KAAKyL,OAAOnP,QAOrByP,WAAa,WAGX,YAFmB1M,IAAfW,KAAK6L,OACP7L,KAAKkM,YACAlM,KAAK6L,MAAMvP,QAOpBqQ,KAAO,WACL,MAAM7F,EAAI9G,KAGV,GAAuB,IAAnB8G,EAAEiF,aACJ,QAGkB,IAAhBjF,EAAEmF,UAAoBnF,EAAExB,QAAQT,UAClCiC,EAAEwG,SAASxG,EAAEmF,UAAUpH,QAAO,GAIhCiC,EAAEmF,WACF,IAAIiC,EAAUpH,EAAEwG,SAASxG,EAAEmF,UAG3B,QAAgB5M,IAAZ6O,EAAuB,CAGzB,MAAMvQ,EAASqC,KAAKsF,QAGpB,GAAI3H,EAAO6J,UAAY7J,EAAOkH,SAG5B,OAFAiC,EAAEmF,gBACFtO,EAAOkH,QAAO,GAMdqJ,EAAUpH,EAAEwG,SAAS,GAErBxG,EAAEmF,SAAW,EACbnF,EAAE4G,WAAW,QAKR5G,EAAEmF,UAAanF,EAAEiB,QAAUjB,EAAE0B,OACpC1B,EAAE+B,OAAO/B,EAAEmF,SAAWnF,EAAEiB,QAAU,GAI3BjB,EAAEmF,UAAYnF,EAAE0B,QACvB1B,EAAE+B,OAAO/B,EAAEmF,UAGbnF,EAAExB,QAAQT,QAAO,GACjBqJ,EAAQrJ,QAAO,IAOjB+H,KAAO,WACL,MAAM9F,EAAI9G,KAGV,GAAuB,IAAnB8G,EAAEiF,aACJ,OAGGjF,EAAExB,QAAQT,YAGO,IAAhBiC,EAAEmF,SACJnF,EAAEmF,SAAWnF,EAAEiF,aAKfjF,EAAEwG,SAASxG,EAAEmF,YAAYpH,QAAO,IAKpC,IAAIqJ,EAAUpH,EAAEwG,SAASxG,EAAEmF,UAG3B,QAAgB5M,IAAZ6O,EAAuB,CAGzB,MAAMvQ,EAASmJ,EAAExB,QACjB,IAAIkD,EAAU1B,EAAEiF,aAAejF,EAAEiB,QASjC,GANAS,EAASA,EAAS,EAAI,EAAIA,EAG1B1B,EAAEmF,SAAWnF,EAAEiF,aAAe,EAG1BpO,EAAO6J,UAAY7J,EAAOkH,SAI5B,OAHAiC,EAAEmF,WACFtO,EAAOkH,QAAO,QACdiC,EAAE0B,OAASA,GAMX0F,EAAUpH,EAAEwG,SAASxG,EAAEmF,UACvBnF,EAAE4G,WAAWlF,QAKR1B,EAAEmF,SAAWnF,EAAE0B,OACtB1B,EAAE+B,OAAO/B,EAAEmF,UAIJnF,EAAEmF,UAAanF,EAAEiB,QAAUjB,EAAE0B,QACpC1B,EAAE+B,OAAO/B,EAAEmF,SAAWnF,EAAEiB,QAAU,GAGpCjB,EAAExB,QAAQT,QAAO,GACjBqJ,EAAQrJ,QAAO,IAOjBsI,OAAS,WACPnN,KAAK6I,OAAO7I,KAAKwI,OAASxI,KAAK+H,UAOjCqF,SAAW,WACTpN,KAAK6I,OAAO7I,KAAKwI,OAASxI,KAAK+H,UAOjCmF,OAAS,WACPlN,KAAK6I,OAAO7I,KAAKwI,OAAS,IAO5ByE,SAAW,WACTjN,KAAK6I,OAAO7I,KAAKwI,OAAS,IAK5BoF,QAAU,WACR5N,KAAK6L,MAAMpF,SAAQ,SAAS6F,GAC1B,MAAMe,EAAOrN,KAAKyL,OAAOa,GACzBe,EAAK9H,WACL8H,EAAKxI,QAAO,KACX7E,OAKLmM,UAAY,SAAUrH,GACM,IAAtB9E,KAAK6L,MAAMvP,SAGf0D,KAAKqN,KAAKrN,KAAK6L,MAAM,IAAI7G,OAAOF,GAChC9E,KAAKqN,KAAKrN,KAAK6L,MAAM7L,KAAK6L,MAAMvP,OAAS,IAAI0I,OAAOF,KAKtD4I,WAAa,SAAUnF,GACrB,MAAMzB,EAAI9G,KAGV,GAAI8G,EAAE0B,SAAYD,EAAM,EACtBzB,EAAE0B,OAASD,EAIXzB,EAAE7B,IAAInE,YAAYgG,EAAE7B,IAAIO,SAAS,IAEjCsB,EAAEqH,QACArH,EAAE+E,MAAM/E,EAAE0B,OAAS1B,EAAEiB,QAAU,SAK9B,GAAIjB,EAAE0B,SAAYD,EAAM,EAC3BzB,EAAE0B,OAASD,EAGXzB,EAAE7B,IAAInE,YAAYgG,EAAE7B,IAAImJ,WAExBtH,EAAEuH,SAASvH,EAAE+E,MAAM/E,EAAE0B,aAGlB,CACH1B,EAAE0B,OAASD,EAGXzB,EAAEgF,cAGF,IAAIwC,EAAQ,EAEZ,IAAK,IAAIvS,EAAI,EAAGA,EAAI+K,EAAE+E,MAAMvP,SAG1BgS,IACIA,GAAS/F,IAGbzB,EAAEqH,QAAQrH,EAAE+E,MAAM9P,MAEduS,GAAUxH,EAAEiB,QAAUQ,KATQxM,MAetC+K,EAAEoC,QAAQV,OAAO1B,EAAE0B,SAKrB2F,QAAU,SAAUpS,GAClB,MAAMsR,EAAOrN,KAAKqN,KAAKtR,GAGnBiE,KAAKrC,SAASrB,OAAS,GACzB+Q,EAAKhI,UAAUrF,KAAKrC,SAAS4D,eAI/BvB,KAAK+E,UAAU5C,YAAYkL,EAAKtI,YAKlCsJ,SAAW,SAAUtS,GACnB,MAAMsR,EAAOrN,KAAKqN,KAAKtR,GAGnBiE,KAAKrC,SAASrB,OAAS,GACzB+Q,EAAKhI,UAAUrF,KAAKrC,SAAS4D,eAG/B,MAAM7C,EAAIsB,KAAK+E,UAGfrG,EAAEgI,aACA2G,EAAKtI,UACLrG,EAAE8G,SAAS,SAWnBzL,EAAO,mBAAmB,CAAC,SAAS,SAAUwU,GAE5C,MAAO,CAWLrK,OAAS,SAAU+G,EAAM0C,GACvB,MAAM1S,EAAMP,OAAOwJ,OAAOqK,GACpBlK,UAAUrE,MACVoE,MAAM6G,EAAM,CAAC0C,UAAYA,IAC/B1S,EAAI8M,MAAM,GAEV,MAAMrJ,EAAIzD,EAAI8J,UAYd,OATArG,EAAEoL,iBAAiB,QAAQ,SAAUpL,GACpCsB,KAAKkH,KAAKC,UAGXzI,EAAEmD,UAAUE,IAAI,qBAGhBK,SAASwD,qBAAqB,QAAQ,GAAGzD,YAAYzD,GAE9CzD,GAOTuT,MAAO,SAAUC,GAIf,YAHiBpP,IAAboP,IACFzO,KAAK0O,OAASD,GAETzO,KAAK0O,QAKdC,OAAS,SAAUC,GAEjB5O,KAAK6O,QAAUD,EAEf5O,KAAK8O,OAAO9O,KAAK6O,SACjB7O,KAAK6M,SAASvD,cAMSjK,IAAnBW,KAAK+O,WACPnP,OAAO2K,oBAAoB,SAAUvK,KAAK+O,WAG5C/O,KAAK+O,UAAY,WACf/O,KAAK8O,OAAO9O,KAAK6O,UACjBzJ,KAAKpF,MAEPJ,OAAOkK,iBAAiB,SAAU9J,KAAK+O,YAKzCjB,OAAS,gBAGgBzO,IAAnBW,KAAK+O,WACPnP,OAAO2K,oBAAoB,SAAUvK,KAAK+O,WAE5C/O,KAAK+E,UAAUiK,QAGjBF,OAAS,SAAUpQ,GACjB,MAAMuQ,EAAWvQ,EAAEwQ,wBACnBlP,KAAKiF,IAAIkE,MAAMgG,KAAOF,EAASE,KAAO,KACtCnP,KAAKiF,IAAIkE,MAAMC,IACb6F,EAAS7F,IACP6F,EAASvF,OACT1J,KAAKiF,IAAIiF,aACT,UAOVnQ,EAAO,cAAc,CAAC,mBAAmB,YAAY,SAAS,SAAUqV,EAAevE,GAErF,MAAO,CAIL3G,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAInCjL,MAAQ,SAAUiL,GAChB,MAAM3Q,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UAMb,OALIwN,GACFzN,EAAGG,IAAI3E,MAAMwE,EAAGyN,GAElBzN,EAAGG,IAAI,gBACP/B,KAAKiF,IAAMvG,EACJsB,MAOT+E,QAAU,WACR,OAAO/E,KAAKiF,KAUdZ,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAST+B,IAAM,SAAUuN,EAAOC,EAAMC,GAE3B,MAAMC,EAAIzP,KAAKiF,IAAIhD,KAAK,QACxBwN,EAAE7F,aAAa,QAAQ0F,QAEVjQ,IAATkQ,SACkBlQ,IAAhBkQ,EAAU,KACZE,EAAE5N,UAAUE,IAAI3E,MAAMqS,EAAE5N,UAAW0N,EAAU,UAG1BlQ,IAAjBkQ,EAAW,MACbE,EAAE7F,aAAa,YAAa2F,EAAW,WAGnBlQ,IAAlBkQ,EAAY,QACdE,EAAS,MAAIF,EAAY,QAI7BE,EAAExN,KAAK,QAAQK,KAAKgN,GAEpB,IAAII,EAAO1P,KAYX,OAXAyP,EAAE3F,iBAAiB,SAAS,SAAUpL,GAGpCA,EAAEqB,OAGF,IAAI9E,EAAMyU,EAAKC,OAAS3P,KACxB/E,EAAI0T,OAASc,EACbD,EAAGpS,MAAMnC,EAAKyD,MAGT+Q,GASTG,QAAU,SAAUN,EAAOC,EAAM5B,EAAY9C,GAC3C,MAAMI,EAAOmE,EAAclL,OAAO,GAAIyJ,GAMtC,OALA3N,KAAK+B,IAAIuN,EAAOC,GAAM,SAAU7Q,GAC9BuM,EAAKsC,OACLtC,EAAK0D,OAAO3O,KAAK2O,QACjB1D,EAAKP,WAEAO,GAOT4E,UAAY,SAAUP,EAAOC,EAAMO,GACjC,MAAML,EAAIzP,KAAKiF,IAAIhD,KAAK,QACxBwN,EAAE7F,aAAa,QAAQ0F,GAEXjQ,MAARkQ,QACkBlQ,IAAhBkQ,EAAU,KACZE,EAAE5N,UAAUE,IAAI3E,MACdqS,EAAE5N,UACF0N,EAAU,KAMhB,MAAMQ,EAAQN,EAAExN,KAAK,QACrB8N,EAAMlO,UAAUE,IAAI,QAAS,eAC7BgO,EAAM9N,KAAK,QAIX8N,EAAMC,SAAW,SAAUzS,GACrBA,EACFyC,KAAK6B,UAAUE,IAAI,WAEnB/B,KAAK6B,UAAUG,OAAO,YAG1B8N,EAAMG,UAAUF,GAEhBN,EAAExN,KAAK,QAAQK,KAAKgN,GAYpB,OATAG,EAAE3F,iBAAiB,SAAS,SAAUpL,GAGpCA,EAAEqB,OAGF+P,EAAMI,UAGDT,GAQTrK,KAAO,SAAUnK,GACf,YAAYoE,IAARpE,GACF+E,KAAK2P,MAAQ1U,EACN+E,MAEFA,KAAK2P,OAAS3P,MAOvB0H,MAAQ,WAEN,OADA/G,EAAgBX,KAAKiF,KACdjF,UAUbjG,EAAO,eAAe,CAAC,gBAAgB,SAAUoW,GAE/C,MAAMxN,EAAM9C,MAAM6C,OAIlB,SAAS0N,EAAOtL,GACd,OACEA,MAAAA,IAEW,IAATA,EAKN,SAASuL,EAAMpV,EAAKmI,GAClB,MAAMkN,EAASrV,EAAIqV,SAEnB,GAAqB,aAAjBrV,EAAIsV,SAAyB,CAG/B,GAAItV,EAAIuV,cAAgBpN,EACvB,OAED,OAAwB,OAApBkN,EAAOC,SACHD,EAAOG,SAASxV,GAKhBA,EAAIyV,aAIT,GAAqB,QAAjBzV,EAAIsV,UACa,gBAAjBtV,EAAIsV,SAEX,OAAwB,OAApBD,EAAOC,SACHtV,EAAIyV,WAAWtN,GAGdkN,EAAOE,cAAgBpN,EACxBkN,EAAOG,SAASxV,GAIhBA,EAAI0V,KAAKvN,GA6BrB,OAxEAT,EAAIiO,IAAQjO,EAAIiO,KAAS,IAkDzB/Q,MAAMgR,KAAO,WACX,OAAOR,EAAKrQ,KAAM,QAKpBH,MAAMiR,IAAM,WACV,OAAOT,EAAKrQ,KAAM,OAKpBH,MAAMkR,QAAU,WACd,GAA+B,OAA3B/Q,KAAKsQ,SAASC,SAChB,OAAOvQ,KAAKsQ,SAASU,WAAWhR,MAAMiR,SAGtCjR,KAAKsQ,SAASY,SAKX,CACLhN,OAAS,SAAUiN,EAAKC,EAAIC,GAG1B,IAAIC,EAAK5W,OAAOyV,GAAkBjM,OAAO,CAAC,cAAcG,UAAUrE,MAMlE,OALAsR,EAAGH,IAAIA,GACPG,EAAGF,GAAGA,GACNE,EAAGD,IAAIA,GACPC,EAAGL,SAEIK,GAOTL,OAAS,WACP,MAAMnK,EAAI9G,KAmBV,OAhBA8G,EAAEY,SAEa,IAAXZ,EAAE+J,MACJ/J,EAAE/E,IAAIY,EAAIE,IAAK,CAAC0O,IAAM,CAAC,QAAS1R,MAAMgR,OAI1B,IAAV/J,EAAEgK,KACJhK,EAAE/E,IAAIY,EAAIC,GAAI,CAAC2O,IAAM,CAAC,OAAQ1R,MAAMiR,MAIvB,IAAXhK,EAAE0K,MACJ1K,EAAE/E,IAAIY,EAAIiO,IAAK,CAACW,IAAM,CAAC,WAAY1R,MAAMkR,SAGpCjK,EAAE/B,WAMXuL,OAAS,SAAUrV,GAQjB,OAPyB,IAArBiC,UAAUZ,SACb0D,KAAKyR,QAAUxW,EAGd+E,KAAKoF,KAAKnK,IAGL+E,KAAKyR,SAIdN,IAAM,SAAUrM,GAGd,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAK6Q,KAAOT,EAAMtL,IACZ9E,KAAK6Q,MAIdO,GAAK,SAAUtM,GAGb,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAK8Q,IAAMV,EAAMtL,IACX9E,KAAK8Q,KAIdO,IAAM,SAAUvM,GAGd,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAKwR,KAAOpB,EAAMtL,IACZ9E,KAAKwR,UAUlBzX,EAAO,YAAY,CAAC,iBAAiB,SAAU2X,GAE7C,MAAO,CAELC,WAAY,EAEZzN,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,OAQvBqE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EAChBtE,KAAK9E,GAAQoJ,EAAMpJ,GAEpB,OAAO8E,MAITuQ,OAAS,SAAUnN,GAGjB,OAFyB,IAArBlG,UAAUZ,SACb0D,KAAK4R,QAAUxO,GACTpD,KAAK4R,SAIdtB,OAAS,SAAUrV,GAKjB,OAJyB,IAArBiC,UAAUZ,SACb0D,KAAKyR,QAAUxW,EACf+E,KAAK2R,WAAY,GAEX3R,KAAKyR,SAOdjF,QAAU,WACR,MAAM1F,EAAI9G,KACIX,MAAVyH,EAAE+K,OACL/K,EAAE+K,KAAKJ,aAAUpS,OACEA,IAAfyH,EAAE+K,KAAK5M,MACT6B,EAAE+K,KAAK5M,IAAI6M,WAAQzS,GAErByH,EAAE+K,UAAOxS,QAGIA,IAAVyH,EAAE7B,MACL6B,EAAE7B,SAAM5F,QAGWA,IAAhByH,EAAEiL,YACJjL,EAAEiL,UAAUtL,QAAQ1K,GAAKA,EAAEyQ,WAC5B1F,EAAEiL,UAAY,KAKjBrB,WAAa,SAAUY,GACrB,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAa5C,OAXyB,IAArBpT,UAAUZ,OACb0V,EAAMxB,UAAUc,GAEhBU,EAAMxB,UACiB,QAArBxQ,KAAKwQ,YAAwB,KAAO,OAEvCwB,EAAMC,OAAOjS,MACbA,KAAKsQ,OAAO0B,GACZA,EAAMC,SACND,EAAMjN,UACNuL,EAAO4B,KAAKF,GACLhS,KAAKsQ,UAKd6B,UAAY,SAAUhB,EAAKC,EAAIC,GAC7B,OAAkB,IAAdnU,YAGJ8C,KAAK6R,KAAOH,EAAexN,OAC1BiN,EAAKC,EAAIC,GAGVrR,KAAK6R,KAAKvB,OAAOtQ,OANTA,KAAK6R,MAWfO,OAAS,WACP,MAAO,CAENC,QAAU,SAAWrS,KAAKuQ,WAK7B+B,SAAW,WACT,OAAO,MAITC,WAAa,WACX,OAAO,GAITC,QAAU,WACR,MAAO,QAUbzY,EAAO,aAAa,CAAC,YAAa,SAAS,SAAU0Y,GAGnD,MAAMC,EACA,IAAItS,OAAO,6DAEjB,MAAO,CAGL8D,OAAS,SAAUyO,GACjB,OAAOjY,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,IAKZrP,IAAM,SAAUmE,GAGd,OAFyB,IAArBvK,UAAUZ,SACb0D,KAAK6S,KAAOpL,GACNzH,KAAK6S,MAKdrC,UAAY,SAAUc,GACpB,GAAyB,IAArBpU,UAAUZ,OAAc,CAC3B,IAAIoW,EAAkBlW,KAAK8U,GAKzB,YADAzR,MAAMsD,IAAI,IAAK,6BAHfnD,KAAK8S,IAAMxB,EAOd,OAAOtR,KAAK8S,KAAO,aAKrBC,MAAQ,SAAUC,GAGhB,OAFyB,IAArB9V,UAAUZ,SACb0D,KAAKiT,OAASD,GACRhT,KAAKiT,QAKdL,SAAW,SAAUD,GACnB,QAAatT,IAATsT,EACH,OAAO3S,KAGR,QAAsBX,IAAlBsT,EAAK,SAAT,CAMA,QAAoBtT,IAAhBsT,EAAU,KACY,iBAAhBA,EAAU,IAkBpB,OAZA3S,KAAKsD,IAAIqP,EAAU,UAGOtT,IAAtBsT,EAAgB,WACnB3S,KAAKwQ,UAAUmC,EAAgB,UAAElW,QAAQ,cAAc,UAIlC4C,IAAlBsT,EAAY,OACY,iBAAlBA,EAAY,OACrB3S,KAAK+S,MAAMJ,EAAY,OAEjB3S,KAjBNH,MAAMsD,IAAI,IAAK,+BAPftD,MAAMsD,IAAI,IAAK,yCA4BlB/B,SAAW,WACT,IAAI8R,EAAM,GACV,MAAM5B,EAAKtR,KAAKwQ,YAQhB,OAPA0C,GAAO5B,EAAG5U,OAAO,GAAGyW,cAAgB7B,EAAGxW,MAAM,GAC7CoY,GAAO,QACU,OAAhBlT,KAAKiT,OACH,SACAjT,KAAK+S,QAAQzS,SAEhB4S,GAAO,OAASlT,KAAKsD,MAAMhD,QACpB4S,OAObnZ,EAAO,iBAAiB,CAAC,YAAa,aAAa,SAAS,SAAU0Y,EAAaW,GACjF,MAAO,CAGLlP,OAAS,SAAUyO,GACjB,OAAOjY,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,IAOZC,SAAW,SAAUD,GAQnB,OAPA3S,KAAK6L,MAAQ,IAAIH,MACjBiH,EAAKlM,QACH1K,GACCiE,KAAK6L,MAAM1O,KACTiW,EAAalP,OAAOnI,KAGlBiE,MAIT1D,OAAS,WACP,OAAO0D,KAAK6L,MAAMvP,QAOpByI,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAEb,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAC5C3D,EAAEkL,aAAa,QAAS,WAExB,MAAMyJ,EAAW,GACjB,IAAIC,EAAMC,EA2BV,OA1BAvT,KAAK6L,MAAMpF,SAAQ,SAAU+M,GAG5BF,EAAOlR,SAASC,cAAc,QAG9BiR,EAAK1J,aAAa,QAAS4J,EAAQhD,aAGnC+C,EAAcC,EAAQlQ,WAGEjE,IAApBmU,EAAQT,UACVQ,GAAe,KAAOC,EAAQT,SAIhCO,EAAKhR,KAAKiR,GAETF,EAASlW,KAAKoW,EAAc,KAAOC,EAAQhD,YAAc,KAE1DxQ,KAAKiF,IAAI9C,YAAYmR,KACnBtT,MAEHtB,EAAEkL,aAAa,QAASyJ,EAASxW,KAAK,OAE/B6B,OAUb3E,EAAO,eAAe,CAAC,SAAS,WAE9B,MAAM4I,EAAM9C,MAAM6C,OAIlB,OAHAC,EAAI8Q,MAAa9Q,EAAI8Q,OAAc,QACnC9Q,EAAI+Q,WAAa/Q,EAAI+Q,YAAc,2BAE5B,CAILxP,OAAS,WACP,MAAMyP,EAAIzW,UACV,IAAI0W,GAAU,EACVC,GAAQ,EACRtW,EAAQ,GAqBZ,OAlBIoW,EAAErX,QAAU,QACD+C,IAATsU,EAAE,KACJpW,EAAQoW,EAAE,IAIVA,EAAErX,QAAU,QACD+C,IAATsU,EAAE,KACJE,EAAQF,EAAE,IAIVA,EAAErX,QAAU,IACdsX,EAAUD,EAAE,IACI,IAAZC,IACFC,GAAQ,IAGLnZ,OAAOwJ,OAAOlE,MAAMoE,MAAM7G,EAAOsW,EAAOD,IAKjDxP,MAAQ,SAAU7G,EAAOsW,EAAOD,GAI9B,OAHA5T,KAAKzC,MAAMA,GACXyC,KAAK6T,MAAMA,GACX7T,KAAK8T,SAASF,GACP5T,MAST6T,MAAQ,SAAU/O,GAKhB,OAJyB,IAArB5H,UAAUZ,SACb0D,KAAK+T,SAASjP,EACb9E,KAAKsH,WAEAtH,KAAK+T,QAIdD,SAAW,SAAUF,GAKnB,OAJyB,IAArB1W,UAAUZ,SACZ0D,KAAKgU,YAAYJ,EACjB5T,KAAKsH,WAEAtH,KAAKgU,WAQdC,YAAc,WACZjU,KAAK6T,OAAsB,IAAhB7T,KAAK+T,SAOlBxW,MAAQ,SAAU2W,GAMhB,OALyB,IAArBhX,UAAUZ,SACZ0D,KAAKmU,OAASD,EAEdlU,KAAKsH,WAEAtH,KAAKmU,QAKd7M,QAAU,WACR,QAAiBjI,IAAbW,KAAKiF,IACP,OAEFjF,KAAKmU,OAASnU,KAAKoU,OAAO7W,MAE1B,MAAMqE,EAAK5B,KAAKiF,IAAIpD,UAEhB7B,KAAK8T,YAAc9T,KAAK+T,OAC1BnS,EAAGG,IAAI,SAGPH,EAAGI,OAAO,UAUdqS,MAAQ,SAAUtQ,EAAEuQ,KAMpB5J,MAAQ,WACN1K,KAAKiF,IAAIO,SAAS,GAAGkF,SAOvB3F,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAC5C3D,EAAEkL,aAAa,WAAY,GAC3BlL,EAAEyK,MAAMiC,QAAU,EAElB,MAAMxJ,EAAKlD,EAAEmD,UAab,GAZAD,EAAGG,IAAI,UACc,IAAjB/B,KAAK6T,SACPjS,EAAGG,IAAI,SAGT/B,KAAKoU,OAAS1V,EAAEuD,KAAK,cAEA5C,IAAjBW,KAAKzC,UACPyC,KAAKoU,OAAO7W,MAAQyC,KAAKzC,SAIvByC,KAAK8T,WAAY,CACnB,MAAMS,EAAK7V,EAAEuD,KAAK,OAClBsS,EAAGzK,iBACD,QACA,WACC9J,KAAKiU,eAEJ7O,KAAKpF,OACP,GAEFuU,EAAG3K,aAAa,QAAS,6BACzB2K,EAAGjS,KAAK,SAqDV,OAhDAtC,KAAKoU,OAAOtK,iBACV,OACA,SAAUa,GACR,MAAM7D,EAAI9G,KACL8G,EAAE0N,WACN1N,EAAEvJ,MAAMuJ,EAAEsN,OAAO7W,OAChBuJ,EAAEuN,MAAMvN,EAAEvJ,QAASuJ,EAAE+M,UAEvBlJ,EAAG5K,QACHqF,KAAKpF,OAITtB,EAAEoL,iBACA,YACA,WACE9J,KAAKwU,UAAW,GAChBpP,KAAKpF,OAGTtB,EAAEoL,iBACA,UACA,WACE9J,KAAKwU,UAAW,EAChBxU,KAAKoU,OAAO1J,SACZtF,KAAKpF,OAGTA,KAAKoU,OAAOtK,iBACV,WACA,SAAUa,GACR,MAAM7D,EAAI9G,KACX,GAAkB,IAAd2K,EAAG3J,QAGJ,OAFD8F,EAAEvJ,MAAMuJ,EAAEsN,OAAO7W,OACjBuJ,EAAEuN,MAAMvN,EAAEvJ,QAASuJ,EAAE+M,UACb,GAETzO,KAAKpF,OAWFtB,OAWb3E,EAAO,iBAAiB,CACtB,YACA,iBACA,eACA,SACC,SAAU0Y,EAAagC,EAAkBC,GAK1C,MAAM/R,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,cAMV1N,OAAS,SAAUoM,EAAQqC,GACzB,MAAM1X,EAAMP,OAAO+X,GACbvO,SACDG,UAAUrE,MACT4S,SAASD,GASf,YAPYtT,IAARpE,GACFsI,QAAQJ,IAAIwP,QAECtT,IAAXiR,IACHrV,EAAIwW,QAAUnB,GAEfrV,EAAI0W,WAAY,EACT1W,GAOTgW,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACJ,OAAO6B,EAAE/B,UAEX,MAAMrG,EAAIoI,EAAE7B,IAGZ,IAAK6B,EAAE6K,UACL,OAAOjT,EAGTA,EAAEoT,MAAQhL,OAGWzH,IAAjByH,EAAEwL,YACJ5T,EAAEmD,UAAUE,IAAI,aAGlB,MAAM6S,EAAWxS,SAASC,cAAc,QACxCuS,EAAS/S,UAAUE,IAAI,MAAM,QAAS,OACtC6S,EAAStS,KAAK,WAGd,MAAMuS,EAAO/N,EAAEgO,MAAQ1S,SAASC,cAAc,QAgD9C,OA/CAwS,EAAKjL,aAAa,YAAa,UAC/BiL,EAAKjL,aAAa,QAAS,SAEvB5J,KAAK+U,MACPF,EAAKvS,KAAKwE,EAAEiO,QAGZF,EAAKvS,KAAKK,EAAIgS,OACdE,EAAKhT,UAAUE,IAAI,gBAIrB8S,EAAK/K,iBACH,QACAhD,EAAEkO,WAAW5P,KAAK0B,IAIpBnG,EAAgBjC,GAGhBA,EAAEyD,YAAYyS,GACdlW,EAAEyD,YAAY0S,GAEd/N,EAAE6K,WAAY,OAEMtS,IAAhByH,EAAEmO,WACJvW,EAAEyD,YAAY2E,EAAEmO,UAAUlQ,gBAGV1F,IAAdyH,EAAE2K,SAIJ/S,EAAEyD,YAAY2E,EAAEqL,WACd,GACA,GACA,GACApN,gBAGa1F,IAAbQ,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAAEC,OAAWvO,KAItCA,EAAE/B,WAOXA,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAEb,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAG5C,OAFA3D,EAAEkL,aAAa,QAAS,gBACxB5J,KAAKiR,SACEvS,GAOTqW,IAAM,SAAUA,GACd,OAAyB,IAArB7X,UAAUZ,QACZ0D,KAAKsV,KAAOP,EACZ/U,KAAKuV,WACEvV,MAEFA,KAAKsV,MAKdN,WAAa,SAAUtW,GACrB,MAAMgR,EAAO1P,KACPkT,EAAMwB,EAAexQ,OAAOlE,KAAK+U,OAAO,GAAO,GAC/CS,EAAUtC,EAAInO,UAEpBmO,EAAImB,MAAQ,SAAUU,EAAKlB,GACzBnE,EAAKqF,IAAIA,GAETrF,EAAKzK,IAAInE,YACPd,KAAKiF,KAEPyK,EAAKuB,UAIPjR,KAAKiF,IAAIyB,aACP8O,EACAxV,KAAK8U,OAGP5B,EAAIxI,SAQNiG,KAAO,SAAUW,GACf,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAI5C,OAHA0B,EAAMxB,UAAUc,GAChBU,EAAMC,OAAOjS,MACbgS,EAAMC,SACC3B,EAAOmF,eAAezV,KAAMgS,GAAOf,UAO5C2B,SAAW,SAAUD,GACnB,QAAatT,IAATsT,EACF,OAAO3S,KAET,QAAsBX,IAAlBsT,EAAK,SAAT,CAKA,QAAoBtT,IAAhBsT,EAAU,KACY,iBAAfA,EAAU,IAYrB,OAPA3S,KAAK+U,IAAIpC,EAAU,UAGMtT,IAArBsT,EAAe,UACjB3S,KAAKwT,QAAQb,EAAe,UAGvB3S,KAXLH,MAAMsD,IAAI,IAAK,6BANftD,MAAMsD,IAAI,IAAK,yCAwBnBgC,QAAU,WACR5B,QAAQJ,IAAI,iCAKdmP,SAAW,WACT,OAAOtS,KAAKiV,WAKdzB,QAAU,SAAUjW,GACG,iBAAVA,IACTA,EAAQ,CAAC,CACP8U,QAAU,gBACV7B,UAAc,aAAejT,EAC7B+F,IAAQ,aAGZtD,KAAKiV,UAAYR,EAAiBvQ,OAAO3G,IAQ3CgY,SAAW,WACTvV,KAAK2R,WAAY,OAEMtS,IAAnBW,KAAKiV,mBAGFjV,KAAgB,eAENX,IAAbW,KAAKiF,KAGTjF,KAAKiF,IAAIpD,UAAUG,OAAO,eAI5BoQ,OAAS,WACP,OAAKpS,KAAK+U,IAGH,CACL1C,QAAU,SAAWrS,KAAKuQ,SAC1BwE,IAAU/U,KAAK+U,OAJR,IASXxC,WAAa,WACX,OAAOvS,KAAK+U,OAIdvC,QAAU,WACR,OAAIxS,KAAKuS,aACA,GAGF,WAAavS,KAAK+U,MAAMzU,aAUrCvG,EAAO,SAAS,CACd,YACA,iBACA,eACA,iBACA,SACC,SAAU0Y,EAAagC,EAAkBC,EAAgBgB,GAQ1D,MAAMC,EAAY,4CAEZhT,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,MAGVgE,KAAO,WAAc,MAAO,OAO5B1R,OAAS,SAAUoM,EAAQqC,GAGzB,MAAM1X,EAAMP,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,GAEf,QAAYtT,IAARpE,EAUJ,YAJeoE,IAAXiR,IACFrV,EAAIwW,QAAUnB,GAEhBrV,EAAI0W,WAAY,EACT1W,EATLsI,QAAQJ,IAAIwP,IAgBhB1B,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACJ,OAAO6B,EAAE/B,UAGX,MAAMrG,EAAIoI,EAAE7B,IAGZ,IAAK6B,EAAE6K,UACL,OAAOjT,EAGTA,EAAEoT,MAAQhL,OAIWzH,IAAjByH,EAAEwL,YACJ5T,EAAEmD,UAAUE,IAAI,aAIlB,MAAM8T,EAAO/O,EAAEgP,MAAQ1T,SAASC,cAAc,QAM9C,GALAwT,EAAKjM,aAAa,QAAS,OAG3BiM,EAAK/L,iBAAiB,QAAShD,EAAEiP,WAAW3Q,KAAK0B,IAE7CA,EAAEkP,MAAO,CACX,MAAMC,EAAInP,EAAEkP,WACW3W,IAAnBsD,EAAI,MAAQsT,KACdA,EAAItT,EAAI,MAAQsT,IAClBJ,EAAKvT,KAAK2T,GAIZ,MAAMC,EAAWpP,EAAEqP,UAAY/T,SAASC,cAAc,QACtD6T,EAAStM,aAAa,YAAa9C,EAAE1D,QACrC8S,EAAStM,aAAa,QAAS,SAC/BsM,EAAS5T,KAAKwE,EAAEsP,WAGhBtP,EAAEqP,UAAUrM,iBACV,QACAhD,EAAEuP,eAAejR,KAAK0B,IAIxB,MAAMwP,EAASxP,EAAEyP,QAAUnU,SAASC,cAAc,QAiDlD,OAhDAiU,EAAO1M,aAAa,YAAa9C,EAAE1D,QACnCkT,EAAO1M,aAAa,QAAS,SAEzB9C,EAAEvJ,QACJ+Y,EAAOhU,KAAKwE,EAAEvJ,UAGd+Y,EAAOhU,KAAKK,EAAIgS,OAChB2B,EAAOzU,UAAUE,IAAI,gBAIvBuU,EAAOxM,iBACL,QACAhD,EAAE0P,aAAapR,KAAK0B,IAItBnG,EAAgBjC,GAGhBA,EAAEyD,YAAY0T,GACdnX,EAAEyD,YAAY+T,GACdxX,EAAEyD,YAAYmU,GAEdxP,EAAE6K,WAAY,OAEMtS,IAAhByH,EAAEmO,WACJvW,EAAEyD,YAAY2E,EAAEmO,UAAUlQ,gBAGV1F,IAAdyH,EAAE2K,SAIJ/S,EAAEyD,YAAY2E,EAAEqL,WACd,GACA,GACA,GACApN,WAGAlF,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAACC,OAAWvO,KAIrCpI,GAOTqG,QAAU,WACR,MAAM+B,EAAI9G,KACV,YAAcX,IAAVyH,EAAE7B,MAGN6B,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAI2E,aAAa,QAAS,OAC5B9C,EAAEmK,UAJOnK,EAAE7B,KAYb0L,KAAO,SAAUW,GACf,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAI5C,OAHA0B,EAAMxB,UAAUc,GAChBU,EAAMC,OAAOjS,MACbgS,EAAMC,SACC3B,EAAOmF,eAAezV,KAAMgS,GAAOf,UAI5CwF,YAAc,SAAUnF,GACtB,MAAM9S,EAAIwB,KAAKsQ,SAEI,aAAf9R,EAAE+R,SACJ/R,EAAEiX,eAAezV,KAAMsR,GAEF,MAAd9S,EAAE+R,UACT/R,EAAE0T,KAAKZ,GAGT9S,EAAEyS,SAEFjR,KAAKwM,WAOPoG,SAAW,SAAUD,GACnB,MAAM7L,EAAI9G,KACV,QAAaX,IAATsT,EACF,OAAO7L,EAET,QAAsBzH,IAAlBsT,EAAK,SAEP,YADA9S,MAAMsD,IAAI,IAAK,wCAIjB,QAAsB9D,IAAlBsT,EAAY,OACY,iBAAjBA,EAAY,MAErB,YADA9S,MAAMsD,IAAI,IAAK,oBAIjB,IAAIqQ,EAGJ,QAAoBnU,IAAhBsT,EAAU,KACa,iBAAhBA,EAAU,IAAgB,CAMnC,GAHA7L,EAAEkP,IAAIrD,EAAU,UAGMtT,IAAlBsT,EAAY,MAAiB,CAC/B,GAA6B,iBAAlBA,EAAY,MAKrB,YADA9S,MAAMsD,IAAI,IAAKwS,GAHf7O,EAAEsP,QAAQzD,EAAY,OAS1B,QAAqBtT,IAAjBsT,EAAW,MAAmB9S,MAAM6W,WAAY,CAGlD,MAAMtT,EAAOvD,MAAM6W,WAAWC,OAAO7P,EAAEkP,OAC3B3W,MAAR+D,IACFuP,EAAW,KAAI,QAAUvP,GAK7B,QAAqB/D,IAAjBsT,EAAW,KAGR9S,MAAM+W,oBAAoBpa,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAoB,eAAhBA,EAAW,KAClB7L,EAAE1D,KAAK,UAGFvD,MAAMgX,oBAAoBra,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAoB,aAAhBA,EAAW,KAClB7L,EAAE1D,KAAK,QAGFvD,MAAMiX,kBAAkBta,KAAKsK,EAAEsP,aAClCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAqB,cAAjBA,EAAW,KAAmB,CAGrC,GAFA7L,EAAE1D,KAAK,aAEe/D,IAAlBsT,EAAY,QACZ9S,MAAMkX,aAAava,KAAKmW,EAAY,OAetC,YADA9S,MAAMsD,IAAI,IAAK,oCAZVtD,MAAMmX,kBAAkBxa,KAAKsK,EAAEsP,aAClCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,WASnB,CAAA,GAAqB,eAAjBA,EAAW,KA4BlB,MADA9S,MAAMsD,IAAI,IAAK8T,uBAAmBnQ,EAAE1D,QAC9B,IAAI3F,MAAMwZ,uBAAmBnQ,EAAE1D,QA3BrC0D,EAAE1D,KAAK,SAEP,IAGc,IAAIhD,OAAOuS,EAAY,OAE9B9S,MAAMgX,oBAAoBra,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAGZ1M,EAAEvJ,MAAMoV,EAAY,OAGtB,MAAOjU,GAEL,YADAmB,MAAMsD,IAAI,IAAK,2CAGjB2D,EAAE1D,KAAK,UAmBX,YATyB/D,IAArBsT,EAAe,SACjB7L,EAAE0M,QAAQb,EAAe,eAINtT,IAAZmU,GACP1M,EAAE0M,QAAQA,GAGL1M,GAOTkP,IAAM,SAAUzY,GACd,OAAyB,IAArBL,UAAUZ,QACZ0D,KAAKkX,KAAO3Z,EACZyC,KAAKuV,WACEvV,MAEFA,KAAKkX,MAKdnB,WAAa,SAAUrX,GACrB,MAAMwI,EAAOrH,MAAM6W,WAGnB1W,KAAKiF,IAAIyB,aACPQ,EAAKnC,UACL/E,KAAK8V,OAIP,MAAMpG,EAAO1P,KACbkH,EAAKiQ,UAAS,SAAUnB,EAAK5S,GAE3B,GAAa,QAATA,EAEFsM,EAAK+G,YACHf,EAAiBxR,OAAOwL,EAAKY,eAI5B,CACH,MAAM8G,EAAM1H,EAAKsG,IAAIA,GAAK5S,KAAKA,GAG/BgU,EAAIhB,QAAQgB,EAAIhB,WAChBgB,EAAI7Z,MAAM6Z,EAAI7Z,SAGd6Z,EAAInG,SAINjR,KAAKmH,UAIPD,EAAKqG,OACLrG,EAAKwD,SAOP0L,QAAU,SAAUiB,GAClB,MAAMvQ,EAAI9G,KAEV,GAAyB,IAArB9C,UAAUZ,OAAc,CAC1B,MAAM2K,EAAIoQ,EAAM5a,QAAQ,UAAW,IAqBnC,OAlBc4C,MAAXyH,EAAEwQ,QAGc,WAAZxQ,EAAEwQ,OAAkC,UAAZxQ,EAAEwQ,QACzBzX,MAAMgX,oBAAoBra,KAAKyK,IAGtB,SAAZH,EAAEwQ,OAAoBzX,MAAMiX,kBAAkBta,KAAKyK,IAEvC,SAAZH,EAAEwQ,OAAoBzX,MAAMmX,kBAAkBxa,KAAKyK,GAEtDH,EAAEyQ,SAAWtQ,EAGbH,EAAEyQ,SAAW,KAGfzQ,EAAEyO,WACKzO,EAGT,OAAOA,EAAEyQ,UAAY,MAKvBlB,eAAiB,SAAU3X,GACzB,MAAMwI,EAAOrH,MAAM2X,eAAexX,KAAKoD,QAEvC,QAAa/D,IAAT6H,EAEF,YADArH,MAAMsD,IAAI,EAAG,2BAA6BnD,KAAKoD,QAKjDpD,KAAKiF,IAAIyB,aACPQ,EAAKnC,UACL/E,KAAKmW,WAIP,MAAMzG,EAAO1P,KACbkH,EAAKiQ,UAAS,SAAUM,GACtB/H,EAAK0G,QAAQqB,GAAIxG,SACjBjR,KAAKmH,UAGPD,EAAKqG,OACLrG,EAAKwD,SAOPtH,KAAO,SAAUA,GACf,OAAyB,IAArBlG,UAAUZ,QACZ0D,KAAKsX,MAAQlU,EACbpD,KAAKuV,WACEvV,MAEFA,KAAKsX,OAAS,UAOvB/Z,MAAQ,SAAUA,GAChB,MAAMuJ,EAAI9G,KACV,OAAyB,IAArB9C,UAAUZ,QACI,SAAZwK,EAAEwQ,OAAqBzX,MAAMkX,aAAava,KAAKe,GAIjDuJ,EAAEqN,OAAS5W,SAHJuJ,EAAEqN,OAKXrN,EAAEyO,WACKzO,GAEFA,EAAEqN,QAKXqC,aAAe,SAAU9X,GACvB,MAAMgR,EAAO1P,KAGb,GAAoB,SAAhBA,KAAKoD,OAAmB,CAC1B,MAAMsU,EAAK7X,MAAM8X,cACjBD,EAAGE,WAAW5X,KAAKzC,SAGnBma,EAAGvS,SAAQ,SAAU0S,GAGnB,GAAIA,EAAe,KAGjB,OAFAnI,EAAKnS,MAAMyC,KAAKoB,iBAChBsO,EAAKuB,SAKPvB,EAAKzK,IAAInE,YACP4W,EAAG3S,cAIP/E,KAAKiF,IAAIyB,aACPgR,EAAGnK,OACHvN,KAAKuW,SAGPmB,EAAGI,QAAQpN,YAGR,CACH,MAAMmJ,EAAwB,UAAhB7T,KAAKoD,OACb8P,EAAMwB,EAAexQ,OAAOlE,KAAKzC,QAASsW,GAC1C2B,EAAUtC,EAAInO,UAEpBmO,EAAImB,MAAQ,SAAU9W,EAAOsW,GAC3BnE,EAAKnS,MAAMA,IACG,IAAVsW,EACFnE,EAAKtM,KAAK,SAEVsM,EAAKtM,KAAK,UAEZsM,EAAKzK,IAAInE,YACPd,KAAKiF,KAEPyK,EAAKuB,UAIPjR,KAAKiF,IAAIyB,aACP8O,EACAxV,KAAKuW,SAGPrD,EAAIxI,UAKR4H,SAAW,WACT,OAAOtS,KAAKiV,WAIdzB,QAAU,SAAUjW,GACG,iBAAVA,IACTA,EAAQ,CAAC,CACP8U,QAAU,gBACV7B,UAAc,aAAejT,EAC7B+F,IAAQ,aAGZtD,KAAKiV,UAAYR,EAAiBvQ,OAAO3G,IAQ3CgY,SAAW,WACTvV,KAAK2R,WAAY,OAEMtS,IAAnBW,KAAKiV,mBAGFjV,KAAgB,eAENX,IAAbW,KAAKiF,KAGTjF,KAAKiF,IAAIpD,UAAUG,OAAO,eAI5BoQ,OAAS,WACP,MAAMtL,EAAI9G,KAEV,OAAK8G,EAAEsP,WAActP,EAAEkP,MAGhB,CACL3D,QAAU,SAAWvL,EAAEyJ,SACvByF,IAAUlP,EAAEkP,MACZqB,MAAU,SAAWvQ,EAAEsP,UACvB7Y,MAAUuJ,EAAEvJ,SAAW,GACvB6F,KAAU,QAAU0D,EAAE1D,QAPf,IAYXmP,WAAa,WACX,QAASvS,KAAKoW,WAAapW,KAAKgW,OAAShW,KAAKzC,UAIhDiV,QAAU,WACR,GAAIxS,KAAKuS,aACP,MAAO,GAGT,IAAI9K,EAASzH,KAAKgW,MAAQ,IAG1B,OAAQhW,KAAKoW,WACb,IAAK,KACH3O,GAAU,KACV,MACF,IAAK,WACHA,GAAU,IACV,MACF,IAAK,WAGL,IAAK,cACHA,GAAU,KACV,MACF,IAAK,MACHA,GAAU,QACV,MACF,IAAK,MACHA,GAAU,QACV,MACF,QACEA,GAA0B,QAAfzH,KAAKoD,OAAoB,KAAO,IAO7C,OAHAqE,GAAU,IAGFzH,KAAKoD,QACb,IAAK,OACH,OAAOqE,EAASzH,KAAKzC,QACvB,IAAK,QACH,OAAOkK,EAAS,IAAMzH,KAAKzC,QAAQiD,cAAgB,IACrD,IAAK,SACL,IAAK,OACH,OAAOiH,EAASzH,KAAKzC,QAAQ+C,QAG/B,MAAO,QAWbvG,EAAO,iBAAiB,CACtB,YACA,SACA,iBACA,SACC,SAAU0Y,EAAasF,EAAUrC,GAGlC,MAAM/S,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,MAMV1N,OAAS,SAAUoM,GACjB,MAAMrV,EAAMP,OAAOwJ,OAAOuO,GACvBpO,UAAUrE,MAKb,YAHeX,IAAXiR,IACHrV,EAAIwW,QAAUnB,GAERrV,GAOT+a,IAAM,SAAUjS,GAGd,QAAqB1E,IAAjBW,KAAKyR,QACR,OAAO,KAER,IAAIuG,EACJ,MAAMC,EAAUpY,MAAM6W,WAAWC,OAAO5S,GAuBxC,OApBIkU,GAAuB,QAAZA,EACbD,EAAStC,EAAiBxR,OAAOlE,KAAKyR,UAGtCuG,EAASD,EAAS7T,OAAOlE,KAAKyR,SAC9BuG,EAAOhC,IAAIjS,GACXiU,EAAO5U,KAAK6U,IAIgB,OAA1BjY,KAAKyR,QAAQlB,UAChBvQ,KAAKyR,QAAQS,KAAK8F,GAClBhY,KAAKwM,WAKLxM,KAAKyR,QAAQgE,eAAezV,KAAMgY,GAEnChY,KAAKyR,QAAQR,SACN+G,GAOT/G,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE/B,UAGVpE,EAAgBmG,EAAE7B,KAElB,MAAMiT,EAAW9V,SAASC,cAAc,QAwBxC,OAvBA6V,EAAS5V,KAAKK,EAAIgS,OAGlBuD,EAASpO,iBAAiB,QAAShD,EAAE3B,QAAQC,KAAK0B,IAElDA,EAAE7B,IAAI9C,YAAY+V,GAGlBpR,EAAE7B,IAAI6M,MAAQhL,OAGIzH,IAAdyH,EAAE2K,SACsB,OAAxB3K,EAAEwJ,SAASC,UAEdzJ,EAAE7B,IAAI9C,YACJ2E,EAAEqL,WACA,GACA,GACA,GACApN,WAIE+B,EAAE/B,WAOXA,QAAU,WACR,MAAM+B,EAAI9G,KACV,YAAcX,IAAVyH,EAAE7B,MAEN6B,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAI2E,aAAa,QAAS,mBAC5B9C,EAAEmK,UAHMnK,EAAE7B,KAQZsN,WAAa,WACX,OAAO,GAOTpN,QAAU,WAGR,MAAM+B,EAAOrH,MAAM6W,WAGnB1W,KAAKiF,IAAIyB,aACRQ,EAAKnC,UACL/E,KAAKiF,IAAIpE,YAGV,MAAM6O,EAAO1P,KAGbkH,EAAKiQ,UAAS,SAAUnB,GAEvBtG,EAAKsG,IAAIA,GAAK/E,SACdjR,KAAKmH,UAGND,EAAKqG,OACLrG,EAAKwD,aAaX3Q,EAAO,cAAc,CACnB,YACA,iBACA,SACA,iBACA,SACC,SAAU0Y,EACD0F,EACAJ,EACCrC,GAEX,MAAM0C,EAAkB,IAAIhY,OAAO,gBAE7BiY,EAAgB,CAEpBzG,QAAU,WAEV1N,OAAS,SAAUoM,EAAQqC,GACzB,MAAM1X,EAAMP,OAAOwJ,OAAOuO,GAAapO,UAAUrE,MAKjD,OAJA/E,EAAI8W,UAAY,GAChB9W,EAAI2X,SAASD,QACEtT,IAAXiR,IACHrV,EAAIwW,QAAUnB,GACRrV,GAITwV,SAAW,SAAUxV,GACnB+E,KAAK+R,UAAUtL,SAAQ,SAAU6K,EAAIvV,GACpC,GAAIuV,IAAOrW,EAAK,CACd,MAAMqd,EAAUH,EAAYjU,OAAOlE,MAEnC,OADAA,KAAK+R,UAAUnV,OAAOb,EAAI,EAAG,EAAGuc,GACzBtY,KAAKiR,YAEZjR,OAKLuY,WAAa,SAAUD,GAIrB,GAAyB,QAArBA,EAAQ/H,SACX,OAAO,KAER,MAAMlS,EAAI2B,KAAK+R,UAAUyG,KACvBlH,GACiB,QAAhBA,EAAGf,UACA+H,EAAQtC,QAAU1E,EAAG0E,OACrBsC,EAAQlC,YAAc9E,EAAG8E,WACzBkC,EAAQ/a,UAAY+T,EAAG/T,SAG7B,OAAIc,GAGG,MAIT4T,OAAS,SAAUqG,GAGjB,QAAgBjZ,IAAZiZ,EAKH,OAFAA,EAAUH,EAAYjU,OAAOlE,MAC7BA,KAAK+R,UAAU5U,KAAKmb,GACbA,EAGR,OAAQA,EAAQ,UAEhB,UAAKjZ,EAEJ,QAA0BA,IAAtBiZ,EAAgB,OAAiB,CACnC,GAAyB,QAArBA,EAAQ/H,UACa,aAArB+H,EAAQ/H,UACc,gBAArB+H,EAAQ/H,SAEX,YADA1Q,MAAMsD,IAAI,IAAK,2CAKjBmV,EAAQhI,OAAOtQ,MAEf,MAAMyY,EAAOzY,KAAKuY,WAAWD,GAC7B,OAAa,OAATG,GACFzY,KAAK+R,UAAU5U,KAAKmb,GACbA,GAEFG,EAIT,YADA5Y,MAAMsD,IAAI,IAAK,wCAGhB,IAAK,YAEJ,MAAMiU,EAAMW,EAAS7T,OAAOlE,KAAMsY,GAClC,QAAYjZ,IAAR+X,EACF,OAEF,MAAMqB,EAAOzY,KAAKuY,WAAWnB,GAC7B,OAAa,OAATqB,GACFzY,KAAK+R,UAAU5U,KAAKia,GACbA,GAEFqB,EAER,IAAK,iBAGJ,MAAMC,EAAWL,EAAcnU,OAAOlE,KAAMsY,GAC5C,QAAiBjZ,IAAbqZ,EACF,OAGF,OAAIA,EAASlI,cAAgBxQ,KAAKwQ,aAC/BkI,EAASC,WAAWlS,SAAQ,SAAS6K,GAEvB,OADAtR,KAAKuY,WAAWjH,KAE3BtR,KAAK+R,UAAU5U,KAAKmU,GACpBA,EAAGhB,OAAOtQ,SAEXA,MACH0Y,EAAS3G,UAAY,GACrB2G,EAASlM,UACFxM,OAETA,KAAK+R,UAAU5U,KAAKub,GACbA,GAER,IAAK,oBAEH,MAAME,EAAclD,EAAiBxR,OAAOlE,KAAMsY,GAElD,QAAoBjZ,IAAhBuZ,EACF,OAcF,OADD5Y,KAAK+R,UAAU5U,KAAKyb,GACZA,EAET,QAEC,YADA/Y,MAAMsD,IAAI,IAAK,6CAMlB8N,OAAS,WACP,MAAMnK,EAAI9G,KAIV,GAA2B,IAAvB8G,EAAEiL,UAAUzV,OAAc,CAE7B,MAAMgU,EAASxJ,EAAEwJ,SACXgB,EAAKxK,EAAE+R,WAAW,GAOxB,OAHA/R,EAAEiL,UAAY,GAGU,OAApBzB,EAAOC,SACFD,EAAOmF,eAAe3O,EAAGwK,GAAIL,UAIpCnK,EAAE0F,UAEF8D,EAAO4B,KAAKZ,GACZA,EAAGhB,OAAOA,GACHA,EAAO4B,QAIjB,QAAc7S,IAAVyH,EAAE7B,IACL,OAAO6B,EAER,MAAMkL,EAAQlL,EAAE7B,IAChB+M,EAAMpI,aAAa,iBAAkB9C,EAAE0J,aAEvC7P,EAAgBqR,GAGhBlL,EAAEiL,UAAUtL,QACV6K,GAAMU,EAAM7P,YAAYmP,EAAGvM,YAI7B,IAAIuM,EAAKxK,EAAEqL,UACO,OAAjBrL,EAAE0J,YACe,MAAjB1J,EAAE0J,aACF,GAWD,OARAwB,EAAM7P,YAAYmP,EAAGvM,WAEjBlF,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAACC,OAAWvO,KAIrCA,GAIT/B,QAAU,WACR,MAAM+B,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE7B,IAEV,MAAMvG,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,OAMzC,OALA3D,EAAEkL,aAAa,QAAS,YAGxB9C,EAAEmK,SAEKvS,GAIT8R,UAAY,SAAUc,GACpB,GAAyB,IAArBpU,UAAUZ,OAAc,CAC3B,IAAI8b,EAAgB5b,KAAK8U,GAKvB,YADAzR,MAAMsD,IAAI,IAAK,0BAHfnD,KAAK8S,IAAMxB,EAOd,OAAOtR,KAAK8S,KAAO,OAIrB6F,SAAW,WACT,OAAO3Y,KAAK+R,WAId8G,WAAa,SAAUjb,GACrB,OAAOoC,KAAK+R,UAAUnU,IAKxB6X,eAAiB,SAAUqD,EAAOC,GAEhC,IAAK,IAAIhd,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAE1C,GAAIiE,KAAK+R,UAAUhW,KAAO+c,EAkCxB,MA/BuB,QAAnBC,EAAMxI,UACa,QAAnBwI,EAAMxI,UACc,gBAAnBwI,EAAMxI,UAGPwI,EAAMvI,aAAexQ,KAAKwQ,aAC5BxQ,KAAK+R,UAAUhW,GAAKgd,EACpBA,EAAMzI,OAAOtQ,QAObA,KAAK+R,UAAUnV,OAAOb,EAAG,GAGxBgd,EAAMJ,WAAWK,UAAUvS,SACzB,SAAS6K,GACRtR,KAAK+R,UAAUnV,OAAOb,EAAG,EAAGuV,GAC5BA,EAAGhB,OAAOtQ,QAEXA,MAIH+Y,EAAMhH,UAAY,GAClBgH,EAAMvM,WAGRsM,EAAMtM,UACCxM,KAGV,OAAO,GAKTgR,WAAa,SAAU/V,GAErB,IAAK,IAAIc,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAC1C,GAAIiE,KAAK+R,UAAUhW,KAAOd,EAQxB,OALA+E,KAAK+R,UAAUnV,OAAOb,EAAE,GAGxBd,EAAIuR,UAEGxM,MAUZ4S,SAAW,SAAUD,GAEnB,QAAatT,IAATsT,EACH,OAAO3S,KAER,QAAsBX,IAAlBsT,EAAK,SAER,YADA9S,MAAMsD,IAAI,IAAK,wCAIhB,QAA0B9D,IAAtBsT,EAAgB,WACY,iBAAtBA,EAAgB,UAEzB,YADA9S,MAAMsD,IAAI,IAAK,oCAIhB,MAAMqN,EAAYmC,EAAgB,UAIlC,GAFA3S,KAAKwQ,UAAUA,EAAU/T,QAAQ,cAAc,UAEtB4C,IAArBsT,EAAe,UACdA,EAAe,oBAAajH,MAQjC,OAFAiH,EAAe,SAAElM,QAAQ1K,GAAKiE,KAAKiS,OAAOlW,IAEnCiE,KAPNH,MAAMsD,IAAI,IAAK,iCAWlBiP,OAAS,WACP,MAAM6G,EAAU,IAAIvN,MAMpB,OALA1L,KAAK+R,UAAUtL,SAAQ,SAAS6K,GACX,QAAhBA,EAAGf,UACL0I,EAAQ9b,KAAKmU,EAAGc,aAGZ,CACNC,QAAc,SAAWrS,KAAKuQ,SAC9BC,UAAc,aAAexQ,KAAKwQ,YAClCmI,SAAcM,IAKjBzG,QAAU,SAAU0G,GAClB,IAAIjO,EAAOjL,KAAK+R,UACZoH,QAAO,SAAU7H,GACf,OAAQA,EAAGiB,gBAEbnW,KAAI,SAAUkV,GACb,MAAwB,aAAhBA,EAAGf,SACTe,EAAGkB,SAAQ,GACXlB,EAAGkB,aAGV,GAAoB,IAAhBvH,EAAK3O,OACR,OAAO2O,EAAKpO,KAAK,IACb,CACJ,MAAMqW,EAAMjI,EAAKpO,KAA0B,OAArBmD,KAAKwQ,YAAuB,MAAQ,OAC1D,OAAO0I,EAAW,IAAMhG,EAAM,IAAMA,KAKzC,OAAOmF,KAMTte,EAAO,UAAU,CAAC,YAAa,SAAS,SAAU4T,GAEhD,MAAMhL,EAAM9C,MAAM6C,OAElB,MAAO,CASLwB,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MACVoE,MAAMD,IAKVC,MAAQ,SAAUD,GAChB,MAAM2C,EAAI9G,KAEV,QAAkBX,IAAd8E,EAAO,GACV,MAAM,IAAI1G,MAAM,sBAEjBqJ,EAAEoQ,KAAO/S,EAAO,GAChB2C,EAAEwQ,MAASnT,EAAO,GAElB,MAAM8R,EAAInP,EAAEoQ,KAKZ,OAJApQ,EAAEsS,MAASzW,EAAI,MAAQsT,GAAKtT,EAAI,MAAQsT,GAAKA,EAE7CnP,EAAElC,SAAW,IAAMkC,EAAEsS,MAAM7X,cAEpBuF,GAQT3B,QAAU,SAAUzG,GAClBsB,KAAKkH,OAAOmS,QACXrZ,KAAKkX,KACLlX,KAAKsX,OAEN5Y,EAAEqB,QASJ1E,KAAO,WACL,OAAO2E,KAAKoZ,OAOdhW,KAAO,WACL,OAAOpD,KAAKsX,OAOdtB,IAAM,WACJ,OAAOhW,KAAKkX,MAOdnS,QAAU,WACR,MAAM+B,EAAI9G,KAGV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE7B,IAGV,IAAIC,EAAK9C,SAASC,cAAc,MAUhC,OATIyE,EAAEwQ,OACJpS,EAAG0E,aAAa,YAAa9C,EAAEwQ,OAEjCpS,EAAG0E,aAAa,WAAa9C,EAAEoQ,MAG/BhS,EAAY,QAAI4B,EAAE3B,QAAQC,KAAK0B,GAE/B5B,EAAG5C,KAAKwE,EAAEsS,OACHtS,EAAE7B,IAAMC,OAOrBnL,EAAO,YAAY,CAAC,gBAAgB,SAAUuf,GAC5C,MAAO,CAKLpV,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOoV,GACpBjV,UAAUrE,MAAMoE,MAAMD,IAOzBgB,QAAU,SAAUzG,GAClB,IAAIuI,EAAIjH,KAAKkH,OACT3J,EAAQyC,KAAKzC,QACjB0J,EAAEoS,QAAQ9b,EAAO,eAUvBxD,EAAO,UAAU,CACf,OACA,UACA,cACC,SACDwU,EACAZ,EACA2L,GAEA,MAAO,CAELpV,OAAS,SAAUC,GACjB,MAAMlJ,EAAMP,OAAOwJ,OAAOqK,GACnBlK,UAAUrE,MACVoE,MAAMD,EAAQ,CACbwJ,UAAYA,EACZ2L,YAAcA,IAWtB,OATAre,EAAI8M,MAAM,GAGV9M,EAAI8J,UAAU+E,iBACZ,QAAQ,SAAUpL,GAChBsB,KAAKkH,KAAKC,UAIPlM,GAOTkc,SAAW,SAAU3H,GACnBxP,KAAKuZ,IAAM/J,GAOb6J,QAAU,SAAUrD,EAAK5S,QACN/D,IAAbW,KAAKuZ,KACPvZ,KAAKuZ,IAAIvD,EAAK5S,IASlBuT,OAAS,SAAUX,GACjB,MAAMwD,EAAQxZ,KAAKyL,OAAO+M,KAAKzc,GAAKA,EAAEia,QAAUA,GAEhD,GAAIwD,EACF,OAAOA,EAAMpW,YAerBrJ,EAAO,eAAe,CAAE,SAAU,WAEhC,MAAO,CAKLmK,OAAS,SAAUuV,GACjB,OAAO/e,OAAOwJ,OAAOlE,MAAMoE,MAAMqV,IAOnCrV,MAAQ,SAAUqV,GAChB,QAAkBpa,IAAdoa,EACF,MAAM,IAAIhc,MAAM,qBAGhB,OADAuC,KAAK0Z,WAAaD,EACXzZ,MAQX+E,QAAU,WAGR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAId,MAAM0U,EAASvX,SAASC,cAAc,MACtCsX,EAAO9X,UAAUE,IAAI,QAErB,MAAM0X,EAAYzZ,KAAK0Z,WACvB,IAAIE,EAAQC,EAAQC,EAYpB,OAVApf,OAAOqf,KAAKN,GAAWhT,SAAQ,SAAUwP,GACvC2D,EAASD,EAAO1X,KAAK,OACrB4X,EAASD,EAAO3X,KAAK,MACrB4X,EAAOvX,KAAK2T,GACZ4D,EAAOjQ,aAAa,QAASqM,GAC7B6D,EAASF,EAAO3X,KAAK,MACrB6X,EAAOxX,KAAK,IAAI0X,OAAOP,EAAUxD,IAAIgE,qBAGvCja,KAAKiF,IAAM0U,EACJ3Z,KAAKiF,SAclBlL,EAAO,aAAa,CAAC,SAAS,WAE5B8F,MAAMmX,kBAAoB,IAAI5W,OAAO,oBACrCP,MAAMkX,aAAoB,IAAI3W,OAAO,wCAKrC,MAAMuC,EAAM9C,MAAM6C,OAClBC,EAAIuX,KAAOvX,EAAIuX,MAAQ,CACrB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAEtCvX,EAAIwX,MAAQxX,EAAIwX,OAAS,CACvB,UAAW,WAAY,QAAS,QAChC,MAAO,OAAQ,OAAQ,SACvB,YAAa,UAAW,WACxB,YAGF,MAAMC,EAAIhY,SAGV,MAAO,CAKL8B,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WAEN,OADApE,KAAKqa,UAAY,GACVra,MAOTsa,OAAS,SAAUC,EAAMC,EAAOC,GAC9B,MAAM3T,EAAI9G,KACV,OAAI9C,UAAUZ,QAAU,GACtBwK,EAAEuT,UAAY,CAACE,KAASA,GACxBzT,EAAE4T,UAAYH,EACVrd,UAAUZ,QAAU,IACtBwK,EAAEuT,UAAiB,MAAIG,EACvB1T,EAAE6T,WAAaH,EACXtd,UAAUZ,QAAU,IACtBwK,EAAEuT,UAAe,IAAII,EACrB3T,EAAE8T,SAAWH,IAIV3T,GAGFA,EAAEuT,WAQXQ,IAAM,SAAUN,EAAMC,EAAOC,GAC3Bza,KAAKsa,OAAOC,EAAMC,EAAOC,GACzBza,KAAK8a,UAKPA,OAAS,gBACazb,IAAhBW,KAAK+a,OACP/a,KAAK+a,OAAO/a,KAAKqa,WAEjB9W,QAAQyX,IAAIhb,KAAKqa,YAWrBlV,QAAU,SAAUqK,GAClBxP,KAAK+a,OAASvL,GAOhBsI,MAAQ,WACN,OAAO9X,KAAKoU,QAUd7G,KAAO,SAAUgN,EAAMC,GAErB,MAAM9b,EAAIsB,KAAKiF,IAAMmV,EAAE/X,cAAc,OACrC3D,EAAEkL,aAAa,WAAY,GAC3BlL,EAAEyK,MAAMiC,QAAU,EAClB1M,EAAEmD,UAAUE,IAAI,cAEhB,MAAMkZ,EAAQ,IAAIC,KACZpU,EAAI9G,KAgDV,OA7CA8G,EAAE4T,eAAsBrb,IAATkb,EAAsBA,EAClCzT,EAAEuT,UAAgB,KAAIra,KAAKqa,UAAgB,KAC3CY,EAAME,UAAY,KAGrBrU,EAAE6T,WAAaH,IACZ1T,EAAEuT,UAAiB,MAAIvT,EAAEuT,UAAiB,MACzCY,EAAMG,WAAa,GAGvB1c,EAAEyD,YAAY2E,EAAEuU,gBAChB3c,EAAEyD,YAAY2E,EAAEwU,eAChB5c,EAAEyD,YAAY2E,EAAEyU,cAChBzU,EAAEsN,OAAS1V,EAAEyD,YAAY2E,EAAE0U,iBAG3B9c,EAAEoL,iBACA,YACA,SAAUa,GACR3K,KAAKwU,UAAW,GAChBpP,KAAK0B,IAGTpI,EAAEoL,iBACA,UACA,SAAUa,GACR3K,KAAKwU,UAAW,EAChBxU,KAAKoU,OAAO1J,SACZtF,KAAK0B,IAGTA,EAAEsN,OAAOtK,iBACP,OACA,SAAUa,GACH3K,KAAKwU,UACJxU,KAAK4X,WAAW5X,KAAKoU,OAAO7W,QAC9ByC,KAAK8a,SAGTnQ,EAAG5K,QACHqF,KAAK0B,IAGTA,EAAEsN,OAAO1J,QAEF5D,EAAE7B,KAGXuW,cAAgB,WAId,MAAM1D,EAAQsC,EAAE/X,cAAc,SA4B9B,OA3BAyV,EAAMva,MAAQyC,KAAKoB,WACnB0W,EAAMlO,aAAa,WAAY,GAE/BkO,EAAMhO,iBACJ,QACA,SAAUpL,GACJsB,KAAK4X,WAAWE,EAAMva,SACxByC,KAAKyb,cACLzb,KAAK0b,eACL1b,KAAK2b,eAEPvW,KAAKpF,OAGT8X,EAAMhO,iBACJ,WACA,SAAUpL,GACR,GAAiB,IAAbA,EAAEsC,QAKJ,OAJIhB,KAAK4X,WAAWE,EAAMva,QACxByC,KAAK8a,SAEPpc,EAAEqB,QACK,GAETqF,KAAKpF,OAGF8X,GAOT/S,QAAU,WACR,OAAO/E,KAAKiF,KAOdgW,MAAQ,WACN,MAAMA,EAAQ,IAAIC,KAClB,IAAIhI,EAAM+H,EAAME,UAAY,KAC5B,MAAMlU,EAAIgU,EAAMG,WAAa,EACvBhB,EAAIa,EAAMW,UAGhB,OAFA1I,GAAO,KAAOjM,EAAI,GAAK,IAAMA,EAAIA,GACjCiM,GAAO,KAAOkH,EAAI,GAAK,IAAMA,EAAIA,GAC1BlH,GAOT9R,SAAW,WAET,IAAI2C,EAAI,GACR,MAAMwF,EAAIvJ,KAAKqa,UAYf,OAXI9Q,EAAQ,OACVxF,GAAKwF,EAAQ,KACTA,EAAS,QACXxF,GAAK,IACLA,GAAKwF,EAAS,MAAI,GAAK,IAAMA,EAAS,MAAIA,EAAS,MAC/CA,EAAO,MACTxF,GAAK,IACLA,GAAKwF,EAAO,IAAI,GAAK,IAAMA,EAAO,IAAIA,EAAO,OAI5CxF,GAOT8X,SAAW,WACT,MAAM/U,EAAI9G,KACV,GAAI8G,EAAE4T,UAAY,KAKhB,OAJA5T,EAAE4T,YACF5T,EAAE2U,cACF3U,EAAE4U,eACF5U,EAAE6U,aACK7U,GASXgV,SAAW,WACT,MAAMhV,EAAI9G,KACV,GAAI8G,EAAE4T,UAAY,EAKhB,OAJA5T,EAAE4T,YACF5T,EAAE2U,cACF3U,EAAE4U,eACF5U,EAAE6U,aACK7U,GASXiV,UAAY,WACV,MAAMjV,EAAI9G,KAUV,OATA8G,EAAE6T,aACE7T,EAAE6T,WAAa,IACjB7T,EAAE6T,WAAa,EACf7T,EAAE+U,aAGF/U,EAAE4U,eACF5U,EAAE6U,cAEG7U,GAOTkV,UAAY,WACV,MAAMlV,EAAI9G,KAWV,OAVA8G,EAAE6T,aACE7T,EAAE6T,WAAa,GACjB7T,EAAE6T,WAAa,GACf7T,EAAEgV,aAGFhV,EAAE4U,eACF5U,EAAE6U,cAGG7U,GAKTwU,YAAc,WACZ,MAAMxU,EAAI9G,KACJua,EAAOH,EAAE/X,cAAc,OAmB7B,OAlBAkY,EAAK1Y,UAAUE,IAAI,QAGnBwY,EAAKtY,KAAK,QACPkD,QAAU2B,EAAEgV,SAAS1W,KAAK0B,GAE7BA,EAAEmV,UAAY1B,EAAKtY,KAAK,QACxB6E,EAAEmV,UAAU3Z,KAAKwE,EAAE4T,WAEnB5T,EAAEmV,UAAU9W,QAAU,WACpB2B,EAAE+T,IAAI/T,EAAE4T,YACRtV,KAAK0B,GACPA,EAAEoV,cAGF3B,EAAKtY,KAAK,QACPkD,QAAU2B,EAAE+U,SAASzW,KAAK0B,GAEtByT,GAKTkB,YAAc,WACZzb,KAAKic,UAAUpb,WAAW0O,KAAOvP,KAAK0a,UACtC1a,KAAKkc,eAKPA,YAAc,WACRlc,KAAK0a,YAAc1a,KAAKsa,SAAe,KACzCta,KAAKic,UAAUpa,UAAUE,IAAI,YAE7B/B,KAAKic,UAAUpa,UAAUG,OAAO,aAKpCqZ,aAAe,WACb,MAAMvU,EAAI9G,KACJwa,EAAQJ,EAAE/X,cAAc,OAmB9B,OAlBAmY,EAAM3Y,UAAUE,IAAI,SAGpByY,EAAMvY,KAAK,QACRkD,QAAU2B,EAAEkV,UAAU5W,KAAK0B,GAE9BA,EAAEqV,UAAY3B,EAAMvY,KAAK,QACzB6E,EAAEqV,UAAU7Z,KAAKK,EAAIwX,MAAMrT,EAAE6T,WAAW,IACxC7T,EAAEqV,UAAUhX,QAAU,WACpBnF,KAAK6a,IAAI7a,KAAK0a,UAAW1a,KAAK2a,aAC9BvV,KAAK0B,GAEPA,EAAEsV,eAGF5B,EAAMvY,KAAK,QACRkD,QAAU2B,EAAEiV,UAAU3W,KAAK0B,GAEvB0T,GAITkB,aAAe,iBACWrc,IAApBW,KAAK2a,YAA4B3a,KAAK2a,WAAa,MACrD3a,KAAK2a,WAAa,GAEpB3a,KAAKmc,UAAUtb,WAAW0O,KAAO5M,EAAIwX,MAAMna,KAAK2a,WAAW,GAC3D3a,KAAKoc,gBAKPA,aAAe,WACb,MAAMtV,EAAI9G,KACN8G,EAAE4T,YAAc5T,EAAEwT,SAAe,MACjCxT,EAAE6T,aAAe7T,EAAEwT,SAAgB,MACrCxT,EAAEqV,UAAUta,UAAUE,IAAI,YAE1B+E,EAAEqV,UAAUta,UAAUG,OAAO,aAKjCuZ,WAAa,WACX,MAAMc,EAAQjC,EAAE/X,cAAc,SAGxBia,EAAKD,EAAMpa,KAAK,SAASA,KAAK,MACpC,IAAK,IAAIlG,EAAI,EAAGA,EAAI,EAAGA,IACrBugB,EAAGra,KAAK,MAAMK,KAAKK,EAAIuX,KAAKne,IAM9B,OAHAiE,KAAKuc,WAAavc,KAAKwc,WAEvBH,EAAMla,YAAYnC,KAAKuc,YAChBF,GAKTG,SAAW,WACT,MAAMC,EAAW,IAAIvB,KACnBlb,KAAK0a,UACL1a,KAAK2a,WAAa,EAClB,EACA,EACA,EACA,EACA,GAEI+B,EAAO,IAAIxB,KACflb,KAAK0a,UACL1a,KAAK2a,WAAa,EAClB,EACA,EACA,EACA,EACA,GAEIM,EAAQ,IAAIC,KACZxL,EAAO1P,KAIP2c,EAAQ,WACZjN,EAAKmL,IACHnL,EAAKgL,UACLhL,EAAKiL,WACLlS,SAASzI,KAAKa,WAAW0O,QAK7BmN,EAAKE,QAAQF,EAAKd,WAAcc,EAAKG,SAAW,GAAK,GAErD,MAAMC,EAAK1C,EAAE/X,cAAc,SAErBkH,EAAIvJ,KAAKsa,SAEf,IAAIgC,EAAIvgB,EAAGghB,EAGX,OAAU,CAIR,IADAT,EAAKQ,EAAG7a,KAAK,MACRlG,EAAI,EAAGA,EAAI,EAAGA,IACjBghB,EAAKT,EAAGra,KAAK,MAGTya,EAAKtB,aAAeqB,EAASrB,WAC/B2B,EAAGlb,UAAUE,IAAI,OAGjBgb,EAAG5X,QAAUwX,EAIXD,EAAKd,YAAkBX,EAAMW,WAC7Bc,EAAKtB,aAAkBH,EAAMG,YAC7BsB,EAAKM,gBAAkB/B,EAAM+B,eAC/BD,EAAGlb,UAAUE,IAAI,SAIfwH,GAAKA,EAAO,KACVmT,EAAKd,YAAkBrS,EAAO,KAC9BmT,EAAKtB,aAAkB7R,EAAS,MAAE,GAClCmT,EAAKM,gBAAkBzT,EAAQ,MACjCwT,EAAGlb,UAAUE,IAAI,YAKrBgb,EAAGza,KAAKoa,EAAKd,WAGbc,EAAKE,QAAQF,EAAKd,UAAY,GAGhC,GAAIc,EAAKtB,aAAeqB,EAASrB,WAC/B,MAEJ,OAAO0B,GAITnB,WAAa,WACX,MAAMsB,EAAUjd,KAAKwc,WACrBxc,KAAKuc,WAAW1W,WAAWC,aACzBmX,EACAjd,KAAKuc,YAEPvc,KAAKuc,WAAaU,GAOpBrF,WAAa,SAAU7T,GACrB,QAAU1E,IAAN0E,EACF,OAAO,EAET,IAAKlE,MAAMkX,aAAava,KAAKuH,GAC3B,OAAO,EAET,MAAMqW,EAAIrW,EAAE5H,MAAM,IAAK,GAOvB,OANAie,EAAE,GAAK3R,SAAS2R,EAAE,IACdA,EAAE,KAAIA,EAAE,GAAK3R,SAAS2R,EAAE,KACxBA,EAAE,KAAIA,EAAE,GAAK3R,SAAS2R,EAAE,KAG5Bpa,KAAKsa,OAAOF,EAAE,GAAIA,EAAE,GAAIA,EAAE,KACnB,OAcbrgB,EAAO,QAAQ,CAAC,cAAe,SAAS,SAAUoW,GAEhD,MAAO,CACLjM,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAKnCjL,MAAQ,SAAUiL,GAChB,MAAMvI,EAAI9G,KACV8G,EAAEoW,MAAQ,GAQVpW,EAAEqW,SAAW9N,EACb,MAAM+N,EAAI,CAAC,SAAU,gBAYrB,OAVI/N,GACF+N,EAAEjgB,KAAKC,MAAMggB,EAAE/N,GAEjBvI,EAAEuW,QAAUlN,EAAiBjM,OAAOkZ,GAAGhY,KAAKpF,MAG5C8G,EAAEwW,SAAU,EAGZxW,EAAEuW,QAAQ7O,MAAQ1H,EACXA,GAOT/B,QAAU,WACR,GAAI/E,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMvG,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UACbD,EAAGG,IAAI,SAEH/B,KAAKmd,UACPvb,EAAGG,IAAI3E,MAAMwE,EAAI5B,KAAKmd,UAExBnd,KAAKud,OAAS7e,EAAEuD,KAAK,OAIrB,MAAMub,EAAQxd,KAAKqd,QAAQtY,UAI3B,OAHKyY,EAAM3X,YACTnH,EAAEyD,YAAYqb,GAETxd,KAAKiF,IAAMvG,GAOpB+e,aAAe,WAEb,OADAzd,KAAK+E,UACE/E,KAAKud,QAOdxb,IAAM,SAAU2b,GAGd1d,KAAKkd,MAAM/f,KAAKugB,GAGZ1d,KAAKsd,QACPtd,KAAKyd,eAAeH,QAClBI,EAAK3Y,WAIP/E,KAAKyd,eAAetb,YAClBub,EAAK3Y,WAIL2Y,EAAKC,YACPD,EAAKC,aAEPD,EAAKlP,MAAQxO,MAOf4d,QAAU,SAAUF,GAClB1d,KAAKkd,MAAMzW,SAAQ,SAAS/H,EAAG3C,EAAG4X,GAC5BjV,IAAMgf,IACR/J,EAAE5X,QAAKsD,OAWbgF,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,UAYbjG,EAAO,OAAO,CAAC,cAAe,SAAS,SAAUoW,GAE/C,MAAMxN,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIkb,MAAQlb,EAAIkb,OAAa,QAEtB,CACL3Z,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAInCjL,MAAQ,SAAUiL,GAChBrP,KAAKwO,WAAQnP,EACbW,KAAKmd,SAAW9N,EAChBrP,KAAK8d,QAAS,EAGd,MAAMV,EAAI,CAAC,SAAU,eAarB,OAZI/N,GACF+N,EAAEjgB,KAAKC,MAAMggB,EAAE/N,GAEjBrP,KAAKqd,QAAUlN,EAAiBjM,OAAOkZ,GAAGhY,KAAKpF,MAE/CA,KAAKqd,QAAQtb,IAAIY,EAAIkb,MAAO,CAACtM,IAAM,CAAC,cAAc,WAAW,SAAU7S,GACrEsB,KAAK+d,WAIP/d,KAAKqd,QAAQK,KAAO1d,KAEbA,MAOT+E,QAAU,WACR,GAAI/E,KAAKiF,IAEP,OADAjF,KAAKiF,IAAIpD,UAAUE,IAAI,QAChB/B,KAAKiF,IAId,MAAMvG,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UAOb,GALAD,EAAGG,IAAI,OAAQ,QACX/B,KAAKmd,UACPvb,EAAGG,IAAI3E,MAAMwE,EAAI5B,KAAKmd,eAGN9d,IAAdW,KAAKuN,KAAoB,CAC3B,MAAMhE,EAAIvJ,KAAKuN,OACf,IAAIhE,EAGF,OAAO7K,EAFPA,EAAEyD,YAAYoH,GAUlB,OAJAvJ,KAAK8d,QAAS,EAEdpf,EAAEyD,YAAYnC,KAAKqd,QAAQtY,WAEpB/E,KAAKiF,IAAMvG,GAOpB4P,MAAQ,WACN,OAAOtO,KAAK8d,QAOdE,SAAW,WACLhe,KAAKiF,KACPjF,KAAKiF,IAAIpD,UAAUG,OAAO,SAW9B+b,MAAQ,WAGF/d,KAAKie,SACPje,KAAKie,UAEP,MAAMvf,EAAIsB,KAAK+E,UACXrG,EAAEmH,YACJnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAKwO,MAAMoP,QAAQ5d,MACnBA,KAAK8d,QAAS,GAUhBzZ,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,UAYbjG,EAAO,oBAAoB,CAAC,OAAQ,eAAgB,gBAC7C,SAAUmkB,EAAWC,EAAWC,GAGrC,MAAMzb,EAAQ9C,MAAM6C,OAGpB,OAFAC,EAAI0b,QAAU1b,EAAI0b,SAAW,UAEtB,CACLna,OAAS,SAASgR,EAAI1G,GACpB,OAAO9T,OAAOwJ,OAAOga,GACnB9Z,MAAM,CAAE,gBACRC,UAAUrE,MACVoE,MAAM8Q,EAAI1G,IAGdpK,MAAQ,SAAS8Q,EAAI1G,GAGnB,OAFAxO,KAAKkV,GAAKA,EACVlV,KAAKwO,MAAQA,EACNxO,MASTse,MAAQ,WACN,OAAOte,KAAKkV,IAOdqJ,aAAe,SAAU/O,GACvB,MAAM0F,EAAKlV,KAAKkV,GAEhB,IACErV,MAAM4C,IAAI+b,YAAYtJ,EAAG1C,WAAW,SAASiM,GAC3C,GAAqB,OAAjBA,EAIJ,QAAqBpf,IAAjBof,EAAJ,CAMA,GAAsC,OAAlCA,EAA4B,oBACSpf,IAAlCof,EAA4B,cAAiB,CAClD,MAAMC,EAAQD,EAA4B,cAG1C,OAFA5e,MAAMsD,IAAI,EAAGub,EAAM,GAAG,SACtBlP,EAAG,MAILA,EAAGiP,QAbDjP,EAAG,WAJHA,EAAG,SAqBT,MAAO9Q,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAQPjC,KAAO,WAEL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAMC,EAAYxc,SAASC,cAAc,OAkBzC,OAjBAuc,EAAU/c,UAAUE,IAAI,YAAa,WAMrC/B,KAAKue,cAAa,SAAS9E,GACzBmF,EAAU/c,UAAUG,OAAO,WAET,OAAdyX,GAGJmF,EAAUzc,YACRgc,EAAUja,OAAOuV,GAAW1U,cAIzB/E,KAAK2e,MAAQC,GAOtBC,gBAAkB,WAChB,IAAIC,EAAYjf,MAAMqV,GAAG1C,UACzB,MAAMuM,EAAY/e,KAAKkV,GAAG8J,YAStBF,GAA2B,KAAdA,KACXA,EAAUG,WAAW,OACvBH,EAAYA,EAAUhkB,MAAM,EAAGgkB,EAAUxiB,OAAO,IAG9CwiB,GAAaC,GACf/e,KAAKkf,gBAUXA,YAAc,WACZ,MAAMC,EAAQnf,KAAK2e,MAEnB,GAA0D,GAAtDQ,EAAMC,uBAAuB,eAAe9iB,OAAa,CAC3D,MAAM+iB,EAAMjB,EAAYla,OAAO,CAAC,cAAe,iBAE/Cmb,EAAItd,IAAIY,EAAI0b,QAAS,CAAC9M,IAAM,CAAC,UAAW,gBAAiB,SAAU7S,GACjEygB,EAAMtd,UAAUG,OAAO,cACvBhC,KAAKwO,MAAM8Q,kBACXla,KAAKpF,OAEPmf,EAAMhd,YAAYkd,EAAIta,WACtBoa,EAAMtd,UAAUE,IAAI,gBAQxBkc,QAAU,WACRje,KAAKkV,QAAK7V,OAgBhBtF,EAAO,WAAW,CAChB,QACA,sBACC,SAAUwlB,EAAYC,GAEbpd,SAAV,MAGMO,EAAM9C,MAAM6C,OAIlB,OAHAC,EAAI8c,UAAW9c,EAAI8c,WAAa,aAChC9c,EAAI+c,cAAgB/c,EAAI+c,eAAoB,oBAErC,CACLxb,OAAS,SAAUgR,GACjB,OAAOxa,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,WAAWC,UAAUrE,MAAMoE,MAAM8Q,IAG3E9Q,MAAQ,SAAS8Q,GAChBlV,KAAKkV,GAAKA,EAKT,OAJelV,KAAKqd,QACZtb,IAAIY,EAAI8c,UAAW,CAAClO,IAAM,CAAC,cAAe,WAChDvR,KAAK2f,eACLva,KAAKpF,OACAA,MAOT2f,YAAa,WACX,MAAM7Y,EAAI9G,KAGV,QAAmBX,IAAfyH,EAAE8Y,UAA0B9Y,EAAE8Y,SAAStR,QAAQ,CACjD,IAAI6Q,EAAQrY,EAAE8Y,SAASrS,OACnB4R,EAAMtd,UAAUC,SAAS,gBAC3BgF,EAAEwY,iBACFH,EAAMtd,UAAUG,OAAO,oBAKR3C,IAAfyH,EAAE8Y,UAA2B9Y,EAAE8Y,SAAStR,UAC1CxH,EAAE8Y,SAAWJ,EAAetb,OAAO4C,EAAEoO,GAAGpO,GACxCA,EAAE/E,IAAI+E,EAAE8Y,UACR9Y,EAAEoO,GAAG8J,WAAanf,MAAMqV,GAAG1C,YAQ/B8M,eAAgB,WACdtf,KAAK4f,SAAS7B,QACd/d,KAAK2f,mBAoDX5lB,EAAO,KAAK,CACV,iBACA,SACA,cACA,iBACA,UACA,eACA,aACA,cACA,WACA,oBACA,cACA,SACC,SACD8lB,EACA9H,EACAM,EACA3C,EACAnH,EACA4P,EACA2B,EACAC,EACAC,EACAR,EACArP,GAEAtQ,MAAM+W,oBAAsB,IAAIxW,OAC9B,yCACFP,MAAMgX,oBAAsB,IAAIzW,OAAO,eACvCP,MAAMiX,kBAAoBjX,MAAM+W,oBAChC/W,MAAMogB,sBAAwB,IAAI7f,OAChC,mCACFP,MAAMqgB,iBAAkB,EAGxB,MAAMvd,EAAM9C,MAAM6C,OAsClB,OArCAC,EAAI8c,UAAmB9c,EAAI8c,WAAoB,aAC/C9c,EAAI+c,cAAmB/c,EAAI+c,eAAoB,oBAC/C/c,EAAIwd,cAAmBxd,EAAIwd,eAAoB,cAC/Cxd,EAAIyd,iBAAmBzd,EAAIyd,kBAAoB,mBAC/Czd,EAAI0d,SAAmB1d,EAAI0d,UAAoB,WAE/CxgB,MAAM6W,gBAAarX,EACnBQ,MAAM8X,cAAgBmI,EAAQ5b,SAG9BrE,MAAM2X,eAAiB,CACrB/P,OAAW8G,EAAUrK,OAAO,CAC1B,CAAE,KAAM,MACR,CAAE,KAAM,QAEV3B,KAASgM,EAAUrK,OAAO,CACxB,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,WAAY,MACd,CAAE,cAAe,QAEnBwY,KAASnO,EAAUrK,OAAO,CACxB,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,MAAO,MACT,CAAE,MAAO,QAEX2P,MAAUtF,EAAUrK,OAAO,CACzB,CAAE,KAAM,MACR,CAAE,KAAM,SAQL,CAKLqM,OAAS,WACP,OAAO,MAKTnM,MAAQ,SAASkc,GAGf,IAAKzgB,MAAMqgB,gBAAiB,CAE1B,MAAMhd,EAAQrD,MAAMiD,gBAGpBI,EAAMqd,WAAW,oHAEmB5d,EAAIC,GAAK,MAAO,GAGpDM,EAAMqd,WACJ,sHAEqB5d,EAAIE,IAAM,MAAO,GAExChD,MAAMqgB,iBAAkB,EAG1B,IAAIM,EAaJ,OAZIF,GACFE,EAAIF,EAAQxlB,QACZ0lB,EAAEC,QAAQ,CAAC,UAAW,SAGtBD,EAAI,CAAC,CAAC,UAAW,QAInB3gB,MAAM6W,WAAanI,EAAUrK,OAAOsc,GACpC3gB,MAAM6W,WAAW3O,MAAM,GAEhB/H,MAOTkE,OAAS,SAAUoc,GACjB,MAAMrlB,EAAMP,OAAOwJ,OAAOlE,MAAMoE,MAAMkc,GAEtC,OADArlB,EAAIylB,MAAQb,EAAe3b,OAAOjJ,GAC3BA,GAQT2X,SAAW,SAASD,GAElB,IAAI1X,EAEJ,QAAaoE,IAATsT,EAGF,GAAqB,aAAjBA,EAAK,SACP1X,EAAM8c,EAAS7T,OAAOlE,KAAM2S,QAIzB,GAAqB,kBAAjBA,EAAK,SACZ1X,EAAMod,EAAcnU,OAAOlE,KAAM2S,OAI9B,CAAA,GAAqB,qBAAjBA,EAAK,SAOZ,YADA9S,MAAMsD,IAAI,IAAK,oCALflI,EAAMya,EAAiBxR,OAAOlE,KAAM2S,QAYtC1X,EAAM4kB,EAAe3b,OAAOlE,MAM9B,OAFAA,KAAKkS,KAAKjX,GAEH+E,MAKT2gB,aAAe,SAAU1lB,GAOvB,OALyB,IAArBiC,UAAUZ,SACZrB,EAAM+E,KAAK0gB,UAITzlB,EAAIqX,YAAcrX,EAAIqX,WAAWhW,SAAW,IAKtB,aAAjBrB,EAAIsV,eAG8ClR,IAArDpE,EAAI0d,WAAWH,KAAKlH,GAAMtR,KAAK2gB,aAAarP,KAYpDJ,MAAQ,WACN,MAAMpK,EAAI9G,KAQV,MAPyB,QAArB8G,EAAE4Z,MAAMnQ,WACVzJ,EAAE4Z,MAAMlU,UACR1F,EAAEoL,KAAK2N,EAAe3b,OAAO4C,KAI/BA,EAAEmK,SACKnK,GAOToL,KAAO,SAASjX,GACd,GAAyB,IAArBiC,UAAUZ,OAAc,CAC1B,MAAMoC,EAAIsB,KAAK4gB,UAEM,OAAjBliB,EAAEmC,WAGAnC,EAAEmC,aAAe5F,EAAI8J,WACvBrG,EAAEoH,aAAa7K,EAAI8J,UAAWrG,EAAEmC,YAMlCnC,EAAEyD,YAAYlH,EAAI8J,WAIpB/E,KAAK0gB,MAAQzlB,EACbA,EAAIqV,OAAOtQ,MAEXA,KAAKiR,SAGP,OAAOjR,KAAK0gB,OAOdE,QAAU,WACR,MAAM9Z,EAAI9G,KAGV,YAAmBX,IAAfyH,EAAE+Z,UAGN/Z,EAAE/B,UAFO+B,EAAE+Z,UAUb9b,QAAU,WACR,MAAM+B,EAAI9G,KACV,IAAItB,EAAIoI,EAAE7B,IAEV,QAAU5F,IAANX,EACF,OAAOA,EAGTA,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,OACnC3D,EAAEmD,UAAUE,IAAI,MAGhB+E,EAAE+Z,SAAWniB,EAAEuD,KAAK,OACpB6E,EAAE+Z,SAASjX,aAAa,QAAS,WAEjC,MAAMgF,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAoBZ,OAjBA0K,EAAI7M,IAAIY,EAAI0d,SAAU,CAAC9O,IAAM,CAAC,cAAc,aAAc,WACxDvR,KAAKge,YACL5Y,KAAK0B,IAEPpI,EAAEyD,YAAYyM,EAAI7J,WAGlB+B,EAAE+Z,SAAS1e,YAAY2E,EAAE4Z,MAAM3b,WAG/B+B,EAAEga,gBAGFha,EAAE7B,IAAI6E,iBAAiB,WAAY,SAAUpL,GAC3CsB,KAAK6e,gBAAgBngB,EAAE2W,SACvBjQ,KAAK0B,IAAI,GAEJpI,GAOTqiB,OAAS,WACP,QAAK/gB,KAAKiF,KAEHjF,KAAKiF,IAAIpD,UAAUC,SAAS,WAOrCkf,KAAO,WACLhhB,KAAK+E,UAAUlD,UAAUE,IAAI,UACzB/B,KAAKihB,QACPjhB,KAAKihB,UAOTjD,SAAW,WACThe,KAAK+E,UAAUlD,UAAUG,OAAO,UAC5BhC,KAAKkhB,YACPlhB,KAAKkhB,cAOTjQ,OAAS,WAOP,OANAjR,KAAK0gB,MAAMzP,SACPpR,MAAMqV,IACRlV,KAAK+E,UAAUoQ,cACb,IAAIC,YAAY,WAAY,CAACC,OAASrV,QAGnCA,MAqCTmhB,QAAU,WACR,MAA4B,QAAxBnhB,KAAK0gB,MAAMnQ,SACN5N,EAAIwd,cAEoB,gBAAxBngB,KAAK0gB,MAAMnQ,SACXvQ,KAAK0gB,MAAM3L,MAGXpS,EAAIyd,kBAMfgB,YAAc,SAAUhK,GACtB,MAAMlF,EAAOlS,KAAKkS,OACZ3B,EAAS2B,EAAK3B,SACdD,EAAS4B,EAAK5B,SAEpB,GAAe,QAAXC,EACFD,EAAO4B,KAAKkF,QAIT,GACQ,QAAX7G,GACa,gBAAXA,GACY,aAAXA,GACqB,OAArB2B,EAAK1B,YACH,CACL,MAAMwB,EAAQlY,EAAQ,eAAeoK,OACnCoM,GAEF0B,EAAMxB,UAAU,OAChBwB,EAAMC,OAAOC,GACbF,EAAMC,OAAOmF,GACbpF,EAAMjN,UACNuL,EAAO4B,KAAKF,OAKM,aAAXzB,EACP2B,EAAKD,OAAOmF,GAKZ7T,QAAQJ,IAAI,uBAIdnD,KAAKiR,UAOPmB,OAAS,WACP,OAAOpS,KAAK0gB,MAAMtO,UAOpBI,QAAU,WACR,OAAOxS,KAAK0gB,MAAMlO,WAOpBsO,cAAgB,WAEd9gB,KAAKwO,MAAQwR,EAAa9b,OAAOlE,MACjCA,KAAKiF,IAAIhD,KAAK,OAAOE,YAAYnC,KAAKwO,MAAMzJ,YAQ9C8Z,gBAAkB,gBACGxf,IAAfW,KAAKwO,YAA+CnP,IAAxBW,KAAKwO,MAAMoR,UACzC5f,KAAKwO,MAAMoR,SAASf,uBAc5B9kB,EAAO,aAAa,CAAC,KAAM,WAAW,SAAUsnB,EAAStJ,GACvD,MAAMpV,EAAM9C,MAAM6C,OAGlBC,EAAI2e,cAAgB,SAGpB3e,EAAI4e,aAAe,CACflP,QAAU,YACV2D,IAAQ,WACRqB,MAAS,WACT9Z,MAAU,aAGdoF,EAAI6e,eAAiB,eAMvBznB,EAAO,SAAS,IAAG,WACjB,MAAM4I,EAAM9C,MAAM6C,OAClBC,EAAIC,GAAK,OACTD,EAAIE,IAAM,MAIVF,EAAIwd,cAAgB,gBACpBxd,EAAIyd,iBAAmB,0BAGvBzd,EAAI+Q,WAAa/Q,EAAI+Q,YAAc,+BAGnC/Q,EAAIuX,KAAO,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAChDvX,EAAIwX,MAAQ,CACV,SAAU,UAAW,OAAQ,QAC7B,MAAO,OAAQ,OAAQ,SACvB,YAAa,UAAW,WACxB,YAIFxX,EAAI8e,QAAY,aAChB9e,EAAI+e,SAAY,QAChB/e,EAAIgf,SAAY,gBAChBhf,EAAIkb,MAAY,YAChBlb,EAAI0d,SAAY,YAChB1d,EAAIif,SAAY,gBAChBjf,EAAIkf,aAAe,0BACnBlf,EAAImf,QAAe,mBACnBnf,EAAIof,UAAe,YACnBpf,EAAIqf,UAAY,eAGhBrf,EAAI8c,UAAY,kBAChB9c,EAAI0b,QAAU,YAId1b,EAAIsf,eAAiB,iBAGrBtf,EAAIuf,WAAa,YACjBvf,EAAIwf,WAAa,SACjBxf,EAAIyf,WAAa,SACjBzf,EAAI0f,WAAa,UACjB1f,EAAI2f,iBAAmB,SAGvB3f,EAAI4f,UAAY,4OAGhB5f,EAAI6f,WAAa,yDAA2D7f,EAAI2e,cAAgB,KAChG3e,EAAI8f,eAAgB,gFACpB9f,EAAI+f,cAAgB,0FACpB/f,EAAIggB,YAAc,+BAClBhgB,EAAIigB,YAAc,iFAClBjgB,EAAIkgB,aAAe,8DACnBlgB,EAAImgB,aAAe,kBACnBngB,EAAIogB,aAAe,gGACnBpgB,EAAIqgB,aAAe,sHACnBrgB,EAAIsgB,UAAY,iBAChBtgB,EAAIugB,YAAc,sBAIlBvgB,EAAIwgB,UAAY,yDAChBxgB,EAAIygB,aAAe,yEACnBzgB,EAAI0gB,cAAgB,uBACpB1gB,EAAI2gB,eAAiB,gEACrB3gB,EAAI4gB,cAAgB,wBACpB5gB,EAAI6gB,YAAc7gB,EAAI6gB,aAAe,iCACrC7gB,EAAI8gB,WAAa9gB,EAAI8gB,YAAc,2CACnC9gB,EAAI+gB,WAAa/gB,EAAIghB,WAAa,6BAClChhB,EAAIghB,UAAYhhB,EAAIghB,WAAa,2EACjChhB,EAAIihB,cAAgB,0BAOtB7pB,EAAO,iBAAiB,CAAC,cAAc,SAAU4T,GAM/C,MAAO,CAMLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MAAMoE,MAAMD,IAO1BI,QAAU,SAAUA,GAIlB,OAHyB,IAArBrH,UAAUZ,SACb0D,KAAKwE,SAAWD,GAEVvE,KAAKwE,UAOdqf,QAAU,WACR,OAAO7jB,KAAK8jB,UAOdC,MAAQ,WACN,OAAO/jB,KAAKgkB,QAQd5gB,KAAO,WACL,OAAOpD,KAAKsX,OAOdnS,QAAU,SAAUzG,GAClB,MAAMwI,EAAOlH,KAAKkH,OAClBA,EAAKC,OACLzI,EAAEqB,YAEmBV,IAAjB6H,EAAKsH,SACRtH,EAAKsH,QAAQyV,QAAQjkB,KAAK8jB,SAAU9jB,KAAKgkB,OAAQhkB,KAAKsX,QAMzDlT,MAAQ,SAAUD,GAChB,QAAkB9E,IAAd8E,EAAO,GACV,MAAM,IAAI1G,MAAM,sBAEjB,MAAMqJ,EAAI9G,KAQV,OANA8G,EAAEsS,MAAWjV,EAAO,GACpB2C,EAAEgd,SAAW3f,EAAO,GACpB2C,EAAEkd,OAAW7f,EAAO,GACpB2C,EAAEwQ,MAAWnT,EAAO,GACpB2C,EAAEtC,SAAWpC,SAASI,eAAesE,EAAEsS,OACvCtS,EAAElC,SAAW,IAAMkC,EAAEvC,UAAUyC,YAAYzF,cACpCuF,OAcb/M,EAAO,qBAAqB,CAAC,SAAS,WAUpC,MAAM4I,EAAM9C,MAAM6C,OAClBC,EAAIqf,UAAYrf,EAAIqf,WAAa,YAEjC,MAAMkC,EAAM9jB,OAAO,eAEnB,SAAS+jB,EAAcC,GACrB,OAA2B,MAAvBA,EAAS/M,MAAM6M,GACV,IAAME,EAAS3nB,QAAQ,MAAO,QAAQA,QAAQ,KAAM,OAAS,IAE/D2nB,EAGT,SAASC,EAAgB1mB,EAAQ2mB,GAG/B,GAAIA,EAAO7e,WAAWnJ,OAAS,EAAG,CAChC,IAAIioB,EAAU,GAOd,OAJAD,EAAO7e,WAAWgB,SAAQ,SAAU4G,GACZ,IAAlBA,EAAKnH,UACPqe,EAAQpnB,KAAKQ,EAASwmB,EAAa9W,EAAKkC,UAErC,IAAMgV,EAAQC,OAAO3nB,KAAK,OAAS,IAK1C,MAAwB,IAApBynB,EAAOG,UACF,GAEF9mB,EAASwmB,EAAaG,EAAOG,WAIxC,MAAO,CAKLvgB,OAAS,SAAUwgB,GACjB,OAAOhqB,OAAOwJ,OAAOlE,MAAMoE,MAAMsgB,IAInCtgB,MAAQ,SAAUsgB,GAGhB,QAAmBrlB,IAAfqlB,EACF,MAAM,IAAIjnB,MAAM,sBACb,KAAMinB,aAAsBC,MAC/B,MAAM,IAAIlnB,MAAM,oBAElB,MAAMqJ,EAAI9G,KAGV8G,EAAE8d,OAAS,GAGX9d,EAAE+d,YAAcH,EAGhB5d,EAAE+d,YAAY/a,iBACZ,QAAShD,EAAEge,YAAY1f,KAAK0B,IAAI,GAIlC,MAAMpI,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,KAoBzC,OAnBA3D,EAAEmD,UAAUE,IAAI,QAAQ,YAGxBrD,EAAEuD,KAAK,QAAQK,KAAKK,EAAIqf,UAAY,KAGpClb,EAAEie,eAAiBrmB,EAAEuD,KAAK,QAG1BvD,EAAEoL,iBAAiB,QAAShD,EAAEke,WAAW5f,KAAK0B,GAAI,GAMlDA,EAAEme,IAAM7iB,SAAS8iB,eAAe,YACjCpe,EAAEqe,GAAK/iB,SAAS8iB,eAAe,WAE9Bpe,EAAEgX,QAAS,EACJhX,GAKTge,YAAc,SAAUM,GAGtB,GAAIA,EAAMd,SAAWc,EAAMC,cAAe,CAGxC,MAAMf,EAASc,EAAMd,OAErB,IAAIrhB,EAAM4gB,EAASE,EAAOhoB,EAAGupB,EAAKC,EAElC,GAAsB,MAAlBjB,EAAOkB,QAAiB,CAE1B,GAAwB,IAApBlB,EAAOG,UACT,OAEF,GAAIH,EAAOziB,UAAUC,SAAS,kBAC5B,OAWF,IAPAmB,EAAUqhB,EAAOze,WAAWD,qBAAqB,MACjDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAGlB1oB,GAAK,EACLupB,EAAMhB,EACgC,OAA9BgB,EAAMA,EAAIG,kBACK,IAAjBH,EAAIpf,UACNnK,IAIJwpB,EAAalB,EAAeR,EAAU,IAAME,EAAQ,IAAKO,GAEtC,KAAfiB,GAGFvlB,KAAK0lB,cAAcpB,EAAQvoB,EAAGwpB,QAK7B,GAAsB,QAAlBjB,EAAOkB,SAAuC,OAAlBlB,EAAOkB,QAAkB,CAE5D,GAAwB,IAApBlB,EAAOG,UACT,OAEoB,QAAlBH,EAAOkB,UACTlB,EAASA,EAAOze,YAIlB,MAAM8f,EAAarB,EAAOze,WAQ1B,IAPA5C,EAAU0iB,EAAW9f,WAAWD,qBAAqB,MACrDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAGlB1oB,GAAK,EACLupB,EAAMK,EAC+B,OAA9BL,EAAMA,EAAIG,kBACM,IAAjBH,EAAIpf,UACNnK,IAIJwpB,EAAalB,EAAeR,EAAU,IAAME,EAAQ,IAAKO,GAEtC,KAAfiB,GAGFvlB,KAAK0lB,cAAcpB,EAAQvoB,EAAGwpB,QAK7B,GAAsB,MAAlBjB,EAAOkB,QAGd,GAA4C,SAAxClB,EAAOze,WAAWA,WAAW2f,QAAoB,CAGnD,GAAIlB,EAAOziB,UAAUC,SAAS,UAC5B,OAKF,IAFA/F,GAAK,EACLupB,EAAMhB,EACgC,OAA9BgB,EAAMA,EAAIG,kBACK,IAAjBH,EAAIpf,UACNnK,IAIAA,GAAK,GACPiE,KAAK0lB,cAAcpB,EAAQvoB,EAAGsoB,EAAe,QAAQC,QAMpD,CAGHrhB,EAAUqhB,EAAOze,WAAWD,qBAAqB,MACjDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAClB,MAAM9mB,EAASkmB,EAAU,IAAME,EAAQ,IAKvC,IAFAhoB,EAAI,EACJupB,EAAMhB,EAC4B,OAA1BgB,EAAMA,EAAIM,cACK,IAAjBN,EAAIpf,UAAkC,OAAhBof,EAAIE,UAI1BF,EAAIzjB,UAAUC,SAAS,kBAEzB4J,MAAMma,KACJP,EAAI1f,qBAAqB,QACzBa,SAAQ,SAASqf,GAGjBP,EAAalB,EAAe1mB,EAAQmoB,GAEjB,KAAfP,IAGFvlB,KAAK+lB,YAAYhqB,EAAGwpB,GACpBO,EAAajkB,UAAUE,IAAI,aAE5B/B,OAOHulB,EAAalB,EAAe1mB,EAAQ2nB,GAEjB,KAAfC,IAGFvlB,KAAK+lB,YAAYhqB,EAAGwpB,GACpBD,EAAIzjB,UAAUE,IAAI,YAItBhG,MAMRqpB,EAAMnlB,mBAKR8lB,YAAc,SAAUnoB,EAAOooB,GAE7B,IAAIC,EAAQjmB,KAAK4kB,OAAOhnB,QAGVyB,IAAV4mB,IACFA,EAAQjmB,KAAK4kB,OAAOhnB,GAAS,IAI/BqoB,EAAM9oB,KAAK6oB,GAGXhmB,KAAK4kB,OAAOhnB,GAASqoB,EAAM9M,QACzB,SAAUza,EAAG3C,EAAGmqB,GACd,OAAOA,EAAIC,YAAYznB,KAAO3C,KAIlCiE,KAAKuN,QAKP6Y,iBAAmB,SAAUxoB,EAAOooB,GAClC,IAAIC,EAAQjmB,KAAK4kB,OAAOhnB,QAEVyB,IAAV4mB,IAGJA,EAAMrpB,OAAOqpB,EAAMpoB,QAAQmoB,GAAO,GAElChmB,KAAK4kB,OAAOhnB,GAASqoB,EAAM3pB,OAAS,EAAI2pB,OAAQ5mB,EAEhDW,KAAKuN,SAKPxI,QAAU,WACR,OAAO/E,KAAKiF,KAKdqJ,MAAQ,WACN,OAAOtO,KAAK8d,QAKdvQ,KAAO,WAEL,MAAMzG,EAAI9G,KACJkT,EAAMpM,EAAE1F,WACR6F,EAAIH,EAAE+d,YAGA,KAAR3R,GAGe,IAAbpM,EAAEgX,SACJ7W,EAAEpB,WAAW/E,YAAYgG,EAAE7B,KAC3B6B,EAAEgX,QAAS,KAOI,IAAbhX,EAAEgX,SAGJ7W,EAAEpB,WAAWa,aACXI,EAAE7B,IAAKgC,EAAE2e,aAEX9e,EAAEgX,QAAS,GAIbhX,EAAEie,eAAeN,UAAYvR,IAMjCwS,cAAgB,SAAU9kB,EAAMhD,EAAOooB,GACrC,MAAMpkB,EAAKhB,EAAKiB,UACZD,EAAGE,SAAS,WACd9B,KAAKomB,iBAAiBxoB,EAAOooB,GAC7BpkB,EAAGI,OAAO,YAGVhC,KAAK+lB,YAAYnoB,EAAOooB,GACxBpkB,EAAGG,IAAI,YAMXX,SAAW,WACT,IAKI6kB,EALA/S,EAAM,GACNmT,EAAW,EAKf,IAAK,IAAItqB,EAAI,EAAGA,EAAIiE,KAAK4kB,OAAOtoB,OAAQP,IACtCkqB,EAAQjmB,KAAK4kB,OAAO7oB,QAGNsD,IAAV4mB,GACEI,EAAW,IACbnT,GAAO,KACHmT,EAAW,IACbnT,GAAO,IAAMmT,EAAW,KAE1BA,EAAW,GAGbnT,GAAO,IAAM+S,EAAMzB,OAAO3nB,KAAK,OAAS,KAIzB,KAARqW,GACPmT,IAIJ,OAAOnT,GAKT8R,WAAa,SAAUtmB,GACrB,MAAMoI,EAAI9G,KAEV,QAAcX,IAAVyH,EAAEme,UAA8B5lB,IAATyH,EAAEqe,IAA8B,OAAVre,EAAEme,IAEjD,YADA1hB,QAAQJ,IAAI,oCAKd,MAAMmjB,EAAK5a,MAAMma,KACf/e,EAAEme,IAAIsB,SACN/N,KAAK9Z,GAAgB,YAAXA,EAAEnB,OAEV+oB,IACFA,EAAGzO,UAAW,GAGhB/Q,EAAEqe,GAAG5nB,MAAQuJ,EAAE1F,WAGfxB,OAAO4mB,SAAS,EAAG,QAWzBzsB,EAAO,cAAc,CACnB,qBACA,SACC,SAAU0sB,GAQX,MAAMC,EAAU,IAAItmB,OAAO,kCACrBga,EAAIhY,SAEV,MAAO,CAML8B,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MAAMoE,MAAMuiB,IAInCviB,MAAQ,SAAUuiB,GAGhB,MAAMC,EAAOxM,EAAE/X,cAAc,OACvByE,EAAI9G,KAgBV,OAfA4mB,EAAKrf,UAAYof,EAEjB7f,EAAE+f,KAAW,EACb/f,EAAEggB,OAAW,GACbhgB,EAAEigB,MAAW,GACbjgB,EAAEkgB,YAAW3nB,EACbyH,EAAEmgB,QAAW,GACbngB,EAAEogB,MAAW,GACbpgB,EAAEgd,SAAW,GACbhd,EAAEkd,OAAW,GAGbld,EAAEqgB,OAAOP,EAAKnhB,YAAY,GAE1BmhB,EAAKrf,UAAY,GACVT,GAKT0F,QAAU,WACRxM,KAAKonB,mBAAgB/nB,GASvB/C,OAAS,WACP,OAAO0D,KAAK6mB,MAOdQ,OAAS,gBACahoB,IAAhBW,KAAKgnB,QAEThnB,KAAKgnB,OAAOM,eAAe,CACzBC,OAAQ,QACRC,MAAO,aAWXC,SAAW,SAAUlhB,GACnB,YAAYlH,IAARkH,EACKvG,KAAK8mB,OACP9mB,KAAK8mB,OAAOvgB,IAarBmhB,SAAW,SAAUnhB,EAAKsd,EAASE,GACjC,OAAO/jB,KAAKknB,MAAM3gB,GAAKsd,EAAU,IAAME,IAKzCoD,OAAS,SAAU3hB,EAAUmiB,GAG3BniB,EAASiB,SAAQ,SAAS2W,GACxB,MAAMtW,EAAI9G,UAGcX,IAApByH,EAAEogB,MAAMpgB,EAAE+f,QACZ/f,EAAEogB,MAAMpgB,EAAE+f,MAAQ,IAIpB,MAAMrN,EAAQ1S,EAAEogB,MAAMpgB,EAAE+f,MAGxB,GAAmB,IAAfzJ,EAAElX,SAAgB,CACpB,IAAI0hB,EAAUD,EAEd,GAAkB,SAAdvK,EAAEoI,QACJoC,GAAU,OAGP,GAAIxK,EAAEyK,aAAa,UACpBnB,EAAQoB,KAAK1K,EAAE2K,aAAa,UAAW,CAGzC,IAAIlE,EAASE,EAAOxmB,EAChB6C,OAAO4nB,IACTnE,EAAUzjB,OAAO6nB,GACjBlE,EAAU3jB,OAAO4nB,KAGjBnE,EAAU,OACVE,EAAU3jB,OAAO6nB,IAGnB1qB,EAAQ6C,OAAO8nB,QAEsB7oB,IAAjCma,EAAMqK,EAAU,IAAME,GACxBvK,EAAMqK,EAAU,IAAME,GAAS,CAACxmB,GAI3Bic,EAAMqK,EAAU,IAAME,GAAOjgB,SAASvG,IAEzCic,EAAMqK,EAAU,IAAME,GAAO5mB,KAAKI,QAKV8B,IAAxByH,EAAEgd,SAASD,KACb/c,EAAEgd,SAASD,GAAW,IACxB/c,EAAEgd,SAASD,GAASE,GAAS,OAGL1kB,IAApByH,EAAEkd,OAAOD,KACXjd,EAAEkd,OAAOD,GAAS,IACpBjd,EAAEkd,OAAOD,GAAOF,GAAW,OAIpBzG,EAAEyK,aAAa,UAAuC,UAA3BzK,EAAE2K,aAAa,WACjDjhB,EAAEmgB,QAAQ9pB,KAAK2J,EAAE+f,MACjB/f,EAAEggB,OAAOhgB,EAAE+f,QAAU,IAInBzJ,EAAE+K,iBACJrhB,EAAEqgB,OAAO/J,EAAE3X,WAAYmiB,QAKH,IAAfxK,EAAElX,UACLkX,EAAErX,UAAUsR,MAAM,sBACpBvQ,EAAEigB,MAAMjgB,EAAE+f,QAAQc,EAClB7gB,EAAEggB,OAAOhgB,EAAE+f,QAAUzJ,EAAErX,aAG1B/F,aAEIA,KAAKknB,MAAMlnB,KAAK6mB,OAOzB9hB,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAM0L,EAAOyJ,EAAE/X,cAAc,OAEvBga,EAAQ1L,EAAK1O,KAAK,SAExBjC,KAAKiF,IAAM0L,EAGX,IAAI2L,EAAKD,EAAMpa,KAAK,SAASA,KAAK,MAElC,MAAMyB,EAAK7D,MAAM2D,kBAAoB,CAAEG,QAAY,cAG7CykB,EAAU,SAAUhlB,EAAM4S,EAAKzY,GACnC,MAAM6f,EAAIpd,KAAKiC,KAAKmB,GAEpB,QAAc/D,IAAV9B,EACF,OAAO6f,EAET,GAAIpH,GAAOzY,aAAiBmO,YAAsBrM,IAAb9B,EAAM,GAAkB,CAK3D,IAAImB,EAAGmF,EAFPuZ,EAAEvb,UAAUE,IAAI,kBAGhBxE,EAAMkJ,SAAQ,SAAS1C,GACrBrF,EAAI0e,EAAEnb,KAAK,OACXvD,EAAE4D,KAAKyB,GAEPF,EAAOH,EAAGC,QAAQqS,EAAKjS,GAEnBF,GACFnF,EAAEkL,aAAa,QAAS/F,UAIzB,CAECtG,aAAiBmO,QACnBnO,EAAQA,EAAM,IAEhB6f,EAAE9a,KAAK/E,GAGP,MAAMsG,EAAOH,EAAGC,QAAQqS,EAAKzY,GACzBsG,GACFuZ,EAAExT,aAAa,QAAS/F,GAG5B,OAAOuZ,GAGTd,EAAG8L,QAAUA,EAGb9L,EAAG8L,QAAQ,UAAM/oB,EAAW,WAC5Bid,EAAG8L,QAAQ,UAAM/oB,EAAW,SAG5B3E,OAAOqf,KAAK/Z,KAAK8mB,QAAQrgB,SAAQ,SAAS1K,GACxC,MAAMssB,EAAUroB,KAAKynB,SAAS1rB,GACxBqhB,EAAId,EAAG8L,QAAQ,UAAM/oB,EAAWgpB,GAClCroB,KAAK+mB,MAAMhrB,IACbqhB,EAAEvb,UAAUE,IAAI,aACI1C,IAAhBW,KAAKgnB,SACPhnB,KAAKgnB,OAAS5J,IAGTpd,KAAKinB,QAAQ,IAAMlrB,GAAKiE,KAAKinB,QAAQ,IAAMlrB,GAClDqhB,EAAEvb,UAAUE,IAAI,UAIdsmB,EAAQ/rB,OAAS,IACnB8gB,EAAExT,aAAa,QAASye,KAEzBroB,MAEH,MAAMsoB,EAAQjM,EAAMpa,KAAK,SAEzB,IAAe+T,EAAKjS,EAAGxG,EAAOgrB,EAsC9B,OApCA7tB,OAAOqf,KAAK/Z,KAAK8jB,UAAUU,OAAO/d,SAAQ,SAASod,GAE7CnpB,OAAOqf,KAAK/Z,KAAK8jB,SAASD,IAAUW,OAE9B/d,SAAQ,SAASsd,GAUzB,IARAzH,EAAKgM,EAAMrmB,KAAK,MAChBqa,EAAG1S,aAAa,WAAY,GAC5B0S,EAAG8L,QAAUA,EACb9L,EAAG8L,QAAQ,UAAM/oB,EAAWwkB,GAC5BvH,EAAG8L,QAAQ,UAAM/oB,EAAW0kB,GAE5B/N,EAAM6N,EAAU,IAAME,EAAQ,IAEzBhgB,EAAI,EAAGA,EAAI/D,KAAK1D,SAAUyH,IAG7BxG,EAAQyC,KAAK0nB,SAAS3jB,EAAG8f,EAASE,GAGlCwE,EAAOjM,EAAG8L,QACR,KACApS,EACAzY,GAGEyC,KAAK+mB,MAAMhjB,IACbwkB,EAAK1mB,UAAUE,IAAI,UAGtB/B,QACFA,MAGHA,KAAKonB,cAAgBX,EAAkBviB,OAAOlE,KAAKiF,KAE5CjF,KAAKiF,SAWlBlL,EAAO,kBAAkB,IAAG,WAE1B,MAAMyuB,EACJ,IAAIpoB,OAAO,gDAEb,MAAO,CAUL8D,OAAS,SAAU2f,EAASE,EAAO3gB,GACjC,OAAO1I,OAAOwJ,OAAOlE,MAAMoE,MAAMyf,EAASE,EAAO3gB,IAKnDgB,MAAQ,SAAUyf,EAASE,EAAO3gB,GAChC,QAAgB/D,IAAZwkB,EACH,MAAM,IAAIpmB,MAAM,sBAEjB,MAAMqJ,EAAI9G,KAEV,QAAcX,IAAV0kB,EAAqB,CACxB,IAAIyE,EAAaV,KAAKjE,GAMpB,MAAM,IAAIpmB,MAAM,sBALhBqJ,EAAE+c,QAAUzjB,OAAO6nB,GACnBnhB,EAAEid,MAAQ3jB,OAAO4nB,GACjBlhB,EAAE1D,KAAOhD,OAAO8nB,QAOlBphB,EAAE+c,QAAUA,EACZ/c,EAAEid,MAAQA,EACVjd,EAAE1D,KAAOA,EAMV,YAHe/D,IAAXyH,EAAE1D,OACL0D,EAAE1D,KAAO,UAEH0D,OAQb/M,EAAO,wBAAwB,CAC7B,OACA,cACA,oBACC,SAAUmkB,EAAWuK,EAAiBC,GAEvC,MAAMtO,EAAIhY,SAEV,MAAO,CACL8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,eACPC,UAAUrE,MACVoE,MAAMiT,IAIXjT,MAAQ,SAAUiT,GAEhB,OADArX,KAAK2oB,OAAStR,EACPrX,MAOTuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAGd,MAAMiK,EAAaxO,EAAE/X,cAAc,OAGnC,OAFAumB,EAAW/mB,UAAUE,IAAI,aAAc,WACvC/B,KAAK2e,MAAQiK,EACNA,GAOTjL,WAAa,WASX,MAAMiL,EAAa5oB,KAAK2e,MAGxB3e,KAAK6oB,aAAQxpB,GAAW,SAAUgd,GAElB,OAAVA,IACFuM,EAAWzmB,YAAYka,EAAMtX,WAC7BsX,EAAMgL,aAKVuB,EAAW/mB,UAAUG,OAAO,YAO9BqV,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUC,EAAQtZ,GAC1B,IAAI9E,EAAQ,QAGGrL,IAAXypB,EACFpe,EAAQ1K,KAAK2oB,OAAOI,YAOpBD,EAAOriB,SAAQ,SAASuf,GACtB,IAEE,MAAMjC,EAAQ2E,EAAexkB,OAAO8hB,GACpCjC,EAAM3gB,KAAO,SACbsH,EAAMvN,KAAK4mB,GAEb,MAAOrlB,GACL,WAMc,GAAhBgM,EAAMpO,QACRkT,EAAG,MAEL,IAEE3P,MAAM4C,IAAIumB,aACRhpB,KAAK2oB,OACL,CAAEM,OAAU,EAAOlF,MAAUrZ,GAG7B,SAAUwe,QAEc7pB,IAAlB6pB,GACF1Z,EAAG,WAG4BnQ,IAA7B6pB,EAAuB,SACzB1Z,EACExP,KAAKmpB,OAASV,EAAgBvkB,OAAOglB,EAAuB,WAGhE9jB,KAAKpF,OAGX,MAAOtB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAWPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAepBtF,EAAO,cAAc,CAAC,SAAU,SAAS,SAAUge,GAEjD,MAAMpV,EAAM9C,MAAM6C,OAIlB,SAAS0mB,EAAM9X,GACb,MAAM8F,EAAMhV,SAASC,cAAc,OACnC+U,EAAIxN,aAAa,QAAQ,OAEzB,MAAMoM,EAAMoB,EAAInV,KAAK,QACrB+T,EAAIpM,aAAa,QAAQ,OACzBoM,EAAI1T,KAAKgP,EAAG,IAEZ,MAAM+F,EAAQD,EAAInV,KAAK,QACvBoV,EAAMzN,aAAa,QAAQ,SAC3ByN,EAAM/U,KAAK,MAEX,MAAM/E,EAAQ6Z,EAAInV,KAAK,QAIvB,OAHA1E,EAAMqM,aAAa,QAAS,SAC5BrM,EAAM+E,KAAKgP,EAAG,IAEP8F,EAKT,OAxBAzU,EAAIsf,eAAiBtf,EAAIsf,gBAAkB,iBAwBpC,CAKL/d,OAAS,WACP,MAAMjJ,EAAMP,OAAOwJ,OAAOlE,MAE1B,OADA/E,EAAI8W,UAAY,GACT9W,GAOT8G,IAAM,SAAUiU,EAAKzY,EAAO6F,GAC1BpD,KAAK+R,UAAUtL,SAAQ,SAAU6K,EAAIvV,EAAGmqB,GAClC5U,EAAG,KAAO0E,GAAO1E,EAAG,KAAO/T,GAC7B2oB,EAAItpB,OAAOb,EAAE,MAGjBiE,KAAK+R,UAAU5U,KAAK,CAAC6Y,EAAKzY,EAAO6F,IACjCpD,KAAKiR,UAOPjP,OAAS,SAAUgU,EAAKzY,GACtB,IAAK,IAAIxB,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAAK,CAC9C,IAAIuV,EAAKtR,KAAK+R,UAAUhW,GACxB,GAAIuV,EAAG,KAAO0E,GAAO1E,EAAG,KAAO/T,EAG7B,OAFAyC,KAAK+R,UAAUnV,OAAOb,EAAG,QACzBiE,KAAKiR,WAWXoY,QAAU,WACR,QAAOrpB,KAAK+R,UAAUzV,OAAS,IAOjCyI,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAId,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAO5C,OANA3D,EAAEmD,UAAUE,IAAI,KAAM,YAGtBrD,EAAEuD,KAAK,QAAQK,KAAKK,EAAIsf,eAAiB,KACzCjiB,KAAKspB,MAAQ5qB,EAAEuD,KAAK,OAEbvD,GAOT6qB,UAAY,WACV,OAAOvpB,KAAK+R,UAAU3V,KACpB,SAAUiR,GACR,MAAM+J,EAAMW,EAAS7T,SAKrB,OAJAkT,EAAIpB,IAAI3I,EAAK,IACb+J,EAAIhB,QAAQ,MACZgB,EAAI7Z,MAAM8P,EAAK,IACf+J,EAAIhU,KAAiB,SAAZiK,EAAK,GAAgB,OAAS,UAChC+J,MASbnG,OAAS,WASP,IAAIiB,EACJ,MAAMsO,EAAIxgB,KAAK+R,UAAUzV,OAErBkkB,EAAI,GACNtO,EAAO9P,SAASC,cAAc,OAC9B6P,EAAKtI,aAAa,QAAQ,YAC1BsI,EAAKtI,aAAa,iBAAkB,OACpC5J,KAAK+R,UAAUtL,QAAQ1K,GAAKmW,EAAK/P,YAAYinB,EAAKrtB,MAGtC,GAALykB,IACPtO,EAAOkX,EAAKppB,KAAK+R,UAAU,KAI7B/R,KAAK+E,UAEL,MAAMrG,EAAIsB,KAAKspB,MASf,OARU,IAAN9I,EACF7f,EAAgBjC,GAETA,EAAEmC,WACTnC,EAAEoH,aAAaoM,EAAMxT,EAAEmC,YAEvBnC,EAAEyD,YAAY+P,GAETlS,MAOTwS,QAAU,WAER,OAA8B,IAA1BxS,KAAK+R,UAAUzV,OACV,GAEF0D,KAAK+R,UAAU3V,KACpB,SAAUiR,GACR,MAAgB,SAAZA,EAAK,GACAA,EAAK,GAAK,OAASA,EAAK,GAE1BA,EAAK,GAAK,MAAQ,IAAIhN,OAAOgN,EAAK,IAAI/M,WAE/CzD,KAAK,YAOb9C,EAAO,sBAAsB,CAAC,cAAe,SAAS,SAAUyvB,GAE9D,MAAO,CAKLtlB,OAAS,SAAUulB,GACjB,OAAO/uB,OAAOwJ,OAAOlE,MAAMoE,MAAMqlB,IAKnCrlB,MAAQ,SAAUqlB,GAChB,MAAM3iB,EAAI9G,KAGV,QAAaX,IAAToqB,EACF,MAAM,IAAIhsB,MAAM,sBAEb,KAAMgsB,aAAgB9E,MACzB,MAAM,IAAIlnB,MAAM,oBAelB,OAXAqJ,EAAE4iB,IAAM,GAGR5iB,EAAE6iB,MAAQF,EAQN5pB,MAAM+pB,MAAQ/pB,MAAM+pB,KAA4B,uBAClD9iB,EAAE6iB,MAAM9nB,UAAUE,IAAI,gBACf+E,IAGTA,EAAE6iB,MAAM7f,iBACN,QAAShD,EAAE+iB,YAAYzkB,KAAK0B,IAAI,GAGlCA,EAAEgjB,UAAYN,EAAgBtlB,SAE9B4C,EAAEgjB,UAAU/kB,UAAU+E,iBACpB,QAAShD,EAAEijB,YAAY3kB,KAAK0B,IAAI,GAG3BA,IAOTijB,YAAc,SAAUrrB,GAItB,GAHIA,GACFA,EAAEuB,kBAEAD,KAAK8pB,UAAUT,UACjB,OAEF,MAAMnU,EAAKrV,MAAMqV,GACjB,GAAKA,EAAL,CAKA,IAAK,MAAMkC,KAAOpX,KAAK8pB,UAAUP,YAC/BrU,EAAGkM,YAAYhK,GAGZlC,EAAG6L,UACN7L,EAAG8L,OAGLphB,OAAO4mB,SAAS,EAAG,QAZjBjjB,QAAQJ,IAAI,8BAiBhB0mB,YAAc,SAAUnrB,GAEtB,GADAA,EAAEuB,kBACEvB,EAAE4lB,SAAW5lB,EAAE2mB,cACjB,OAIF,MAAMf,EAAS5lB,EAAE4lB,OAEjB,IAAItO,EAAKzY,EAAO6F,EAiBhB,GAduB,OAAnBkhB,EAAOkB,SACTpiB,EAAOkhB,EAAOyD,aAAa,aAC3B/R,EAAOsO,EAAO0F,uBAAuBvF,UACrClnB,EAAQ+mB,EAAOG,WAIW,QAAnBH,EAAOkB,UACdpiB,EAAOkhB,EAAOze,WAAWkiB,aAAa,aACtC/R,EAAMsO,EAAOze,WAAWmkB,uBAAuBvF,UAC/ClnB,EAAQ+mB,EAAOG,WAIJ,eAATrhB,GAAkC,qBAATA,IAG7BA,EAAOA,GAAQ,cAGX4S,GAAOzY,GAAO,CAChB,MAAMuJ,EAAI9G,KACNskB,EAAOziB,UAAUC,SAAS,WAC5BwiB,EAAOziB,UAAUG,OAAO,UACxB8E,EAAE9E,OAAOgU,EAAKzY,KAGd+mB,EAAOziB,UAAUE,IAAI,UACrB+E,EAAE/E,IAAIiU,EAAKzY,EAAO6F,IAKf0D,EAAEgjB,UAAUT,UASfviB,EAAE6iB,MAAM9jB,WAAW/E,YACjBgG,EAAEgjB,UAAU/kB,WATd+B,EAAE6iB,MAAM9jB,WAAWa,aACjBI,EAAEgjB,UAAU/kB,UACZ+B,EAAE6iB,MAAM/D,eAgBhB7jB,IAAM,SAAUiU,EAAKzY,EAAO6F,GAC1BA,EAAOA,EAAK3G,QAAQ,SAAU,IAC9BuD,KAAK8pB,UAAU/nB,IAAIiU,EAAKzY,EAAO6F,IAOjCpB,OAAS,SAAUgU,EAAKzY,GACtByC,KAAK8pB,UAAU9nB,OAAOgU,EAAKzY,IAM7BiV,QAAU,WACR,OAAOxS,KAAK8pB,UAAUtX,eAkB5BzY,EAAO,oBAAoB,IAAG,WAE5B,MAAMkwB,EAAQ,IAAI7pB,OAAO,gDACnB8pB,EAAQ,IAAI9pB,OAAO,4BAEzB,MAAO,CAKL8D,OAAS,SAAUimB,GACjB,OAAOzvB,OAAOwJ,OAAOlE,MAAMoE,MAAM+lB,IAInC/lB,MAAQ,SAAU+lB,GAChB,MAAMrjB,EAAI9G,KAKV,GAFAmqB,EAAMC,mBAAmBD,IAEpBF,EAAMnC,KAAKqC,GACd,OAEFrjB,EAAEujB,QAAUjqB,OAAO4nB,GAEnB,IAAI5rB,EAAM,GACNkuB,EAAQ,EA8BZ,OA7BAxjB,EAAEyjB,QAAS,EACXzjB,EAAE0jB,QAAS,EACX1jB,EAAE2jB,YAAc,aAGhBrqB,OAAO6nB,GAAG9rB,MAAM,SAASC,IAAI,SAAUiR,GACrC,MAAMvG,EAAI9G,MAGLsqB,KAAWjd,EAAKgK,MAAM,sBACzBvQ,EAAE2jB,YAAcpd,EAEH,6BAATA,IACFvG,EAAE0jB,QAAS,IAIgB,UAAtBnd,EAAK9L,eACZuF,EAAEyjB,QAAS,EACXzjB,EAAEujB,QAAUzqB,OAAO8qB,KAAK5jB,EAAEujB,UAInBH,EAAMpC,KAAKza,KAClBjR,EAAIgE,OAAO6nB,IAAM7nB,OAAO4nB,KAE1B5iB,KAAK0B,IAEPA,EAAEc,MAAQxL,EACH0K,GAOTygB,OAAS,WACP,GAAIvnB,KAAKwqB,OAAQ,CACf,MAAMlb,EAAQtP,KAAK4H,MAAa,OAAK5H,KAAKqqB,QACpC1W,EAAIvR,SAASC,cAAc,KAIjC,OAHAsR,EAAE/J,aAAa,OAAQ5J,KAAKqqB,SAC5B1W,EAAE/J,aAAa,MAAO,uBACtB+J,EAAErR,KAAKgN,GACAqE,EAGT,OAAOvR,SAASI,eAAexC,KAAKqqB,cAO1CtwB,EAAO,aAAa,CAAC,sBAAsB,oBAAoB,SAAS,SAAU4wB,EAAUC,GAG1F,MAAMjoB,EAAQ9C,MAAM6C,OAGpB,OAFAC,EAAIkoB,SAAWloB,EAAIkoB,UAAY,WAExB,CAKL3mB,OAAS,SAAUmT,EAAOyT,GACxB,OAAOpwB,OAAOwJ,OAAOlE,MAAMoE,MAAMiT,EAAOyT,IAO1C1mB,MAAQ,SAAUiT,EAAOyT,GAGvB,OAFA9qB,KAAK2oB,OAAStR,EACdrX,KAAK+qB,QAAUD,EACR9qB,MAOTqX,MAAQ,WACN,OAAOrX,KAAK2oB,QAOd5jB,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAEd,GAAqB,OAAjBjF,KAAK+qB,QACP,OAEF,MAAMC,EAAS5oB,SAASC,cAAc,MACtC2oB,EAAOnpB,UAAUE,IAAI,QAErB/B,KAAKiF,IAAM+lB,EAEX,MAAMF,EAAS9qB,KAAK+qB,QAIdE,EAAiB,GA2DvB,OA1DAH,EAAOrkB,QAAQ,CAACpI,EAAEtC,IAAMkvB,EAAe5sB,EAAO,KAAKtC,GAKnDrB,OAAOqf,KAAKkR,GAAgBzG,OAAO/d,SAAQ,SAASwP,GAClD,IAEIiV,EAAOC,EAAIC,EAAWC,EAAQC,EAF9BC,EAAQT,EAAOG,EAAehV,IAKxB,QAANA,GACM,aAANA,GACM,UAANA,GACM,WAANA,GACM,eAANA,IAEFiV,EAAQ9oB,SAASC,cAAc,OAE/B8oB,EAAKD,EAAMjpB,KAAK,MAChBkpB,EAAG7oB,KAAK2T,GACRkV,EAAGvhB,aAAa,QAASqM,GAEzBmV,EAAYG,EAAa,MACzBF,EAASH,EAAMjpB,KAAK,MACpBopB,EAAOzhB,aAAa,YAAa2hB,EAAY,MAE1CH,aAAqB1f,OACvB2f,EAAOxpB,UAAUE,IAAI,iBACpBqpB,EAAU3kB,SAAQ,SAAS+kB,GACH,qBAAlBD,EAAY,MACdD,EAAMV,EAAS1mB,OAAOsnB,GAClBF,GACHD,EAAOppB,KAAK,OAAOE,YAAYmpB,EAAI/D,WAGrC8D,EAAOppB,KAAK,OAAOK,KAAKkpB,OAKL,qBAAlBD,EAAY,MACdD,EAAMV,EAAS1mB,OAAOqnB,EAAa,OAC/BD,GACFD,EAAOlpB,YAAYmpB,EAAI/D,WAGzB8D,EAAO/oB,KAAKipB,EAAa,OAI7BP,EAAO7oB,YAAY+oB,OAKvBlrB,KAAKyrB,eAAiBd,EAASzmB,OAAOlE,KAAKiF,KAEpCjF,KAAKiF,SAOlBlL,EAAO,kBAAkB,CACvB,OACA,eACC,SAAUmkB,EAAWwN,GAEZtpB,SAEV,MAAO,CACL8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,cACPC,UAAUrE,MACVoE,MAAMiT,IAIXjT,MAAQ,SAAUiT,GAEhB,OADArX,KAAK2oB,OAAStR,EACPrX,MAOTuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAMgN,EAAYvpB,SAASC,cAAc,OAiBzC,OAhBAspB,EAAU9pB,UAAUE,IAAI,YAAa,WAErC/B,KAAK6oB,SAAQ,SAAUY,GACR,OAATA,IAIJkC,EAAU9pB,UAAUG,OAAO,WAC3B2pB,EAAUxpB,YAAYsnB,EAAK1kB,eAQtB/E,KAAK2e,MAAQgN,GAOtBtU,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUrZ,GAElB,MAAM6H,EAAQrX,KAAK2oB,OACnB,IACE9oB,MAAM4C,IAAImpB,YACRvU,EAAO,IAAI,SAAUwU,GAEnB,QAAqBxsB,IAAjBwsB,EAEF,YADArc,EAAG,MAIL,MAAM4H,EAAMyU,EAAuB,SACnC,QAAYxsB,IAAR+X,EAEF,YADA5H,EAAG,MAIL,MAAMsb,EAAS1T,EAAY,OAO3B5H,OANenQ,IAAXyrB,EAMDY,EAAexnB,OAChBmT,EAAOyT,GANJ,SAWX,MAAOpsB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAMPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAKnB,SAASX,GAAG,GAAG,iBAAiBD,SAAS,oBAAoBE,OAAOA,OAAOF,QAAQC,SAAS,GAAG,mBAAmB3E,GAAQA,EAAO2F,IAAI3F,EAAO,YAAY,GAAG2E,OAAO,CAAC,IAAIL,EAAE,oBAAoBuB,OAAOvB,EAAEuB,OAAO,oBAAoBksB,OAAOztB,EAAEytB,OAAO,oBAAoBC,OAAO1tB,EAAE0tB,MAAM1tB,EAAE2tB,MAAMttB,KAA5R,EAAkS,WAAqC,OAAO,SAAUA,EAAEoI,EAAExI,EAAEgW,GAAG,SAAS/K,EAAE0iB,EAAEC,GAAG,IAAI5tB,EAAE2tB,GAAG,CAAC,IAAInlB,EAAEmlB,GAAG,CAAC,IAAItY,EAAkB,mBAAT7Z,GAAqBA,EAAQ,IAAIoyB,GAAGvY,EAAE,OAAOA,EAAEsY,GAAE,GAAI,GAAGlwB,EAAE,OAAOA,EAAEkwB,GAAE,GAAI,IAAI5tB,EAAE,IAAIZ,MAAM,uBAAuBwuB,EAAE,KAAK,MAAM5tB,EAAE8tB,KAAK,mBAAmB9tB,EAAE,IAAImiB,EAAEliB,EAAE2tB,GAAG,CAACxtB,QAAQ,IAAIqI,EAAEmlB,GAAG,GAAG9wB,KAAKqlB,EAAE/hB,SAAQ,SAASC,GAAG,IAAIJ,EAAEwI,EAAEmlB,GAAG,GAAGvtB,GAAG,OAAO6K,EAAEjL,GAAII,KAAI8hB,EAAEA,EAAE/hB,QAAQC,EAAEoI,EAAExI,EAAEgW,GAAG,OAAOhW,EAAE2tB,GAAGxtB,QAAkD,IAA1C,IAAI1C,EAAkB,mBAATjC,GAAqBA,EAAgBmyB,EAAE,EAAEA,EAAE3X,EAAEhY,OAAO2vB,IAAI1iB,EAAE+K,EAAE2X,IAAI,OAAO1iB,EAAvb,CAA2b,CAAC6iB,EAAE,CAAC,SAAStyB,EAAQ6E,EAAOF,GAuBtyBE,EAAOF,QAAU,CACf4tB,SAAUvyB,EAAQ,kBAElBwyB,OAAQxyB,EAAQ,gBAChByyB,MAAOzyB,EAAQ,eACf0yB,KAAM,CACJC,KAAM3yB,EAAQ,cAAc2yB,KAC5BC,OAAQ5yB,EAAQ,cAAc4yB,QAEhCC,QAAS7yB,EAAQ,mBAGjB,CAAC8yB,cAAc,EAAEC,iBAAiB,EAAEC,eAAe,EAAEC,aAAa,GAAGC,gBAAgB,KAAKC,EAAE,CAAC,SAASnzB,EAAQ6E,EAAOF,GAGvH,IAAIyuB,EAAIpzB,EAAQ,YACZqzB,EAAYrzB,EAAQ,gBAExB6E,EAAOF,QAAU,CACf2uB,IAIF,SAAaC,GACX,IAAIC,EAA+B,WAAxBD,EAAEE,QAAQC,UACLL,EAAUE,EAU1B,SAAkBA,GAChB,OAAO,SAAS3uB,GACd,OAAO2uB,EAAEI,KAAK/uB,GAAGgvB,QAZQC,CAASN,IAiBxC,SAAgBA,GACd,IAAIC,EAAM,GACNM,EAAQ,GACRC,EAAU,GAEd,SAASC,EAAI/pB,GACPmpB,EAAEa,IAAIF,EAAS9pB,KAGnB8pB,EAAQ9pB,IAAK,EACb6pB,EAAM7pB,IAAK,EACXmpB,EAAEc,KAAKX,EAAEY,SAASlqB,IAAI,SAASrF,GACzBwuB,EAAEa,IAAIH,EAAOlvB,EAAEwvB,GACjBZ,EAAInwB,KAAKuB,GAETovB,EAAIpvB,EAAEwvB,aAGHN,EAAM7pB,IAIf,OADAmpB,EAAEc,KAAKX,EAAEc,QAASL,GACXR,EAtCSc,CAAOf,GACvBH,EAAEc,KAAKV,GAAK,SAAS5uB,GACnB,IAAI2vB,EAAQhB,EAAEI,KAAK/uB,GACnB2uB,EAAEiB,WAAW5vB,GACb2vB,EAAME,YAAc7vB,EAAErD,KACtBgzB,EAAMG,UAAW,EACjBnB,EAAEoB,QAAQ/vB,EAAEwvB,EAAGxvB,EAAEqF,EAAGsqB,EAAOnB,EAAEwB,SAAS,YAZxCC,KA+CF,SAActB,GACZH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI2vB,EAAQhB,EAAEI,KAAK/uB,GACnB,GAAI2vB,EAAMG,SAAU,CAClBnB,EAAEiB,WAAW5vB,GAEb,IAAI6vB,EAAcF,EAAME,mBACjBF,EAAMG,gBACNH,EAAME,YACblB,EAAEoB,QAAQ/vB,EAAEwvB,EAAGxvB,EAAEqF,EAAGsqB,EAAOE,UAK/B,CAACM,eAAe,EAAEC,WAAW,KAAKC,EAAE,CAAC,SAASj1B,EAAQ6E,EAAOF,GAC/D,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UA2BnB,SAASk1B,EAAc3B,EAAGnyB,EAAMyC,EAAQsxB,EAAIC,EAAQC,GAClD,IAAId,EAAQ,CAAEe,MAAO,EAAG1lB,OAAQ,EAAGylB,KAAMA,GACrCviB,EAAOsiB,EAAOh0B,GAAMi0B,EAAO,GAC3BE,EAAO7C,EAAK8C,aAAajC,EAAG,SAAUgB,EAAO1wB,GACjDuxB,EAAOh0B,GAAMi0B,GAAQE,EACrBhC,EAAEkC,UAAUF,EAAMJ,GACdriB,GACFygB,EAAEoB,QAAQ7hB,EAAMyiB,EAAM,CAAE3B,OAAQ,IAhCpC/uB,EAAOF,QAEP,SAA2B4uB,GAoBzBH,EAAEc,KAAKX,EAAE7nB,YAnBT,SAASsoB,EAAI/pB,GACX,IAAIyB,EAAW6nB,EAAE7nB,SAASzB,GACtBnD,EAAOysB,EAAEzsB,KAAKmD,GAKlB,GAJIyB,EAASlJ,QACX4wB,EAAEc,KAAKxoB,EAAUsoB,GAGfZ,EAAEa,IAAIntB,EAAM,WAAY,CAC1BA,EAAK4uB,WAAa,GAClB5uB,EAAK6uB,YAAc,GACnB,IAAK,IAAIN,EAAOvuB,EAAK8uB,QAASC,EAAU/uB,EAAK+uB,QAAU,EAClDR,EAAOQ,IACLR,EACLH,EAAc3B,EAAG,aAAc,MAAOtpB,EAAGnD,EAAMuuB,GAC/CH,EAAc3B,EAAG,cAAe,MAAOtpB,EAAGnD,EAAMuuB,SAmBtD,CAACL,WAAW,GAAGc,SAAS,KAAKC,EAAE,CAAC,SAAS/1B,EAAQ6E,EAAOF,GAG1D,IAAIyuB,EAAIpzB,EAAQ,YA0BhB,SAASg2B,EAAgBzC,GACvBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKgsB,EAAmB1C,EAAEzsB,KAAKmD,OAC1DmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GAAKqxB,EAAmB1C,EAAEI,KAAK/uB,OAG5D,SAASqxB,EAAmBC,GAC1B,IAAI9B,EAAI8B,EAAMZ,MACdY,EAAMZ,MAAQY,EAAMtmB,OACpBsmB,EAAMtmB,OAASwkB,EAejB,SAAS+B,EAAYD,GACnBA,EAAME,GAAKF,EAAME,EAenB,SAASC,EAAUH,GACjB,IAAII,EAAIJ,EAAMI,EACdJ,EAAMI,EAAIJ,EAAME,EAChBF,EAAME,EAAIE,EAlEZzxB,EAAOF,QAAU,CACf4xB,OAIF,SAAgBhD,GACd,IAAIiD,EAAUjD,EAAEE,QAAQgD,QAAQhvB,cAChB,OAAZ+uB,GAAgC,OAAZA,GACtBR,EAAgBzC,IANlBsB,KAUF,SAActB,GACZ,IAAIiD,EAAUjD,EAAEE,QAAQgD,QAAQhvB,cAChB,OAAZ+uB,GAAgC,OAAZA,GAqB1B,SAAkBjD,GAChBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKksB,EAAY5C,EAAEzsB,KAAKmD,OAEnDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,OAAQ0jB,GAChB/C,EAAEa,IAAIN,EAAM,MACdwC,EAAYxC,MA3Bd+C,CAASnD,GAGK,OAAZiD,GAAgC,OAAZA,KAiC1B,SAAgBjD,GACdH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKosB,EAAU9C,EAAEzsB,KAAKmD,OAEjDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,OAAQ4jB,GAChBjD,EAAEa,IAAIN,EAAM,MACd0C,EAAU1C,MAvCZgD,CAAOpD,GACPyC,EAAgBzC,OAiDlB,CAACyB,WAAW,KAAK4B,EAAE,CAAC,SAAS52B,EAAQ6E,EAAOF,GAQ9C,SAASkyB,IACP,IAAIC,EAAW,GACfA,EAASC,MAAQD,EAASE,MAAQF,EAClC5wB,KAAK+wB,UAAYH,EAkCnB,SAASI,EAAOC,GACdA,EAAMH,MAAMD,MAAQI,EAAMJ,MAC1BI,EAAMJ,MAAMC,MAAQG,EAAMH,aACnBG,EAAMJ,aACNI,EAAMH,MAGf,SAASI,EAAejb,EAAGlS,GACzB,GAAU,UAANkS,GAAuB,UAANA,EACnB,OAAOlS,EAhDXpF,EAAOF,QAAUkyB,EAQjBA,EAAKh2B,UAAUw2B,QAAU,WACvB,IAAIP,EAAW5wB,KAAK+wB,UAChBE,EAAQL,EAASE,MACrB,GAAIG,IAAUL,EAEZ,OADAI,EAAOC,GACAA,GAIXN,EAAKh2B,UAAUy2B,QAAU,SAASH,GAChC,IAAIL,EAAW5wB,KAAK+wB,UAChBE,EAAMH,OAASG,EAAMJ,OACvBG,EAAOC,GAETA,EAAMJ,MAAQD,EAASC,MACvBD,EAASC,MAAMC,MAAQG,EACvBL,EAASC,MAAQI,EACjBA,EAAMH,MAAQF,GAGhBD,EAAKh2B,UAAUyG,SAAW,WAIxB,IAHA,IAAIiwB,EAAO,GACPT,EAAW5wB,KAAK+wB,UAChB1B,EAAOuB,EAASE,MACbzB,IAASuB,GACdS,EAAKl0B,KAAKm0B,KAAKC,UAAUlC,EAAM6B,IAC/B7B,EAAOA,EAAKyB,MAEd,MAAO,IAAMO,EAAKx0B,KAAK,MAAQ,MAgB/B,IAAI20B,EAAE,CAAC,SAAS13B,EAAQ6E,EAAOF,GACjC,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UACf23B,EAAQ33B,EAAQ,cAAc23B,MAElC9yB,EAAOF,QAAU,CACfizB,cAIF,SAAuBrE,GACrB,IAAIsE,EAAcnF,EAAKoF,iBAAiBvE,GAEpCwE,EAAI,IAAIJ,EAAM,CAAEK,UAAU,EAAMC,YAAY,IAAQC,SAAS,IAoBjE,OAlBA9E,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB8tB,EAAEI,QAAQluB,EAAG,CAAEsqB,MAAOtqB,IACtB8tB,EAAEtC,UAAUxrB,EAAG,QAAUspB,EAAEzsB,KAAKmD,GAAGorB,SAGrCjC,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzBmzB,EAAEpD,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG,GAAIxvB,EAAErD,SAG5B6xB,EAAEc,KAAK2D,GAAa,SAAS5N,EAAOhoB,GAClC,IAAIm2B,EAAS,QAAUn2B,EACvB81B,EAAEI,QAAQC,EAAQ,CAAE/C,KAAM,SAC1BjC,EAAEiF,OAAOpO,GAAO,SAASmI,EAAGnoB,GAE1B,OADA8tB,EAAEpD,QAAQvC,EAAGnoB,EAAG,CAAEoF,MAAO,UAClBpF,QAIJ8tB,KAGP,CAACO,aAAa,EAAEtD,WAAW,GAAGc,SAAS,KAAKyC,EAAE,CAAC,SAASv4B,EAAQ6E,EAAOF,GAGzE,IAAI4tB,EAEJ,GAAIvyB,EACF,IACEuyB,EAAWvyB,EAAQ,YACnB,MAAO4E,IAGN2tB,IACHA,EAAWzsB,OAAOysB,UAGpB1tB,EAAOF,QAAU4tB,GAEf,CAACA,SAAW,KAAKiG,EAAE,CAAC,SAASx4B,EAAQ6E,EAAOF,GAC9C,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,cAAc23B,MAC9Bd,EAAO72B,EAAQ,eASnB6E,EAAOF,QAIP,SAAmB4uB,EAAGM,GACpB,GAAIN,EAAEkF,aAAe,EACnB,MAAO,GAET,IAAIziB,EA4DN,SAAoBud,EAAGM,GACrB,IAAI6E,EAAW,IAAIf,EACfgB,EAAQ,EACRC,EAAS,EAEbxF,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzByuB,EAASP,QAAQluB,EAAG,CAAEA,EAAGA,EAAG4uB,GAAM,EAAGC,IAAK,OAK5C1F,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAIm0B,EAAaL,EAAS/E,KAAK/uB,EAAEqF,EAAGrF,EAAEwvB,IAAM,EACxCR,EAASC,EAASjvB,GAClBo0B,EAAaD,EAAanF,EAC9B8E,EAAS/D,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG4E,GAC3BJ,EAASK,KAAKC,IAAIN,EAAQF,EAAS5xB,KAAKlC,EAAEqF,GAAG6uB,KAAOlF,GACpD+E,EAASM,KAAKC,IAAIP,EAAQD,EAAS5xB,KAAKlC,EAAEwvB,GAAO,IAAMR,MAGzD,IAAIuF,EAAU/F,EAAEgG,MAAMR,EAASD,EAAQ,GAAGr2B,KAAI,WAAa,OAAO,IAAIu0B,KAClEwC,EAAUV,EAAQ,EAMtB,OAJAvF,EAAEc,KAAKwE,EAASrE,SAAS,SAASpqB,GAChCqvB,EAAaH,EAASE,EAASX,EAAS5xB,KAAKmD,OAGxC,CAAEwpB,MAAOiF,EAAUS,QAASA,EAASE,QAASA,GAvFzCE,CAAWhG,EAAGM,GAAY2F,GAClCC,EAQN,SAAqBlG,EAAG4F,EAASE,GAC/B,IAIIlC,EAJAsC,EAAU,GACVC,EAAUP,EAAQA,EAAQ32B,OAAS,GACnCm3B,EAAQR,EAAQ,GAGpB,KAAO5F,EAAEkF,aAAa,CACpB,KAAQtB,EAAQwC,EAAMtC,WAAgBuC,EAAWrG,EAAG4F,EAASE,EAASlC,GACtE,KAAQA,EAAQuC,EAAQrC,WAAcuC,EAAWrG,EAAG4F,EAASE,EAASlC,GACtE,GAAI5D,EAAEkF,YACJ,IAAK,IAAIx2B,EAAIk3B,EAAQ32B,OAAS,EAAGP,EAAI,IAAKA,EAExC,GADAk1B,EAAQgC,EAAQl3B,GAAGo1B,UACR,CACToC,EAAUA,EAAQ52B,OAAO+2B,EAAWrG,EAAG4F,EAASE,EAASlC,GAAO,IAChE,OAMR,OAAOsC,EA5BOI,CAAY7jB,EAAMyd,MAAOzd,EAAMmjB,QAASnjB,EAAMqjB,SAG5D,OAAOjG,EAAE0G,QAAQ1G,EAAE9wB,IAAIm3B,GAAS,SAAS70B,GACvC,OAAO2uB,EAAEY,SAASvvB,EAAEqF,EAAGrF,EAAEwvB,OACvB,IAZN,IAAIoF,EAAoBpG,EAAE2G,SAAS,GAsCnC,SAASH,EAAWrG,EAAG4F,EAASE,EAASlC,EAAO6C,GAC9C,IAAIP,EAAUO,EAAsB,QAAKz0B,EAwBzC,OAtBA6tB,EAAEc,KAAKX,EAAE0G,QAAQ9C,EAAMltB,IAAI,SAAS0pB,GAClC,IAAIC,EAASL,EAAEI,KAAKA,GAChBuG,EAAS3G,EAAEzsB,KAAK6sB,EAAK1pB,GAErB+vB,GACFP,EAAQp2B,KAAK,CAAE4G,EAAG0pB,EAAK1pB,EAAGmqB,EAAGT,EAAKS,IAGpC8F,EAAOpB,KAAOlF,EACd0F,EAAaH,EAASE,EAASa,MAGjC9G,EAAEc,KAAKX,EAAEY,SAASgD,EAAMltB,IAAI,SAAS0pB,GACnC,IAAIC,EAASL,EAAEI,KAAKA,GAChBS,EAAIT,EAAKS,EACT+F,EAAS5G,EAAEzsB,KAAKstB,GACpB+F,EAAW,IAAKvG,EAChB0F,EAAaH,EAASE,EAASc,MAGjC5G,EAAEqG,WAAWzC,EAAMltB,GAEZwvB,EAiCT,SAASH,EAAaH,EAASE,EAASlC,GACjCA,EAAM2B,IAEC3B,EAAU,GAGpBgC,EAAQhC,EAAM2B,IAAM3B,EAAU,GAAIkC,GAAS/B,QAAQH,GAFnDgC,EAAQA,EAAQ32B,OAAS,GAAG80B,QAAQH,GAFpCgC,EAAQ,GAAG7B,QAAQH,KAQrB,CAACiD,cAAc,EAAE9B,aAAa,EAAEtD,WAAW,KAAKqF,EAAE,CAAC,SAASr6B,EAAQ6E,EAAOF,GAG7E,IAAIyuB,EAAIpzB,EAAQ,YACZs6B,EAAUt6B,EAAQ,aAClBsB,EAAYtB,EAAQ,eACpBq1B,EAAOr1B,EAAQ,UACfu6B,EAAiBv6B,EAAQ,UAAUu6B,eACnCC,EAAoBx6B,EAAQ,yBAC5By6B,EAAmBz6B,EAAQ,UAAUy6B,iBACrCC,EAAe16B,EAAQ,mBACvB26B,EAAoB36B,EAAQ,yBAC5B46B,EAAmB56B,EAAQ,uBAC3B66B,EAAQ76B,EAAQ,WAChBmS,EAAWnS,EAAQ,cACnB0yB,EAAO1yB,EAAQ,UACf23B,EAAQ33B,EAAQ,cAAc23B,MAElC9yB,EAAOF,QAEP,SAAgB4uB,EAAGuH,GACjB,IAAInI,EAAOmI,GAAQA,EAAKC,YAAcrI,EAAKC,KAAOD,EAAKE,OACvDD,EAAK,UAAU,WACb,IAAIqI,EAAcrI,EAAK,sBACI,WAAa,OA2F5C,SAA0BsI,GACxB,IAAI1H,EAAI,IAAIoE,EAAM,CAAEM,YAAY,EAAMD,UAAU,IAC5CvE,EAAQyH,EAAaD,EAAWxH,SAqBpC,OAnBAF,EAAE2E,SAAS9E,EAAE+H,MAAM,GACjBC,EACAC,EAAkB5H,EAAO6H,GACzBlI,EAAEmI,KAAK9H,EAAO+H,KAEhBpI,EAAEc,KAAK+G,EAAW5G,SAAS,SAASpqB,GAClC,IAAInD,EAAOo0B,EAAaD,EAAWn0B,KAAKmD,IACxCspB,EAAE4E,QAAQluB,EAAGmpB,EAAEqI,SAASJ,EAAkBv0B,EAAM40B,GAAeC,IAC/DpI,EAAEkC,UAAUxrB,EAAGgxB,EAAWzkB,OAAOvM,OAGnCmpB,EAAEc,KAAK+G,EAAWnG,SAAS,SAASlwB,GAClC,IAAI+uB,EAAOuH,EAAaD,EAAWtH,KAAK/uB,IACxC2uB,EAAEoB,QAAQ/vB,EAAGwuB,EAAE+H,MAAM,GACnBS,EACAP,EAAkB1H,EAAMkI,GACxBzI,EAAEmI,KAAK5H,EAAMmI,QAGVvI,EAlH0CwI,CAAiBxI,MAChEZ,EAAK,eAAsB,YAK/B,SAAmBY,EAAGZ,GACpBA,EAAK,8BAA8B,YAsHrC,SAAgCY,GAC9B,IAAIE,EAAQF,EAAEE,QACdA,EAAMuI,SAAW,EACjB5I,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB+uB,EAAKsI,QAAU,EACqB,MAAhCtI,EAAKuI,SAASz0B,gBACM,OAAlBgsB,EAAMgD,SAAsC,OAAlBhD,EAAMgD,QAClC9C,EAAK2B,OAAS3B,EAAKwI,YAEnBxI,EAAK/jB,QAAU+jB,EAAKwI,gBAhIsBC,CAAuB7I,MACvEZ,EAAK,uBAA8B,YAmSrC,SAAyBY,GACvBH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,GAAIA,EAAEqF,IAAMrF,EAAEwvB,EAAG,CACf,IAAIttB,EAAOysB,EAAEzsB,KAAKlC,EAAEqF,GACfnD,EAAKu1B,YACRv1B,EAAKu1B,UAAY,IAEnBv1B,EAAKu1B,UAAUh5B,KAAK,CAAEuB,EAAGA,EAAG2vB,MAAOhB,EAAEI,KAAK/uB,KAC1C2uB,EAAEiB,WAAW5vB,OA3S+B03B,CAAgB/I,MAChEZ,EAAK,eAA8B,WAAa2H,EAAQhH,IAAIC,MAC5DZ,EAAK,wBAA8B,WAAa+H,EAAapH,IAAIC,MACjEZ,EAAK,YAA8B,WAAa0C,EAAK3C,EAAK6J,mBAAmBhJ,OAC7EZ,EAAK,8BAA8B,YAuIrC,SAAgCY,GAC9BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB,GAAI+uB,EAAK2B,OAAS3B,EAAK/jB,OAAQ,CAC7B,IAAI3F,EAAIspB,EAAEzsB,KAAKlC,EAAEqF,GAEbsqB,EAAQ,CAAEc,MADN9B,EAAEzsB,KAAKlC,EAAEwvB,GACMiB,KAAOprB,EAAEorB,MAAQ,EAAIprB,EAAEorB,KAAMzwB,EAAGA,GACvD8tB,EAAK8C,aAAajC,EAAG,aAAcgB,EAAO,WA9IEiI,CAAuBjJ,MACvEZ,EAAK,wBAA8B,WAAa8H,EAAiBlH,MACjEZ,EAAK,4BAA8B,WAAa+H,EAAa+B,QAAQlJ,MACrEZ,EAAK,sBAA8B,WAAa4H,EAAehH,MAC/DZ,EAAK,wBAA8B,YA+IrC,SAA0BY,GACxB,IAAIsC,EAAU,EACdzC,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdnD,EAAK41B,YACP51B,EAAK8uB,QAAUrC,EAAEzsB,KAAKA,EAAK41B,WAAWrH,KACtCvuB,EAAK+uB,QAAUtC,EAAEzsB,KAAKA,EAAK61B,cAActH,KACzCQ,EAAUzC,EAAE8F,IAAIrD,EAAS/uB,EAAK+uB,aAGlCtC,EAAEE,QAAQoC,QAAUA,EAzJ4B+G,CAAiBrJ,MACjEZ,EAAK,8BAA8B,YA2JrC,SAAgCY,GAC9BH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACC,eAAfnD,EAAK+1B,QACPtJ,EAAEI,KAAK7sB,EAAKlC,GAAGk4B,UAAYh2B,EAAKuuB,KAChC9B,EAAEqG,WAAW3vB,OAhK+B8yB,CAAuBxJ,MACvEZ,EAAK,qBAA8B,WAAarxB,EAAUgyB,IAAIC,MAC9DZ,EAAK,yBAA8B,WAAa6H,EAAkBjH,MAClEZ,EAAK,yBAA8B,WAAagI,EAAkBpH,MAClEZ,EAAK,aAA8B,WAAakI,EAAMtH,MACtDZ,EAAK,uBAA8B,YAkSrC,SAAyBY,GACvB,IAAIyJ,EAAStK,EAAKoF,iBAAiBvE,GACnCH,EAAEc,KAAK8I,GAAQ,SAAS/S,GACtB,IAAIgT,EAAa,EACjB7J,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxB,IAAI6E,EAAOysB,EAAEzsB,KAAKmD,GAClBnD,EAAK+zB,MAAQ54B,EAAIg7B,EACjB7J,EAAEc,KAAKptB,EAAKu1B,WAAW,SAASa,GAC9BxK,EAAK8C,aAAajC,EAAG,WAAY,CAC/B+B,MAAO4H,EAAS3I,MAAMe,MACtB1lB,OAAQstB,EAAS3I,MAAM3kB,OACvBylB,KAAMvuB,EAAKuuB,KACXwF,MAAO54B,KAAOg7B,EACdr4B,EAAGs4B,EAASt4B,EACZ2vB,MAAO2I,EAAS3I,OACf,iBAEEztB,EAAKu1B,gBAnTgCc,CAAgB5J,MAChEZ,EAAK,8BAA8B,WAAaiI,EAAiBrE,OAAOhD,MACxEZ,EAAK,gBAA8B,WAAaxgB,EAASohB,MACzDZ,EAAK,yBAA8B,YAqTrC,SAA2BY,GACzBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClB,GAAmB,aAAfnD,EAAK+1B,MAAsB,CAC7B,IAAIO,EAAW7J,EAAEzsB,KAAKA,EAAKlC,EAAEqF,GACzBqsB,EAAI8G,EAAS9G,EAAI8G,EAAS9H,MAAQ,EAClCc,EAAIgH,EAAShH,EACbiH,EAAKv2B,EAAKwvB,EAAIA,EACdgH,EAAKF,EAASxtB,OAAS,EAC3B2jB,EAAEoB,QAAQ7tB,EAAKlC,EAAGkC,EAAKytB,OACvBhB,EAAEqG,WAAW3vB,GACbnD,EAAKytB,MAAM9hB,OAAS,CAClB,CAAE6jB,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAQ+G,EAAQjH,EAAGA,GACxB,CAAEE,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,IAE9Bx2B,EAAKytB,MAAM+B,EAAIxvB,EAAKwvB,EACpBxvB,EAAKytB,MAAM6B,EAAItvB,EAAKsvB,MAxUwBmH,CAAkBhK,MAClEZ,EAAK,yBAA8B,YA0PrC,SAA2BY,GACzBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,GAAIspB,EAAE7nB,SAASzB,GAAGzH,OAAQ,CACxB,IAAIsE,EAAOysB,EAAEzsB,KAAKmD,GACd+C,EAAIumB,EAAEzsB,KAAKA,EAAK41B,WAChB/mB,EAAI4d,EAAEzsB,KAAKA,EAAK61B,cAChBjW,EAAI6M,EAAEzsB,KAAKssB,EAAEoK,KAAK12B,EAAK4uB,aACvBlb,EAAI+Y,EAAEzsB,KAAKssB,EAAEoK,KAAK12B,EAAK6uB,cAE3B7uB,EAAKwuB,MAAQ2D,KAAKwE,IAAIjjB,EAAE8b,EAAI5P,EAAE4P,GAC9BxvB,EAAK8I,OAASqpB,KAAKwE,IAAI9nB,EAAEygB,EAAIppB,EAAEopB,GAC/BtvB,EAAKwvB,EAAI5P,EAAE4P,EAAIxvB,EAAKwuB,MAAQ,EAC5BxuB,EAAKsvB,EAAIppB,EAAEopB,EAAItvB,EAAK8I,OAAS,MAIjCwjB,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACD,WAApBspB,EAAEzsB,KAAKmD,GAAG4yB,OACZtJ,EAAEqG,WAAW3vB,MA5Q+ByzB,CAAkBnK,MAClEZ,EAAK,sBAA8B,WAAarxB,EAAUuzB,KAAKtB,MAC/DZ,EAAK,4BAA8B,YAgOrC,SAA8BY,GAC5BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB,GAAIwuB,EAAEa,IAAIN,EAAM,KAId,OAHsB,MAAlBA,EAAKuI,UAAsC,MAAlBvI,EAAKuI,WAChCvI,EAAK2B,OAAS3B,EAAKwI,aAEbxI,EAAKuI,UACX,IAAK,IAAKvI,EAAK2C,GAAK3C,EAAK2B,MAAQ,EAAI3B,EAAKwI,YAAa,MACvD,IAAK,IAAKxI,EAAK2C,GAAK3C,EAAK2B,MAAQ,EAAI3B,EAAKwI,gBAzOAwB,CAAqBpK,MACrEZ,EAAK,4BAA8B,WAAaiI,EAAiB/F,KAAKtB,MACtEZ,EAAK,sBAA8B,YAwJrC,SAAwBY,GACtB,IAAIqK,EAAO1d,OAAO2d,kBACdC,EAAO,EACPC,EAAO7d,OAAO2d,kBACdG,EAAO,EACPC,EAAa1K,EAAEE,QACfyK,EAAUD,EAAWE,SAAW,EAChCC,EAAUH,EAAWI,SAAW,EAEpC,SAASC,EAAYpI,GACnB,IAAII,EAAIJ,EAAMI,EACVF,EAAIF,EAAME,EACVhC,EAAI8B,EAAMZ,MACVyC,EAAI7B,EAAMtmB,OACdguB,EAAO3E,KAAKsF,IAAIX,EAAMtH,EAAIlC,EAAI,GAC9B0J,EAAO7E,KAAKC,IAAI4E,EAAMxH,EAAIlC,EAAI,GAC9B2J,EAAO9E,KAAKsF,IAAIR,EAAM3H,EAAI2B,EAAI,GAC9BiG,EAAO/E,KAAKC,IAAI8E,EAAM5H,EAAI2B,EAAI,GAGhC3E,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKq0B,EAAY/K,EAAEzsB,KAAKmD,OACnDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACdwuB,EAAEa,IAAIN,EAAM,MACd2K,EAAY3K,MAIhBiK,GAAQM,EACRH,GAAQK,EAERhL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClBnD,EAAKwvB,GAAKsH,EACV92B,EAAKsvB,GAAK2H,KAGZ3K,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,QAAQ,SAAS/N,GAC3BA,EAAE4xB,GAAKsH,EACPl5B,EAAE0xB,GAAK2H,KAEL3K,EAAEa,IAAIN,EAAM,OAAQA,EAAK2C,GAAKsH,GAC9BxK,EAAEa,IAAIN,EAAM,OAAQA,EAAKyC,GAAK2H,MAGpCE,EAAW3I,MAAQwI,EAAOF,EAAOM,EACjCD,EAAWruB,OAASouB,EAAOD,EAAOK,EAxMcI,CAAejL,MAC/DZ,EAAK,4BAA8B,YA0MrC,SAA8BY,GAC5BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAGI65B,EAAIC,EAHJ/K,EAAOJ,EAAEI,KAAK/uB,GACd+5B,EAAQpL,EAAEzsB,KAAKlC,EAAEqF,GACjB20B,EAAQrL,EAAEzsB,KAAKlC,EAAEwvB,GAEhBT,EAAKlhB,QAKRgsB,EAAK9K,EAAKlhB,OAAO,GACjBisB,EAAK/K,EAAKlhB,OAAOkhB,EAAKlhB,OAAOjQ,OAAS,KALtCmxB,EAAKlhB,OAAS,GACdgsB,EAAKG,EACLF,EAAKC,GAKPhL,EAAKlhB,OAAOkU,QAAQ+L,EAAKmM,cAAcF,EAAOF,IAC9C9K,EAAKlhB,OAAOpP,KAAKqvB,EAAKmM,cAAcD,EAAOF,OAzNGI,CAAqBvL,MACrEZ,EAAK,qBAA8B,YA2OrC,SAAuCY,GACrCH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACd+uB,EAAKe,UACPf,EAAKlhB,OAAOyM,aA/OgC6f,CAA8BxL,MAC9EZ,EAAK,oBAA8B,WAAa2H,EAAQzF,KAAKtB,MAhCnByL,CAAUhE,EAAarI,MAC/DA,EAAK,sBAAsB,YAwC/B,SAA0BsI,EAAYD,GACpC5H,EAAEc,KAAK+G,EAAW5G,SAAS,SAASpqB,GAClC,IAAIg1B,EAAahE,EAAWn0B,KAAKmD,GAC7Bi1B,EAAclE,EAAYl0B,KAAKmD,GAE/Bg1B,IACFA,EAAW3I,EAAI4I,EAAY5I,EAC3B2I,EAAW7I,EAAI8I,EAAY9I,EAEvB4E,EAAYtvB,SAASzB,GAAGzH,SAC1By8B,EAAW3J,MAAQ4J,EAAY5J,MAC/B2J,EAAWrvB,OAASsvB,EAAYtvB,YAKtCwjB,EAAEc,KAAK+G,EAAWnG,SAAS,SAASlwB,GAClC,IAAIq6B,EAAahE,EAAWtH,KAAK/uB,GAC7Bs6B,EAAclE,EAAYrH,KAAK/uB,GAEnCq6B,EAAWxsB,OAASysB,EAAYzsB,OAC5B2gB,EAAEa,IAAIiL,EAAa,OACrBD,EAAW3I,EAAI4I,EAAY5I,EAC3B2I,EAAW7I,EAAI8I,EAAY9I,MAI/B6E,EAAWxH,QAAQ6B,MAAQ0F,EAAYvH,QAAQ6B,MAC/C2F,EAAWxH,QAAQ7jB,OAASorB,EAAYvH,QAAQ7jB,OApENuvB,CAAiB5L,EAAGyH,UAuEhE,IAAIM,EAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,WAC7DF,EAAgB,CAAEY,QAAS,GAAIoD,QAAS,GAAIC,QAAS,GAAI5I,QAAS,MAClE+E,EAAa,CAAC,YAAa,SAAU,UAAW,SAChDE,EAAe,CAAC,QAAS,UACzBC,EAAe,CAAErG,MAAO,EAAG1lB,OAAQ,GACnCisB,EAAe,CAAC,SAAU,SAAU,QAAS,SAAU,eACvDD,EAAe,CACbK,OAAQ,EAAGrI,OAAQ,EAAG0B,MAAO,EAAG1lB,OAAQ,EACxCusB,YAAa,GAAID,SAAU,KAE7BJ,EAAY,CAAC,YAmRjB,SAAST,EAAkBl6B,EAAK+0B,GAC9B,OAAO9C,EAAEkM,UAAUlM,EAAEmI,KAAKp6B,EAAK+0B,GAAQhW,QAGzC,SAASgb,EAAahF,GACpB,IAAIqJ,EAAW,GAIf,OAHAnM,EAAEc,KAAKgC,GAAO,SAASjsB,EAAGkS,GACxBojB,EAASpjB,EAAE1U,eAAiBwC,KAEvBs1B,IAGP,CAACC,YAAY,EAAEC,wBAAwB,EAAEC,sBAAsB,EAAEpH,aAAa,EAAEtD,WAAW,GAAG2K,kBAAkB,GAAGC,cAAc,GAAGC,UAAU,GAAGC,wBAAwB,GAAGC,aAAa,GAAGC,SAAS,GAAGlK,SAAS,KAAKmK,GAAG,CAAC,SAASjgC,EAAQ6E,EAAOF,GAGpP,IAAIu7B,EAEJ,GAAIlgC,EACF,IACEkgC,EAASlgC,EAAQ,UACjB,MAAO4E,IAGNs7B,IACHA,EAASp6B,OAAOstB,GAGlBvuB,EAAOF,QAAUu7B,GAEf,CAACA,OAAS,KAAKC,GAAG,CAAC,SAASngC,EAAQ6E,EAAOF,GAC7C,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UAEnB6E,EAAOF,QAAU,CACf2uB,IA2BF,SAAaC,GACX,IAAInb,EAAOsa,EAAK8C,aAAajC,EAAG,OAAQ,GAAI,SACxC6M,EAmEN,SAAoB7M,GAClB,IAAI6M,EAAS,GAWb,OADAhN,EAAEc,KAAKX,EAAE7nB,YAAY,SAASzB,IAT9B,SAAS+pB,EAAI/pB,EAAGo2B,GACd,IAAI30B,EAAW6nB,EAAE7nB,SAASzB,GACtByB,GAAYA,EAASlJ,QACvB4wB,EAAEc,KAAKxoB,GAAU,SAAS40B,GACxBtM,EAAIsM,EAAOD,EAAQ,MAGvBD,EAAOn2B,GAAKo2B,EAEqBrM,CAAI/pB,EAAG,MACnCm2B,EA/EMG,CAAWhN,GACpB3jB,EAASwjB,EAAE8F,IAAIkH,GAAU,EACzBI,EAAU,EAAI5wB,EAAS,EAE3B2jB,EAAEE,QAAQgN,YAAcroB,EAGxBgb,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GAAK2uB,EAAEI,KAAK/uB,GAAGq3B,QAAUuE,KAGpD,IAAI5M,EAwEN,SAAoBL,GAClB,OAAOH,EAAEiF,OAAO9E,EAAEuB,SAAS,SAAS4L,EAAK97B,GACvC,OAAO87B,EAAMnN,EAAEI,KAAK/uB,GAAGgvB,SACtB,GA3EU+M,CAAWpN,GAAK,EAG7BH,EAAEc,KAAKX,EAAE7nB,YAAY,SAAS40B,IAShC,SAAStM,EAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQn2B,GACrD,IAAIyB,EAAW6nB,EAAE7nB,SAASzB,GAC1B,IAAKyB,EAASlJ,OAIZ,YAHIyH,IAAMmO,GACRmb,EAAEoB,QAAQvc,EAAMnO,EAAG,CAAE2pB,OAAQ,EAAGqI,OAAQuE,KAK5C,IAAIlxB,EAAMojB,EAAKwC,cAAc3B,EAAG,OAC5BqN,EAASlO,EAAKwC,cAAc3B,EAAG,OAC/BgB,EAAQhB,EAAEzsB,KAAKmD,GAEnBspB,EAAEkC,UAAUnmB,EAAKrF,GACjBsqB,EAAMmI,UAAYptB,EAClBikB,EAAEkC,UAAUmL,EAAQ32B,GACpBsqB,EAAMoI,aAAeiE,EAErBxN,EAAEc,KAAKxoB,GAAU,SAAS40B,GACxBtM,EAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQE,GAE9C,IAAIO,EAAYtN,EAAEzsB,KAAKw5B,GACnBQ,EAAWD,EAAUnE,UAAYmE,EAAUnE,UAAY4D,EACvDS,EAAcF,EAAUlE,aAAekE,EAAUlE,aAAe2D,EAChEU,EAAaH,EAAUnE,UAAY9I,EAAS,EAAIA,EAChDqI,EAAS6E,IAAaC,EAAc,EAAInxB,EAASwwB,EAAOn2B,GAAK,EAEjEspB,EAAEoB,QAAQrlB,EAAKwxB,EAAU,CACvBlN,OAAQoN,EACR/E,OAAQA,EACRgF,aAAa,IAGf1N,EAAEoB,QAAQoM,EAAaH,EAAQ,CAC7BhN,OAAQoN,EACR/E,OAAQA,EACRgF,aAAa,OAIZ1N,EAAE/c,OAAOvM,IACZspB,EAAEoB,QAAQvc,EAAM9I,EAAK,CAAEskB,OAAQ,EAAGqI,OAAQrsB,EAASwwB,EAAOn2B,KAjD1D+pB,CAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQE,MAKhD/M,EAAEE,QAAQyN,eAAiBV,GA/C3B/D,QAoHF,SAAiBlJ,GACf,IAAI0K,EAAa1K,EAAEE,QACnBF,EAAEqG,WAAWqE,EAAWwC,oBACjBxC,EAAWwC,YAClBrN,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACd2uB,EAAEI,KAAK/uB,GACTq8B,aACP1N,EAAEiB,WAAW5vB,SAKjB,CAACowB,WAAW,GAAGc,SAAS,KAAKqL,GAAG,CAAC,SAASnhC,EAAQ6E,EAAOF,GAG3D,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UAEnB6E,EAAOF,QAAU,CACf2uB,IAoBF,SAAaC,GACXA,EAAEE,QAAQ2N,YAAc,GACxBhO,EAAEc,KAAKX,EAAEuB,SAAS,SAASnB,IAG7B,SAAuBJ,EAAG3uB,GACxB,IAYIi4B,EAAO3G,EAAOj0B,EAZdgI,EAAIrF,EAAEqF,EACNo3B,EAAQ9N,EAAEzsB,KAAKmD,GAAGorB,KAClBjB,EAAIxvB,EAAEwvB,EACNkN,EAAQ/N,EAAEzsB,KAAKstB,GAAGiB,KAClB9zB,EAAOqD,EAAErD,KACTggC,EAAYhO,EAAEI,KAAK/uB,GACnBk4B,EAAYyE,EAAUzE,UAE1B,GAAIwE,IAAUD,EAAQ,EAAG,OAKzB,IAHA9N,EAAEiB,WAAW5vB,GAGR3C,EAAI,IAAKo/B,EAAOA,EAAQC,IAASr/B,IAAKo/B,EACzCE,EAAU9uB,OAAS,GACnByjB,EAAQ,CACNZ,MAAO,EAAG1lB,OAAQ,EAClB2xB,UAAWA,EAAWC,QAAS58B,EAC/BywB,KAAMgM,GAERxE,EAAQnK,EAAK8C,aAAajC,EAAG,OAAQ2C,EAAO,MACxCmL,IAAUvE,IACZ5G,EAAMZ,MAAQiM,EAAUjM,MACxBY,EAAMtmB,OAAS2xB,EAAU3xB,OACzBsmB,EAAM2G,MAAQ,aACd3G,EAAMgG,SAAWqF,EAAUrF,UAE7B3I,EAAEoB,QAAQ1qB,EAAG4yB,EAAO,CAAEjJ,OAAQ2N,EAAU3N,QAAUryB,GACxC,IAANU,GACFsxB,EAAEE,QAAQ2N,YAAY/9B,KAAKw5B,GAE7B5yB,EAAI4yB,EAGNtJ,EAAEoB,QAAQ1qB,EAAGmqB,EAAG,CAAER,OAAQ2N,EAAU3N,QAAUryB,GAtCXkgC,CAAclO,EAAGI,OArBpDkB,KA8DF,SAActB,GACZH,EAAEc,KAAKX,EAAEE,QAAQ2N,aAAa,SAASn3B,GACrC,IAEImqB,EAFAttB,EAAOysB,EAAEzsB,KAAKmD,GACdy3B,EAAY56B,EAAKy6B,UAGrB,IADAhO,EAAEoB,QAAQ7tB,EAAK06B,QAASE,GACjB56B,EAAK+1B,OACVzI,EAAIb,EAAEoO,WAAW13B,GAAG,GACpBspB,EAAEqG,WAAW3vB,GACby3B,EAAUjvB,OAAOpP,KAAK,CAAEizB,EAAGxvB,EAAKwvB,EAAGF,EAAGtvB,EAAKsvB,IACxB,eAAftvB,EAAK+1B,QACP6E,EAAUpL,EAAIxvB,EAAKwvB,EACnBoL,EAAUtL,EAAItvB,EAAKsvB,EACnBsL,EAAUpM,MAAQxuB,EAAKwuB,MACvBoM,EAAU9xB,OAAS9I,EAAK8I,QAE1B3F,EAAImqB,EACJttB,EAAOysB,EAAEzsB,KAAKmD,SAKlB,CAAC+qB,WAAW,GAAGc,SAAS,KAAK8L,GAAG,CAAC,SAAS5hC,EAAQ6E,EAAOF,GAC3D,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAgC4uB,EAAGsO,EAAIC,GACrC,IACIC,EADAjvB,EAAO,GAGXsgB,EAAEc,KAAK4N,GAAI,SAAS73B,GAIlB,IAHA,IACIuM,EACAwrB,EAFA1B,EAAQ/M,EAAE/c,OAAOvM,GAGdq2B,GAAO,CASZ,IARA9pB,EAAS+c,EAAE/c,OAAO8pB,KAEhB0B,EAAYlvB,EAAK0D,GACjB1D,EAAK0D,GAAU8pB,IAEf0B,EAAYD,EACZA,EAAWzB,GAET0B,GAAaA,IAAc1B,EAE7B,YADAuB,EAAGlN,QAAQqN,EAAW1B,GAGxBA,EAAQ9pB,QA6BZ,CAACyrB,YAAY,KAAKC,GAAG,CAAC,SAASliC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAoB4uB,EAAG4O,GACrB,OAAO/O,EAAE9wB,IAAI6/B,GAAS,SAASl4B,GAC7B,IAAIm4B,EAAM7O,EAAE0G,QAAQhwB,GACpB,GAAKm4B,EAAI5/B,OAEF,CACL,IAAI6/B,EAASjP,EAAEiF,OAAO+J,GAAK,SAAS1B,EAAK97B,GACvC,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACd09B,EAAQ/O,EAAEzsB,KAAKlC,EAAEqF,GACrB,MAAO,CACLs4B,IAAK7B,EAAI6B,IAAO5O,EAAKC,OAAS0O,EAAMzH,MACpCjH,OAAQ8M,EAAI9M,OAASD,EAAKC,UAE3B,CAAE2O,IAAK,EAAG3O,OAAQ,IAErB,MAAO,CACL3pB,EAAGA,EACHu4B,WAAYH,EAAOE,IAAMF,EAAOzO,OAChCA,OAAQyO,EAAOzO,QAdjB,MAAO,CAAE3pB,EAAGA,QAqBhB,CAACg4B,YAAY,KAAKQ,GAAG,CAAC,SAASziC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAEnC9yB,EAAOF,QAgCP,SAAyB4uB,EAAG8B,EAAMqN,GAChC,IAAItqB,EAgCN,SAAwBmb,GACtB,IAAItpB,EACJ,KAAOspB,EAAEoP,QAAS14B,EAAImpB,EAAEwB,SAAS,YACjC,OAAO3qB,EAnCI24B,CAAerP,GACtB8O,EAAS,IAAI1K,EAAM,CAAEK,UAAU,IAAQE,SAAS,CAAE9f,KAAMA,IAC3CyqB,qBAAoB,SAAS54B,GAAK,OAAOspB,EAAEzsB,KAAKmD,MA2BjE,OAzBAmpB,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACduM,EAAS+c,EAAE/c,OAAOvM,IAElBnD,EAAKuuB,OAASA,GAAQvuB,EAAK8uB,SAAWP,GAAQA,GAAQvuB,EAAK+uB,WAC7DwM,EAAOlK,QAAQluB,GACfo4B,EAAO5M,UAAUxrB,EAAGuM,GAAU4B,GAG9Bgb,EAAEc,KAAKX,EAAEmP,GAAcz4B,IAAI,SAASrF,GAClC,IAAIwtB,EAAIxtB,EAAEqF,IAAMA,EAAIrF,EAAEwvB,EAAIxvB,EAAEqF,EACxB0pB,EAAO0O,EAAO1O,KAAKvB,EAAGnoB,GACtB2pB,EAAUR,EAAE0P,YAAYnP,GAAsB,EAAdA,EAAKC,OACzCyO,EAAO1N,QAAQvC,EAAGnoB,EAAG,CAAE2pB,OAAQL,EAAEI,KAAK/uB,GAAGgvB,OAASA,OAGhDR,EAAEa,IAAIntB,EAAM,YACdu7B,EAAOlK,QAAQluB,EAAG,CAChByrB,WAAY5uB,EAAK4uB,WAAWL,GAC5BM,YAAa7uB,EAAK6uB,YAAYN,SAM/BgN,IASP,CAACU,cAAc,EAAEd,YAAY,KAAKe,GAAG,CAAC,SAAShjC,EAAQ6E,EAAOF,GAGhE,IAAIyuB,EAAIpzB,EAAQ,aA4BhB,SAASijC,EAAmB1P,EAAG2P,EAAYC,GAiBzC,IAbA,IAAIC,EAAWhQ,EAAEiQ,UAAUF,EACA/P,EAAE9wB,IAAI6gC,GAAY,SAAUl5B,EAAGhI,GAAK,OAAOA,MAClEqhC,EAAelQ,EAAE0G,QAAQ1G,EAAE9wB,IAAI4gC,GAAY,SAASj5B,GACtD,OAAOmpB,EAAEmQ,MAAMhQ,EAAEY,SAASlqB,IACjB3H,KAAI,SAASsC,GACZ,MAAO,CAAE6H,IAAK22B,EAASx+B,EAAEwvB,GAAIR,OAAQL,EAAEI,KAAK/uB,GAAGgvB,WAEhD4P,OAAO,OACP//B,YACP,GAGAggC,EAAa,EACVA,EAAaN,EAAW3gC,QAAQihC,IAAe,EACtD,IAAIC,EAAW,EAAID,EAAa,EAChCA,GAAc,EACd,IAAIE,EAAOvQ,EAAE9wB,IAAI,IAAIsP,MAAM8xB,IAAW,WAAa,OAAO,KAGtDE,EAAK,EAeT,OAdAxQ,EAAEc,KAAKoP,EAAa32B,SAAQ,SAASwqB,GACnC,IAAIrzB,EAAQqzB,EAAM1qB,IAAMg3B,EACxBE,EAAK7/B,IAAUqzB,EAAMvD,OAErB,IADA,IAAIiQ,EAAY,EACT//B,EAAQ,GACTA,EAAQ,IACV+/B,GAAaF,EAAK7/B,EAAQ,IAG5B6/B,EADA7/B,EAASA,EAAQ,GAAM,IACRqzB,EAAMvD,OAEvBgQ,GAAMzM,EAAMvD,OAASiQ,MAGhBD,EAhET/+B,EAAOF,QAkBP,SAAoB4uB,EAAGuQ,GAErB,IADA,IAAIF,EAAK,EACA3hC,EAAI,EAAGA,EAAI6hC,EAASthC,SAAUP,EACrC2hC,GAAMX,EAAmB1P,EAAGuQ,EAAS7hC,EAAE,GAAI6hC,EAAS7hC,IAEtD,OAAO2hC,IA4CP,CAAC3B,YAAY,KAAK8B,GAAG,CAAC,SAAS/jC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,aACZgkC,EAAYhkC,EAAQ,gBACpBikC,EAAajkC,EAAQ,iBACrBkkC,EAAelkC,EAAQ,mBACvBmkC,EAAkBnkC,EAAQ,uBAC1BokC,EAAyBpkC,EAAQ,8BACjC23B,EAAQ33B,EAAQ,eAAe23B,MAC/BjF,EAAO1yB,EAAQ,WA6CnB,SAASqkC,EAAiB9Q,EAAG+Q,EAAO5B,GAClC,OAAOtP,EAAE9wB,IAAIgiC,GAAO,SAASjP,GAC3B,OAAO8O,EAAgB5Q,EAAG8B,EAAMqN,MAIpC,SAAS6B,EAAiBC,EAAaC,GACrC,IAAI5C,EAAK,IAAIlK,EACbvE,EAAEc,KAAKsQ,GAAa,SAASE,GAC3B,IAAItsB,EAAOssB,EAAGjR,QAAQrb,KAClBusB,EAAST,EAAaQ,EAAItsB,EAAMypB,EAAI4C,GACxCrR,EAAEc,KAAKyQ,EAAO7C,IAAI,SAAS73B,EAAGhI,GAC5ByiC,EAAG59B,KAAKmD,GAAG4wB,MAAQ54B,KAErBmiC,EAAuBM,EAAI7C,EAAI8C,EAAO7C,OAI1C,SAAS8C,EAAYrR,EAAGuQ,GACtB1Q,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxBmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxBsxB,EAAEzsB,KAAKmD,GAAG4wB,MAAQ54B,QAhExB4C,EAAOF,QAiBP,SAAe4uB,GACb,IAAIsC,EAAUnD,EAAKmD,QAAQtC,GACvBsR,EAAkBR,EAAiB9Q,EAAGH,EAAEgG,MAAM,EAAGvD,EAAU,GAAI,WAC/DiP,EAAgBT,EAAiB9Q,EAAGH,EAAEgG,MAAMvD,EAAU,GAAI,GAAI,GAAI,YAElEiO,EAAWE,EAAUzQ,GACzBqR,EAAYrR,EAAGuQ,GAKf,IAHA,IACIiB,EADAC,EAAS9kB,OAAO2d,kBAGX57B,EAAI,EAAGgjC,EAAW,EAAGA,EAAW,IAAKhjC,IAAKgjC,EAAU,CAC3DV,EAAiBtiC,EAAI,EAAI4iC,EAAkBC,EAAe7iC,EAAI,GAAK,GAEnE6hC,EAAWpR,EAAKoF,iBAAiBvE,GACjC,IAAIqQ,EAAKK,EAAW1Q,EAAGuQ,GACnBF,EAAKoB,IACPC,EAAW,EACXF,EAAO3R,EAAE8R,UAAUpB,GACnBkB,EAASpB,GAIbgB,EAAYrR,EAAGwR,KA6Bf,CAAChC,cAAc,EAAEd,YAAY,GAAGkD,UAAU,GAAGC,6BAA6B,GAAGC,sBAAsB,GAAGC,gBAAgB,GAAGC,eAAe,GAAGC,kBAAkB,KAAKC,GAAG,CAAC,SAASzlC,EAAQ6E,EAAOF,GAGhM,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAaP,SAAmB4uB,GACjB,IAAIQ,EAAU,GACV2R,EAActS,EAAE/T,OAAOkU,EAAEc,SAAS,SAASpqB,GACzC,OAAQspB,EAAE7nB,SAASzB,GAAGzH,UAExBqzB,EAAUzC,EAAE8F,IAAI9F,EAAE9wB,IAAIojC,GAAa,SAASz7B,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAClE2H,EAAS5J,EAAE9wB,IAAI8wB,EAAEgG,MAAMvD,EAAU,IAAI,WAAa,MAAO,MAU7D,IAAI8P,EAAYvS,EAAEoQ,OAAOkC,GAAa,SAASz7B,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,QAGrE,OAFAjC,EAAEc,KAAKyR,GATP,SAAS3R,EAAI/pB,GACX,GAAImpB,EAAEa,IAAIF,EAAS9pB,GAAI,OACvB8pB,EAAQ9pB,IAAK,EACb,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClB+yB,EAAOl2B,EAAKuuB,MAAMhyB,KAAK4G,GACvBmpB,EAAEc,KAAKX,EAAEoO,WAAW13B,GAAI+pB,MAMnBgJ,IAGP,CAACiF,YAAY,KAAK2D,GAAG,CAAC,SAAS5lC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QA2BP,SAA0BkhC,EAAShE,GACjC,IAAIiE,EAAgB,GA4BpB,OA3BA1S,EAAEc,KAAK2R,GAAS,SAAS1O,EAAOl1B,GAC9B,IAAI8jC,EAAMD,EAAc3O,EAAMltB,GAAK,CACjC+7B,SAAU,EACVnN,GAAM,GACNC,IAAK,GACLgJ,GAAI,CAAC3K,EAAMltB,GACXhI,EAAGA,GAEAmxB,EAAE0P,YAAY3L,EAAMqL,cACvBuD,EAAIvD,WAAarL,EAAMqL,WACvBuD,EAAInS,OAASuD,EAAMvD,WAIvBR,EAAEc,KAAK2N,EAAG/M,SAAS,SAASlwB,GAC1B,IAAIqhC,EAASH,EAAclhC,EAAEqF,GACzBi8B,EAASJ,EAAclhC,EAAEwvB,GACxBhB,EAAE0P,YAAYmD,IAAY7S,EAAE0P,YAAYoD,KAC3CA,EAAOF,WACPC,EAAOnN,IAAIz1B,KAAKyiC,EAAclhC,EAAEwvB,QAWtC,SAA4B+R,GAC1B,IAAIN,EAAU,GAEd,SAASO,EAASC,GAChB,OAAO,SAASnM,GACVA,EAAOoM,SAGPlT,EAAE0P,YAAY5I,EAAOsI,aACrBpP,EAAE0P,YAAYuD,EAAO7D,aACrBtI,EAAOsI,YAAc6D,EAAO7D,aA8BtC,SAAsBhY,EAAQ+b,GAC5B,IAAIhE,EAAM,EACN3O,EAAS,EAETpJ,EAAOoJ,SACT2O,GAAO/X,EAAOgY,WAAahY,EAAOoJ,OAClCA,GAAUpJ,EAAOoJ,QAGf2S,EAAO3S,SACT2O,GAAOgE,EAAO/D,WAAa+D,EAAO3S,OAClCA,GAAU2S,EAAO3S,QAGnBpJ,EAAOsX,GAAKyE,EAAOzE,GAAGj/B,OAAO2nB,EAAOsX,IACpCtX,EAAOgY,WAAaD,EAAM3O,EAC1BpJ,EAAOoJ,OAASA,EAChBpJ,EAAOvoB,EAAIg3B,KAAKsF,IAAIgI,EAAOtkC,EAAGuoB,EAAOvoB,GACrCskC,EAAOD,QAAS,EA/CVE,CAAaH,EAAQnM,IAK3B,SAASuM,EAAUJ,GACjB,OAAO,SAASlM,GACdA,EAAW,GAAE92B,KAAKgjC,GACQ,KAApBlM,EAAO6L,UACXG,EAAU9iC,KAAK82B,IAKrB,KAAOgM,EAAU3jC,QAAQ,CACvB,IAAI20B,EAAQgP,EAAUO,MACtBb,EAAQxiC,KAAK8zB,GACb/D,EAAEc,KAAKiD,EAAU,GAAEjY,UAAWknB,EAASjP,IACvC/D,EAAEc,KAAKiD,EAAM2B,IAAK2N,EAAUtP,IAG9B,OAAO/D,EAAEmQ,MAAMsC,GACNxmB,QAAO,SAAS8X,GAAS,OAAQA,EAAMmP,UACvChkC,KAAI,SAAS60B,GACZ,OAAO/D,EAAEmI,KAAKpE,EAAO,CAAC,KAAM,IAAK,aAAc,cAEhD1zB,QAxCFkjC,CAJSvT,EAAE/T,OAAOymB,GAAe,SAAS3O,GAC/C,OAAQA,EAAM6O,eAmEhB,CAAC/D,YAAY,KAAK2E,GAAG,CAAC,SAAS5mC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aACZwiC,EAAaxiC,EAAQ,gBACrB6mC,EAAmB7mC,EAAQ,uBAC3B0qB,EAAO1qB,EAAQ,UAEnB6E,EAAOF,QAEP,SAASu/B,EAAa3Q,EAAGtpB,EAAG43B,EAAI4C,GAC9B,IAAItC,EAAU5O,EAAE7nB,SAASzB,GACrBnD,EAAOysB,EAAEzsB,KAAKmD,GACd68B,EAAKhgC,EAAOA,EAAK4uB,gBAAanwB,EAC9BwhC,EAAKjgC,EAAOA,EAAK6uB,iBAAapwB,EAC9ByhC,EAAY,GAEZF,IACF3E,EAAU/O,EAAE/T,OAAO8iB,GAAS,SAAS/N,GACnC,OAAOA,IAAM0S,GAAM1S,IAAM2S,MAI7B,IAAIE,EAAczE,EAAWjP,EAAG4O,GAChC/O,EAAEc,KAAK+S,GAAa,SAAS9P,GAC3B,GAAI5D,EAAE7nB,SAASyrB,EAAMltB,GAAGzH,OAAQ,CAC9B,IAAI0kC,EAAiBhD,EAAa3Q,EAAG4D,EAAMltB,EAAG43B,EAAI4C,GAClDuC,EAAU7P,EAAMltB,GAAKi9B,EACjB9T,EAAEa,IAAIiT,EAAgB,gBAwCN1c,EAvCD2M,EAuCSgQ,EAvCFD,EAwCzB9T,EAAE0P,YAAYtY,EAAOgY,aAMxBhY,EAAOgY,WAAa2E,EAAM3E,WAC1BhY,EAAOoJ,OAASuT,EAAMvT,SANtBpJ,EAAOgY,YAAchY,EAAOgY,WAAahY,EAAOoJ,OAC3BuT,EAAM3E,WAAa2E,EAAMvT,SACzBpJ,EAAOoJ,OAASuT,EAAMvT,QAC3CpJ,EAAOoJ,QAAUuT,EAAMvT,SAL3B,IAA0BpJ,EAAQ2c,KAlChC,IAAItB,EAAUgB,EAAiBI,EAAapF,IAuB9C,SAAyBgE,EAASmB,GAChC5T,EAAEc,KAAK2R,GAAS,SAAS1O,GACvBA,EAAM2K,GAAK1O,EAAE0G,QAAQ3C,EAAM2K,GAAGx/B,KAAI,SAAS2H,GACzC,OAAI+8B,EAAU/8B,GACL+8B,EAAU/8B,GAAG63B,GAEf73B,MACL,MA7BNm9B,CAAgBvB,EAASmB,GAEzB,IAAI3E,EAAS3X,EAAKmb,EAASpB,GAE3B,GAAIqC,IACFzE,EAAOP,GAAK1O,EAAE0G,QAAQ,CAACgN,EAAIzE,EAAOP,GAAIiF,IAAK,GACvCxT,EAAE8T,aAAaP,GAAItkC,QAAQ,CAC7B,IAAI8kC,EAAS/T,EAAEzsB,KAAKysB,EAAE8T,aAAaP,GAAI,IACnCS,EAAShU,EAAEzsB,KAAKysB,EAAE8T,aAAaN,GAAI,IAClC3T,EAAEa,IAAIoO,EAAQ,gBACjBA,EAAOG,WAAa,EACpBH,EAAOzO,OAAS,GAElByO,EAAOG,YAAcH,EAAOG,WAAaH,EAAOzO,OAC3B0T,EAAOzM,MAAQ0M,EAAO1M,QAAUwH,EAAOzO,OAAS,GACrEyO,EAAOzO,QAAU,EAIrB,OAAOyO,IA0BP,CAACJ,YAAY,GAAGuF,eAAe,GAAGC,sBAAsB,GAAGC,SAAS,KAAKC,GAAG,CAAC,SAAS3nC,EAAQ6E,EAAOF,GACvG,IAAIyuB,EAAIpzB,EAAQ,aACZ0yB,EAAO1yB,EAAQ,WAmCnB,SAAS4nC,EAAkB9F,EAAI+F,EAAY/jC,GAEzC,IADA,IAAI05B,EACGqK,EAAWrlC,SAAWg7B,EAAOpK,EAAEoK,KAAKqK,IAAa5lC,GAAK6B,GAC3D+jC,EAAWnB,MACX5E,EAAGz+B,KAAKm6B,EAAKsE,IACbh+B,IAEF,OAAOA,EAxCTe,EAAOF,QAEP,SAAckhC,EAASpB,GACrB,IAAIpgC,EAAQquB,EAAKoV,UAAUjC,GAAS,SAAS1O,GAC3C,OAAO/D,EAAEa,IAAIkD,EAAO,iBAElB4Q,EAAW1jC,EAAM2jC,IACjBH,EAAazU,EAAEoQ,OAAOn/B,EAAM4jC,KAAK,SAAS9Q,GAAS,OAAQA,EAAMl1B,KACjE6/B,EAAK,GACLS,EAAM,EACN3O,EAAS,EACTsU,EAAU,EAEdH,EAASrd,MA8Bcyd,IA9BS1D,EA+BzB,SAASwB,EAAQC,GACtB,OAAID,EAAOzD,WAAa0D,EAAO1D,YACrB,EACCyD,EAAOzD,WAAa0D,EAAO1D,WAC7B,EAGD2F,EAA6BjC,EAAOjkC,EAAIgkC,EAAOhkC,EAAxCgkC,EAAOhkC,EAAIikC,EAAOjkC,KApCnCimC,EAAUN,EAAkB9F,EAAI+F,EAAYK,GAE5C9U,EAAEc,KAAK6T,GAAU,SAAU5Q,GACzB+Q,GAAW/Q,EAAM2K,GAAGt/B,OACpBs/B,EAAGz+B,KAAK8zB,EAAM2K,IACdS,GAAOpL,EAAMqL,WAAarL,EAAMvD,OAChCA,GAAUuD,EAAMvD,OAChBsU,EAAUN,EAAkB9F,EAAI+F,EAAYK,MAqBhD,IAAyBC,EAlBvB,IAAI9F,EAAS,CAAEP,GAAI1O,EAAE0G,QAAQgI,GAAI,IAC7BlO,IACFyO,EAAOG,WAAaD,EAAM3O,EAC1ByO,EAAOzO,OAASA,GAElB,OAAOyO,IAyBP,CAACJ,YAAY,GAAGkD,UAAU,KAAKiD,GAAG,CAAC,SAASpoC,EAAQ6E,EAAOF,GAC7D,IAAIyuB,EAAIpzB,EAAQ,YAEhB6E,EAAOF,QAEP,SAA2B4uB,GACzB,IAAI8U,EAoEN,SAAmB9U,GACjB,IAAI8O,EAAS,GACTiG,EAAM,EAEV,SAAStU,EAAI/pB,GACX,IAAIs+B,EAAMD,EACVlV,EAAEc,KAAKX,EAAE7nB,SAASzB,GAAI+pB,GACtBqO,EAAOp4B,GAAK,CAAEs+B,IAAKA,EAAKD,IAAKA,KAI/B,OAFAlV,EAAEc,KAAKX,EAAE7nB,WAAYsoB,GAEdqO,EA/EamG,CAAUjV,GAE9BH,EAAEc,KAAKX,EAAEE,QAAQ2N,aAAa,SAASn3B,GAUrC,IATA,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdu3B,EAAU16B,EAAK06B,QACfiH,EAqCR,SAAkBlV,EAAG8U,EAAep+B,EAAGmqB,GACrC,IAII5d,EACAkyB,EALAC,EAAQ,GACRC,EAAQ,GACRL,EAAMtP,KAAKsF,IAAI8J,EAAcp+B,GAAGs+B,IAAKF,EAAcjU,GAAGmU,KACtDD,EAAMrP,KAAKC,IAAImP,EAAcp+B,GAAGq+B,IAAKD,EAAcjU,GAAGkU,KAK1D9xB,EAASvM,EACT,GACEuM,EAAS+c,EAAE/c,OAAOA,GAClBmyB,EAAMtlC,KAAKmT,SACJA,IACC6xB,EAAc7xB,GAAQ+xB,IAAMA,GAAOD,EAAMD,EAAc7xB,GAAQ8xB,MACzEI,EAAMlyB,EAGNA,EAAS4d,EACT,MAAQ5d,EAAS+c,EAAE/c,OAAOA,MAAakyB,GACrCE,EAAMvlC,KAAKmT,GAGb,MAAO,CAAEqyB,KAAMF,EAAM9lC,OAAO+lC,EAAM1pB,WAAYwpB,IAAKA,GA5DlCI,CAASvV,EAAG8U,EAAe7G,EAAQv3B,EAAGu3B,EAAQpN,GACzDyU,EAAOJ,EAASI,KAChBH,EAAMD,EAASC,IACfK,EAAU,EACVC,EAAQH,EAAKE,GACbE,GAAY,EAETh/B,IAAMu3B,EAAQpN,GAAG,CAGtB,GAFAttB,EAAOysB,EAAEzsB,KAAKmD,GAEVg/B,EAAW,CACb,MAAQD,EAAQH,EAAKE,MAAcL,GAC5BnV,EAAEzsB,KAAKkiC,GAAOnT,QAAU/uB,EAAKuuB,MAClC0T,IAGEC,IAAUN,IACZO,GAAY,GAIhB,IAAKA,EAAW,CACd,KAAOF,EAAUF,EAAKrmC,OAAS,GACxB+wB,EAAEzsB,KAAKkiC,EAAQH,EAAKE,EAAU,IAAInT,SAAW9uB,EAAKuuB,MACvD0T,IAEFC,EAAQH,EAAKE,GAGfxV,EAAEkC,UAAUxrB,EAAG++B,GACf/+B,EAAIspB,EAAEoO,WAAW13B,GAAG,SA+CxB,CAAC+qB,WAAW,KAAKkU,GAAG,CAAC,SAASlpC,EAAQ6E,EAAOF,GAG/C,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAC/BjF,EAAO1yB,EAAQ,WAqCnB,SAASmpC,EAAmB5V,EAAGuQ,GAC7B,IAAIsF,EAAY,GAqChB,OADAhW,EAAEiF,OAAOyL,GAlCT,SAAoBuF,EAAWpf,GAC7B,IAGEqf,EAAK,EAGLC,EAAU,EACVC,EAAkBH,EAAU7mC,OAC5BinC,EAAWrW,EAAEoK,KAAKvT,GAsBpB,OApBAmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxB,IAAImyB,EAuEV,SAAmCb,EAAGtpB,GACpC,GAAIspB,EAAEzsB,KAAKmD,GAAG4yB,MACZ,OAAOzJ,EAAE1U,KAAK6U,EAAE8T,aAAap9B,IAAI,SAASmoB,GACxC,OAAOmB,EAAEzsB,KAAKsrB,GAAGyK,SA1ET6M,CAA0BnW,EAAGtpB,GACjC0/B,EAAKvV,EAAIb,EAAEzsB,KAAKstB,GAAGyG,MAAQ2O,GAE3BpV,GAAKnqB,IAAMw/B,KACbrW,EAAEc,KAAKjK,EAAMjpB,MAAMuoC,EAAStnC,EAAG,IAAI,SAAS2nC,GAC1CxW,EAAEc,KAAKX,EAAE8T,aAAauC,IAAW,SAASxX,GACxC,IAAIyX,EAAStW,EAAEzsB,KAAKsrB,GAChB0X,EAAOD,EAAOhP,QACbiP,EAAOR,GAAMK,EAAKG,IACjBD,EAAOhN,OAAStJ,EAAEzsB,KAAK8iC,GAAU/M,OACrCkN,EAAYX,EAAWhX,EAAGwX,SAIhCL,EAAUtnC,EAAI,EACdqnC,EAAKK,MAIF1f,KAIFmf,EAGT,SAASY,EAAmBzW,EAAGuQ,GAC7B,IAAIsF,EAAY,GAEhB,SAASa,EAAKC,EAAO9G,EAAU+G,EAAUC,EAAiBC,GACxD,IAAIpgC,EACJmpB,EAAEc,KAAKd,EAAEgG,MAAMgK,EAAU+G,IAAW,SAASloC,GAC3CgI,EAAIigC,EAAMjoC,GACNsxB,EAAEzsB,KAAKmD,GAAG4yB,OACZzJ,EAAEc,KAAKX,EAAE8T,aAAap9B,IAAI,SAASmoB,GACjC,IAAIkY,EAAQ/W,EAAEzsB,KAAKsrB,GACfkY,EAAMzN,QACLyN,EAAMzP,MAAQuP,GAAmBE,EAAMzP,MAAQwP,IAClDN,EAAYX,EAAWhX,EAAGnoB,SA8BpC,OADAmpB,EAAEiF,OAAOyL,GArBT,SAAoByG,EAAOL,GACzB,IACIM,EADAC,GAAgB,EAEhBrH,EAAW,EAef,OAbAhQ,EAAEc,KAAKgW,GAAO,SAASjgC,EAAGygC,GACxB,GAAwB,WAApBnX,EAAEzsB,KAAKmD,GAAG4yB,MAAoB,CAChC,IAAIwK,EAAe9T,EAAE8T,aAAap9B,GAC9Bo9B,EAAa7kC,SACfgoC,EAAejX,EAAEzsB,KAAKugC,EAAa,IAAIxM,MACvCoP,EAAKC,EAAO9G,EAAUsH,EAAgBD,EAAcD,GACpDpH,EAAWsH,EACXD,EAAeD,GAGnBP,EAAKC,EAAO9G,EAAU8G,EAAM1nC,OAAQgoC,EAAcD,EAAM/nC,WAGnD0nC,KAIFd,EAWT,SAASW,EAAYX,EAAWn/B,EAAGmqB,GACjC,GAAInqB,EAAImqB,EAAG,CACT,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAGN,IAAI4E,EAAavB,EAAUn/B,GACtB0gC,IACHvB,EAAUn/B,GAAK0gC,EAAa,IAE9BA,EAAWvW,IAAK,EAGlB,SAASwW,EAAYxB,EAAWn/B,EAAGmqB,GACjC,GAAInqB,EAAImqB,EAAG,CACT,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,OAAO3S,EAAEa,IAAImV,EAAUn/B,GAAImqB,GAW7B,SAASyW,EAAkBtX,EAAGuQ,EAAUsF,EAAW0B,GACjD,IAAI1yB,EAAO,GACP2yB,EAAQ,GACRt+B,EAAM,GAkCV,OA7BA2mB,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxBmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAG4wB,GACxBziB,EAAKnO,GAAKA,EACV8gC,EAAM9gC,GAAKA,EACXwC,EAAIxC,GAAK4wB,QAIbzH,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAI+gB,GAAW,EACf5X,EAAEc,KAAKjK,GAAO,SAAShgB,GACrB,IAAIghC,EAAKH,EAAW7gC,GACpB,GAAIghC,EAAGzoC,OAGL,IADA,IAAI0oC,IADJD,EAAK7X,EAAEoQ,OAAOyH,GAAI,SAAS7W,GAAK,OAAO3nB,EAAI2nB,OAC9B5xB,OAAS,GAAK,EAClBP,EAAIg3B,KAAKkS,MAAMD,GAAKE,EAAKnS,KAAKoS,KAAKH,GAAKjpC,GAAKmpC,IAAMnpC,EAAG,CAC7D,IAAImyB,EAAI6W,EAAGhpC,GACP8oC,EAAM9gC,KAAOA,GACb+gC,EAAUv+B,EAAI2nB,KACbwW,EAAYxB,EAAWn/B,EAAGmqB,KAC7B2W,EAAM3W,GAAKnqB,EACX8gC,EAAM9gC,GAAKmO,EAAKnO,GAAKmO,EAAKgc,GAC1B4W,EAAUv+B,EAAI2nB,WAOjB,CAAEhc,KAAMA,EAAM2yB,MAAOA,GAG9B,SAASO,EAAqB/X,EAAGuQ,EAAU1rB,EAAM2yB,EAAOQ,GAMtD,IAAIC,EAAK,GACLC,EAuCN,SAAyBlY,EAAGuQ,EAAU1rB,EAAMmzB,GAC1C,IAAIG,EAAa,IAAI/T,EACjBsG,EAAa1K,EAAEE,QACfkY,EAqGN,SAAanL,EAASoL,EAASL,GAC7B,OAAO,SAAShY,EAAGtpB,EAAGmqB,GACpB,IAGIzhB,EAHAk5B,EAAStY,EAAEzsB,KAAKmD,GAChB6hC,EAASvY,EAAEzsB,KAAKstB,GAChBmO,EAAM,EAIV,GADAA,GAAOsJ,EAAOvW,MAAQ,EAClBlC,EAAEa,IAAI4X,EAAQ,YAChB,OAAQA,EAAO3P,SAASz0B,eACtB,IAAK,IAAKkL,GAASk5B,EAAOvW,MAAQ,EAAG,MACrC,IAAK,IAAK3iB,EAAQk5B,EAAOvW,MAAQ,EAYrC,GATI3iB,IACF4vB,GAAOgJ,EAAa54B,GAASA,GAE/BA,EAAQ,EAER4vB,IAAQsJ,EAAOhP,MAAQ+O,EAAUpL,GAAW,EAC5C+B,IAAQuJ,EAAOjP,MAAQ+O,EAAUpL,GAAW,EAE5C+B,GAAOuJ,EAAOxW,MAAQ,EAClBlC,EAAEa,IAAI6X,EAAQ,YAChB,OAAQA,EAAO5P,SAASz0B,eACtB,IAAK,IAAKkL,EAAQm5B,EAAOxW,MAAQ,EAAG,MACpC,IAAK,IAAK3iB,GAASm5B,EAAOxW,MAAQ,EAQtC,OALI3iB,IACF4vB,GAAOgJ,EAAa54B,GAASA,GAE/BA,EAAQ,EAED4vB,GAvIGwJ,CAAI9N,EAAWoB,QAASpB,EAAWmB,QAASmM,GAgBxD,OAdAnY,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAImI,EACJgB,EAAEc,KAAKjK,GAAO,SAAShgB,GACrB,IAAI+hC,EAAQ5zB,EAAKnO,GAEjB,GADAyhC,EAAWvT,QAAQ6T,GACf5Z,EAAG,CACL,IAAI6Z,EAAQ7zB,EAAKga,GACb8Z,EAAUR,EAAW/X,KAAKsY,EAAOD,GACrCN,EAAW/W,QAAQsX,EAAOD,EAAO/S,KAAKC,IAAIyS,EAAMpY,EAAGtpB,EAAGmoB,GAAI8Z,GAAW,IAEvE9Z,EAAInoB,QAIDyhC,EA1DMS,CAAgB5Y,EAAGuQ,EAAU1rB,EAAMmzB,GAG5CxX,EAAU,GAgCd,OAtBAX,EAAEc,KAAKuX,EAAOpX,SATd,SAAS+X,EAAMniC,GACRmpB,EAAEa,IAAIF,EAAS9pB,KAClB8pB,EAAQ9pB,IAAK,EACbuhC,EAAGvhC,GAAKmpB,EAAEiF,OAAOoT,EAAOxR,QAAQhwB,IAAI,SAASivB,EAAKt0B,GAEhD,OADAwnC,EAAMxnC,EAAEqF,GACDgvB,KAAKC,IAAIA,EAAKsS,EAAG5mC,EAAEqF,GAAKwhC,EAAO9X,KAAK/uB,MAC1C,OAiBPwuB,EAAEc,KAAKuX,EAAOpX,SAZd,SAASgY,EAAMpiC,GACb,GAAmB,IAAf8pB,EAAQ9pB,GAAU,CACpB8pB,EAAQ9pB,KACR,IAAIs0B,EAAMnL,EAAEiF,OAAOoT,EAAOtX,SAASlqB,IAAI,SAASs0B,EAAK35B,GAEnD,OADAynC,EAAMznC,EAAEwvB,GACD6E,KAAKsF,IAAIA,EAAKiN,EAAG5mC,EAAEwvB,GAAKqX,EAAO9X,KAAK/uB,MAC1Csb,OAAO2d,mBACNU,IAAQre,OAAO2d,oBACjB2N,EAAGvhC,GAAKgvB,KAAKC,IAAIsS,EAAGvhC,GAAIs0B,QAQ9BnL,EAAEc,KAAK6W,GAAO,SAAS9gC,GACrBuhC,EAAGvhC,GAAKuhC,EAAGpzB,EAAKnO,OAGXuhC,EA6BT,SAASc,EAA2B/Y,EAAGgZ,GACrC,OAAOnZ,EAAEmL,IAAIgO,GAAK,SAASf,GACzB,IAAIjN,EAAMnL,EAAEmL,IAAIiN,GAAI,SAASlV,EAAGrsB,GAAK,OAAOqsB,EAAIhB,EAAM/B,EAAGtpB,GAAK,KAE9D,OADUmpB,EAAE8F,IAAIsS,GAAI,SAASlV,EAAGrsB,GAAK,OAAOqsB,EAAIhB,EAAM/B,EAAGtpB,GAAK,KACjDs0B,KAWjB,SAASiO,EAAiBD,EAAKE,GAC7B,IAAIC,EAAatZ,EAAEmL,IAAIkO,GACnBE,EAAavZ,EAAE8F,IAAIuT,GAEvBrZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS0Y,GAC1BxZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS2Y,GAC1B,IAEIl6B,EAFAm6B,EAAYF,EAAOC,EACnBrB,EAAKe,EAAIO,GAETtB,IAAOiB,IAEX95B,EAAkB,MAAVk6B,EAAgBH,EAAatZ,EAAEmL,IAAIiN,GAAMmB,EAAavZ,EAAE8F,IAAIsS,MAGlEe,EAAIO,GAAa1Z,EAAEkM,UAAUkM,GAAI,SAASlV,GAAK,OAAOA,EAAI3jB,YAMlE,SAASo6B,EAAQR,EAAKxB,GACpB,OAAO3X,EAAEkM,UAAUiN,EAAIS,IAAI,SAASC,EAAQhjC,GAC1C,GAAI8gC,EACF,OAAOwB,EAAIxB,EAAMtjC,eAAewC,GAEhC,IAAIuhC,EAAKpY,EAAEoQ,OAAOpQ,EAAE8Z,MAAMX,EAAKtiC,IAC/B,OAAQuhC,EAAG,GAAKA,EAAG,IAAM,KA4E/B,SAASlW,EAAM/B,EAAGtpB,GAChB,OAAOspB,EAAEzsB,KAAKmD,GAAGqrB,MAhYnBzwB,EAAOF,QAAU,CACfwoC,UAuTF,SAAmB5Z,GACjB,IAKI6Z,EALAtJ,EAAWpR,EAAKoF,iBAAiBvE,GACjC6V,EAAYhW,EAAE+H,MAAMgO,EAAmB5V,EAAGuQ,GACtBkG,EAAmBzW,EAAGuQ,IAE1CyI,EAAM,GAEVnZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS0Y,GAC1BQ,EAA4B,MAATR,EAAe9I,EAAW1Q,EAAEia,OAAOvJ,GAAU5kB,UAChEkU,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS2Y,GACZ,MAAVA,IACFO,EAAmBha,EAAE9wB,IAAI8qC,GAAkB,SAASE,GAClD,OAAOla,EAAEia,OAAOC,GAAOpuB,cAI3B,IAAI4rB,EAAa1X,EAAE9nB,KAAc,MAATshC,EAAerZ,EAAE8T,aAAe9T,EAAEoO,WAAYpO,GAClEwX,EAAQF,EAAkBtX,EAAG6Z,EAAkBhE,EAAW0B,GAC1DU,EAAKF,EAAqB/X,EAAG6Z,EACHrC,EAAM3yB,KAAM2yB,EAAMA,MACR,MAAV8B,GAChB,MAAVA,IACFrB,EAAKpY,EAAEkM,UAAUkM,GAAI,SAASlV,GAAK,OAAQA,MAE7CiW,EAAIK,EAAOC,GAASrB,QAIxB,IAAI+B,EAAgBjB,EAA2B/Y,EAAGgZ,GAElD,OADAC,EAAiBD,EAAKgB,GACfR,EAAQR,EAAKhZ,EAAEE,QAAQsX,QApV9B5B,mBAAoBA,EACpBa,mBAAoBA,EACpBD,YAAaA,EACba,YAAaA,EACbC,kBAAmBA,EACnBS,qBAAsBA,EACtBkB,iBAAkBA,EAClBF,2BAA4BA,EAC5BS,QAASA,IAyXT,CAAChK,cAAc,EAAEd,YAAY,GAAGkD,UAAU,KAAKqI,GAAG,CAAC,SAASxtC,EAAQ6E,EAAOF,GAG7E,IAAIyuB,EAAIpzB,EAAQ,aACZ0yB,EAAO1yB,EAAQ,WACfmtC,EAAYntC,EAAQ,QAAQmtC,UAEhCtoC,EAAOF,QAEP,SAAkB4uB,IASlB,SAAmBA,GACjB,IAAIuQ,EAAWpR,EAAKoF,iBAAiBvE,GACjCka,EAAUla,EAAEE,QAAQuI,QACpB0R,EAAQ,EACZta,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAI0jB,EAAYva,EAAE8F,IAAI9F,EAAE9wB,IAAI2nB,GAAO,SAAShgB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAG2F,WAClEwjB,EAAEc,KAAKjK,GAAO,SAAShgB,GACrBspB,EAAEzsB,KAAKmD,GAAGmsB,EAAIsX,EAAQC,EAAY,KAEpCD,GAASC,EAAYF,MAfvBG,CAFAra,EAAIb,EAAK6J,mBAAmBhJ,IAG5BH,EAAEc,KAAKiZ,EAAU5Z,IAAI,SAAS+C,EAAGrsB,GAC/BspB,EAAEzsB,KAAKmD,GAAGqsB,EAAIA,OAkBhB,CAAC2L,YAAY,GAAGkD,UAAU,GAAG0I,OAAO,KAAKC,GAAG,CAAC,SAAS9tC,EAAQ6E,EAAOF,GAGvE,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAC/BoW,EAAQ/tC,EAAQ,UAAU+tC,MAmD9B,SAASC,EAAUhhC,EAAGumB,GAcpB,OADAH,EAAEc,KAAKlnB,EAAEqnB,SAZT,SAASL,EAAI/pB,GACXmpB,EAAEc,KAAKX,EAAE0a,UAAUhkC,IAAI,SAASrF,GAC9B,IAAIspC,EAAQtpC,EAAEqF,EACVmqB,EAAKnqB,IAAMikC,EAAStpC,EAAEwvB,EAAI8Z,EACzBlhC,EAAE21B,QAAQvO,IAAO2Z,EAAMxa,EAAG3uB,KAC7BoI,EAAEmrB,QAAQ/D,EAAG,IACbpnB,EAAE2nB,QAAQ1qB,EAAGmqB,EAAG,IAChBJ,EAAII,UAMHpnB,EAAEyrB,YAOX,SAAS0V,EAAiBnhC,EAAGumB,GAC3B,OAAOH,EAAEmL,IAAIhL,EAAEuB,SAAS,SAASlwB,GAC/B,GAAIoI,EAAE21B,QAAQ/9B,EAAEqF,KAAO+C,EAAE21B,QAAQ/9B,EAAEwvB,GACjC,OAAO2Z,EAAMxa,EAAG3uB,MAKtB,SAASwpC,EAAWphC,EAAGumB,EAAG5gB,GACxBygB,EAAEc,KAAKlnB,EAAEqnB,SAAS,SAASpqB,GACzBspB,EAAEzsB,KAAKmD,GAAGorB,MAAQ1iB,KAhFtB9N,EAAOF,QA2BP,SAAsB4uB,GACpB,IAOII,EAAMhhB,EAPN3F,EAAI,IAAI2qB,EAAM,CAAE0W,UAAU,IAG1B7d,EAAQ+C,EAAEc,QAAQ,GAClBia,EAAO/a,EAAEkF,YACbzrB,EAAEmrB,QAAQ3H,EAAO,IAGjB,KAAOwd,EAAUhhC,EAAGumB,GAAK+a,GACvB3a,EAAOwa,EAAiBnhC,EAAGumB,GAC3B5gB,EAAQ3F,EAAE21B,QAAQhP,EAAK1pB,GAAK8jC,EAAMxa,EAAGI,IAASoa,EAAMxa,EAAGI,GACvDya,EAAWphC,EAAGumB,EAAG5gB,GAGnB,OAAO3F,IA0CP,CAAC+1B,cAAc,EAAEd,YAAY,GAAGnM,SAAS,KAAKyY,GAAG,CAAC,SAASvuC,EAAQ6E,EAAOF,GAG5E,IACI6pC,EADWxuC,EAAQ,UACIwuC,YACvBC,EAAezuC,EAAQ,mBACvB0uC,EAAiB1uC,EAAQ,qBAE7B6E,EAAOF,QAqBP,SAAc4uB,GACZ,OAAOA,EAAEE,QAAQkb,QACf,IAAK,kBAAmBC,EAAqBrb,GAAI,MACjD,IAAK,cAST,SAAyBA,GACvBib,EAAYjb,GACZkb,EAAalb,GAXQsb,CAAgBtb,GAAI,MACvC,IAAK,eAAgBub,EAAkBvb,GAAI,MAC3C,QAASqb,EAAqBrb,KAKlC,IAAIub,EAAoBN,EAOxB,SAASI,EAAqBrb,GAC5Bmb,EAAenb,KAGf,CAACwb,kBAAkB,GAAGC,oBAAoB,GAAGlZ,SAAS,KAAKmZ,GAAG,CAAC,SAASjvC,EAAQ6E,EAAOF,GAGzF,IAAIyuB,EAAIpzB,EAAQ,aACZyuC,EAAezuC,EAAQ,mBACvB+tC,EAAQ/tC,EAAQ,UAAU+tC,MAC1BmB,EAAWlvC,EAAQ,UAAUwuC,YAC7BW,EAAWnvC,EAAQ,eAAeovC,IAAID,SACtC3G,EAAYxoC,EAAQ,eAAeovC,IAAI5G,UACvC6G,EAAWrvC,EAAQ,WAAWqvC,SA6ClC,SAASX,EAAenb,GACtBA,EAAI8b,EAAS9b,GACb2b,EAAS3b,GACT,IAII3uB,EAJAoI,EAAIyhC,EAAalb,GAKrB,IAJA+b,EAAiBtiC,GACjBuiC,EAAcviC,EAAGumB,GAGT3uB,EAAI4qC,EAAUxiC,IAEpByiC,EAAcziC,EAAGumB,EAAG3uB,EADhB8qC,EAAU1iC,EAAGumB,EAAG3uB,IAQxB,SAAS2qC,EAAcviC,EAAGumB,GACxB,IAAIuO,EAAK0G,EAAUx7B,EAAGA,EAAEqnB,SACxByN,EAAKA,EAAG9gC,MAAM,EAAG8gC,EAAGt/B,OAAS,GAC7B4wB,EAAEc,KAAK4N,GAAI,SAAS73B,IAKtB,SAAwB+C,EAAGumB,EAAG+M,GAC5B,IACI9pB,EADWxJ,EAAElG,KAAKw5B,GACA9pB,OACtBxJ,EAAE2mB,KAAK2M,EAAO9pB,GAAQm5B,SAAWC,EAAa5iC,EAAGumB,EAAG+M,GAPlDuP,CAAe7iC,EAAGumB,EAAGtpB,MAczB,SAAS2lC,EAAa5iC,EAAGumB,EAAG+M,GAC1B,IACI9pB,EADWxJ,EAAElG,KAAKw5B,GACA9pB,OAElBs5B,GAAc,EAEdC,EAAYxc,EAAEI,KAAK2M,EAAO9pB,GAE1Bw5B,EAAW,EAyBf,OAvBKD,IACHD,GAAc,EACdC,EAAYxc,EAAEI,KAAKnd,EAAQ8pB,IAG7B0P,EAAWD,EAAUnc,OAErBR,EAAEc,KAAKX,EAAE0a,UAAU3N,IAAQ,SAAS17B,GAClC,IAAIqrC,EAAYrrC,EAAEqF,IAAMq2B,EACpB6G,EAAQ8I,EAAYrrC,EAAEwvB,EAAIxvB,EAAEqF,EAEhC,GAAIk9B,IAAU3wB,EAAQ,CACpB,IAAI05B,EAAeD,IAAcH,EAC7BK,EAAc5c,EAAEI,KAAK/uB,GAAGgvB,OAG5B,GADAoc,GAAYE,EAAeC,GAAeA,EA8GhD,SAAoBxM,EAAMvR,EAAGnoB,GAC3B,OAAO05B,EAAKyM,QAAQhe,EAAGnoB,GA9GfomC,CAAWrjC,EAAGszB,EAAO6G,GAAQ,CAC/B,IAAImJ,EAAgBtjC,EAAE2mB,KAAK2M,EAAO6G,GAAOwI,SACzCK,GAAYE,GAAgBI,EAAgBA,OAK3CN,EAGT,SAASV,EAAiB3L,EAAMvrB,GAC1BhV,UAAUZ,OAAS,IACrB4V,EAAOurB,EAAKtP,QAAQ,IAEtBkc,EAAgB5M,EAAM,GAAI,EAAGvrB,GAG/B,SAASm4B,EAAgB5M,EAAM5P,EAASyc,EAASvmC,EAAGuM,GAClD,IAAI+xB,EAAMiI,EACNjc,EAAQoP,EAAK78B,KAAKmD,GAkBtB,OAhBA8pB,EAAQ9pB,IAAK,EACbmpB,EAAEc,KAAKyP,EAAK8M,UAAUxmC,IAAI,SAASmqB,GAC5BhB,EAAEa,IAAIF,EAASK,KAClBoc,EAAUD,EAAgB5M,EAAM5P,EAASyc,EAASpc,EAAGnqB,OAIzDsqB,EAAMgU,IAAMA,EACZhU,EAAM+T,IAAMkI,IACRh6B,EACF+d,EAAM/d,OAASA,SAGR+d,EAAM/d,OAGRg6B,EAGT,SAAShB,EAAU7L,GACjB,OAAOvQ,EAAE1U,KAAKilB,EAAK7O,SAAS,SAASlwB,GACnC,OAAO++B,EAAKhQ,KAAK/uB,GAAG+qC,SAAW,KAInC,SAASD,EAAU1iC,EAAGumB,EAAGI,GACvB,IAAI1pB,EAAI0pB,EAAK1pB,EACTmqB,EAAIT,EAAKS,EAKRb,EAAE6c,QAAQnmC,EAAGmqB,KAChBnqB,EAAI0pB,EAAKS,EACTA,EAAIT,EAAK1pB,GAGX,IAAI4hC,EAAS7+B,EAAElG,KAAKmD,GAChB6hC,EAAS9+B,EAAElG,KAAKstB,GAChBsc,EAAY7E,EACZ8E,GAAO,EAIP9E,EAAOvD,IAAMwD,EAAOxD,MACtBoI,EAAY5E,EACZ6E,GAAO,GAGT,IAAIC,EAAaxd,EAAE/T,OAAOkU,EAAEuB,SAAS,SAASnB,GAC5C,OAAOgd,IAASE,EAAa7jC,EAAGA,EAAElG,KAAK6sB,EAAK1pB,GAAIymC,IACzCC,IAASE,EAAa7jC,EAAGA,EAAElG,KAAK6sB,EAAKS,GAAIsc,MAGlD,OAAOtd,EAAEmL,IAAIqS,GAAY,SAASjd,GAAQ,OAAOoa,EAAMxa,EAAGI,MAG5D,SAAS8b,EAAcziC,EAAGumB,EAAG3uB,EAAGL,GAC9B,IAAI0F,EAAIrF,EAAEqF,EACNmqB,EAAIxvB,EAAEwvB,EACVpnB,EAAEwnB,WAAWvqB,EAAGmqB,GAChBpnB,EAAE2nB,QAAQpwB,EAAE0F,EAAG1F,EAAE6vB,EAAG,IACpBkb,EAAiBtiC,GACjBuiC,EAAcviC,EAAGumB,GAInB,SAAqBvmB,EAAGumB,GACtB,IAAInb,EAAOgb,EAAE1U,KAAK1R,EAAEqnB,SAAS,SAASpqB,GAAK,OAAQspB,EAAEzsB,KAAKmD,GAAGuM,UACzDsrB,EAAKqN,EAASniC,EAAGoL,GACrB0pB,EAAKA,EAAG9gC,MAAM,GACdoyB,EAAEc,KAAK4N,GAAI,SAAS73B,GAClB,IAAIuM,EAASxJ,EAAElG,KAAKmD,GAAGuM,OACnBmd,EAAOJ,EAAEI,KAAK1pB,EAAGuM,GACjBs6B,GAAU,EAETnd,IACHA,EAAOJ,EAAEI,KAAKnd,EAAQvM,GACtB6mC,GAAU,GAGZvd,EAAEzsB,KAAKmD,GAAGorB,KAAO9B,EAAEzsB,KAAK0P,GAAQ6e,MAAQyb,EAAUnd,EAAKsI,QAAUtI,EAAKsI,WAjBxE8U,CAAY/jC,EAAGumB,GAgCjB,SAASsd,EAAalN,EAAMkI,EAAQmF,GAClC,OAAOA,EAAUzI,KAAOsD,EAAOvD,KAAOuD,EAAOvD,KAAO0I,EAAU1I,IA9NhEzjC,EAAOF,QAAU+pC,EAGjBA,EAAeY,iBAAmBA,EAClCZ,EAAea,cAAgBA,EAC/Bb,EAAekB,aAAeA,EAC9BlB,EAAec,UAAYA,EAC3Bd,EAAegB,UAAYA,EAC3BhB,EAAee,cAAgBA,GAyN7B,CAAC1M,cAAc,EAAEd,YAAY,GAAGkD,UAAU,GAAG4J,kBAAkB,GAAGjZ,SAAS,KAAKmb,GAAG,CAAC,SAASjxC,EAAQ6E,EAAOF,GAG9G,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAAU,CACf6pC,YAyBF,SAAqBjb,GACnB,IAAIQ,EAAU,GAoBdX,EAAEc,KAAKX,EAAEmG,WAlBT,SAAS1F,EAAI/pB,GACX,IAAIsqB,EAAQhB,EAAEzsB,KAAKmD,GACnB,GAAImpB,EAAEa,IAAIF,EAAS9pB,GACjB,OAAOsqB,EAAMc,KAEftB,EAAQ9pB,IAAK,EAEb,IAAIorB,EAAOjC,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEY,SAASlqB,IAAI,SAASrF,GAC7C,OAAOovB,EAAIpvB,EAAEwvB,GAAKb,EAAEI,KAAK/uB,GAAGq3B,WAO9B,OAJI5G,IAASnV,OAAO2d,oBAClBxI,EAAO,GAGDd,EAAMc,KAAOA,MA1CvB0Y,MAoDF,SAAexa,EAAG3uB,GAChB,OAAO2uB,EAAEzsB,KAAKlC,EAAEwvB,GAAGiB,KAAO9B,EAAEzsB,KAAKlC,EAAEqF,GAAGorB,KAAO9B,EAAEI,KAAK/uB,GAAGq3B,UAGvD,CAACgG,YAAY,KAAKiP,GAAG,CAAC,SAASlxC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,cAAc23B,MAsBlC,SAASnC,EAAajC,EAAGjqB,EAAM4sB,EAAO30B,GACpC,IAAI0I,EACJ,GACEA,EAAImpB,EAAEwB,SAASrzB,SACRgyB,EAAEoP,QAAQ14B,IAInB,OAFAisB,EAAM2G,MAAQvzB,EACdiqB,EAAE4E,QAAQluB,EAAGisB,GACNjsB,EAiKT,SAAS4rB,EAAQtC,GACf,OAAOH,EAAE8F,IAAI9F,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACrC,IAAIorB,EAAO9B,EAAEzsB,KAAKmD,GAAGorB,KACrB,IAAKjC,EAAE0P,YAAYzN,GACjB,OAAOA,MAjMbxwB,EAAOF,QAAU,CACf6wB,aAAcA,EACd6Z,SAiCF,SAAkB9b,GAChB,IAAI4d,GAAa,IAAIxZ,GAAQO,SAAS3E,EAAEE,SAUxC,OATAL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKknC,EAAWhZ,QAAQluB,EAAGspB,EAAEzsB,KAAKmD,OAC7DmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAIwsC,EAAcD,EAAWxd,KAAK/uB,EAAEqF,EAAGrF,EAAEwvB,IAAM,CAAER,OAAQ,EAAGqI,OAAQ,GAChE1H,EAAQhB,EAAEI,KAAK/uB,GACnBusC,EAAWxc,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG,CAC3BR,OAAQwd,EAAYxd,OAASW,EAAMX,OACnCqI,OAAQhD,KAAKC,IAAIkY,EAAYnV,OAAQ1H,EAAM0H,aAGxCkV,GA3CP5U,mBA8CF,SAA4BhJ,GAC1B,IAAI4d,EAAa,IAAIxZ,EAAM,CAAEM,WAAY1E,EAAE8d,iBAAkBnZ,SAAS3E,EAAEE,SASxE,OARAL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACpBspB,EAAE7nB,SAASzB,GAAGzH,QACjB2uC,EAAWhZ,QAAQluB,EAAGspB,EAAEzsB,KAAKmD,OAGjCmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzBusC,EAAWxc,QAAQ/vB,EAAG2uB,EAAEI,KAAK/uB,OAExBusC,GAvDPG,iBA0DF,SAA0B/d,GACxB,IAAIge,EAAYne,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACxC,IAAIunC,EAAO,GAIX,OAHApe,EAAEc,KAAKX,EAAEY,SAASlqB,IAAI,SAASrF,GAC7B4sC,EAAK5sC,EAAEwvB,IAAMod,EAAK5sC,EAAEwvB,IAAM,GAAKb,EAAEI,KAAK/uB,GAAGgvB,UAEpC4d,KAET,OAAOpe,EAAEiQ,UAAU9P,EAAEc,QAASkd,IAjE9BE,mBAoEF,SAA4Ble,GAC1B,IAAIge,EAAYne,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACxC,IAAIynC,EAAQ,GAIZ,OAHAte,EAAEc,KAAKX,EAAE0G,QAAQhwB,IAAI,SAASrF,GAC5B8sC,EAAM9sC,EAAEqF,IAAMynC,EAAM9sC,EAAEqF,IAAM,GAAKspB,EAAEI,KAAK/uB,GAAGgvB,UAEtC8d,KAET,OAAOte,EAAEiQ,UAAU9P,EAAEc,QAASkd,IA3E9B1S,cAkFF,SAAuB8S,EAAMC,GAC3B,IAcIC,EAAIC,EAdJxb,EAAIqb,EAAKrb,EACTF,EAAIub,EAAKvb,EAITiH,EAAKuU,EAAMtb,EAAIA,EACfgH,EAAKsU,EAAMxb,EAAIA,EACfhC,EAAIud,EAAKrc,MAAQ,EACjByC,EAAI4Z,EAAK/hC,OAAS,EAEtB,IAAKytB,IAAOC,EACV,MAAM,IAAI35B,MAAM,6DAIds1B,KAAKwE,IAAIH,GAAMlJ,EAAI6E,KAAKwE,IAAIJ,GAAMtF,GAEhCuF,EAAK,IACPvF,GAAKA,GAEP8Z,EAAK9Z,EAAIsF,EAAKC,EACdwU,EAAK/Z,IAGDsF,EAAK,IACPjJ,GAAKA,GAEPyd,EAAKzd,EACL0d,EAAK1d,EAAIkJ,EAAKD,GAGhB,MAAO,CAAE/G,EAAGA,EAAIub,EAAIzb,EAAGA,EAAI0b,IAjH3Bha,iBAwHF,SAA0BvE,GACxB,IAAIuQ,EAAW1Q,EAAE9wB,IAAI8wB,EAAEgG,MAAMvD,EAAQtC,GAAK,IAAI,WAAa,MAAO,MAQlE,OAPAH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdorB,EAAOvuB,EAAKuuB,KACXjC,EAAE0P,YAAYzN,KACjByO,EAASzO,GAAMvuB,EAAK+zB,OAAS5wB,MAG1B65B,GAhIPvJ,eAuIF,SAAwBhH,GACtB,IAAIgL,EAAMnL,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAChEjC,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdmpB,EAAEa,IAAIntB,EAAM,UACdA,EAAKuuB,MAAQkJ,OA3IjB9D,iBAgJF,SAA0BlH,GAExB,IAAI7kB,EAAS0kB,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAE/D2H,EAAS,GACb5J,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAIorB,EAAO9B,EAAEzsB,KAAKmD,GAAGorB,KAAO3mB,EACvB0kB,EAAEa,IAAI+I,EAAQ3H,KACjB2H,EAAO3H,GAAQ,IAEjB2H,EAAO3H,GAAMhyB,KAAK4G,MAGpB,IAAI0I,EAAQ,EACRuuB,EAAiB3N,EAAEE,QAAQyN,eAC/B9N,EAAEc,KAAK8I,GAAQ,SAAS8E,EAAI7/B,GACtBmxB,EAAE0P,YAAYhB,IAAO7/B,EAAIi/B,GAAmB,IAC5CvuB,EACOA,GACTygB,EAAEc,KAAK4N,GAAI,SAAS73B,GAAKspB,EAAEzsB,KAAKmD,GAAGorB,MAAQ1iB,SAlK/CuiB,cAuKF,SAAuB3B,EAAG1vB,EAAQwxB,EAAMwF,GACtC,IAAI/zB,EAAO,CACTwuB,MAAO,EACP1lB,OAAQ,GAENxM,UAAUZ,QAAU,IACtBsE,EAAKuuB,KAAOA,EACZvuB,EAAK+zB,MAAQA,GAEf,OAAOrF,EAAajC,EAAG,SAAUzsB,EAAMjD,IA/KvCgyB,QAASA,EACTiS,UA+LF,SAAmBiK,EAAYC,GAC7B,IAAI3P,EAAS,CAAE2F,IAAK,GAAIC,IAAK,IAQ7B,OAPA7U,EAAEc,KAAK6d,GAAY,SAAStuC,GACtBuuC,EAAGvuC,GACL4+B,EAAO2F,IAAI3kC,KAAKI,GAEhB4+B,EAAO4F,IAAI5kC,KAAKI,MAGb4+B,GAvMP1P,KA8MF,SAAcpxB,EAAMywC,GAClB,IAAIxhB,EAAQ4C,EAAE6e,MACd,IACE,OAAOD,IACP,QACAvoC,QAAQJ,IAAI9H,EAAO,WAAa6xB,EAAE6e,MAAQzhB,GAAS,QAlNrDoC,OAsNF,SAAgBrxB,EAAMywC,GACpB,OAAOA,OAGP,CAAC1Z,aAAa,EAAEtD,WAAW,KAAKkd,GAAG,CAAC,SAASlyC,EAAQ6E,EAAOF,GAC9DE,EAAOF,QAAU,SAEf,IAAIwtC,GAAG,CAAC,SAASnyC,EAAQ6E,EAAOF,GA+BlC,IAAIytC,EAAMpyC,EAAQ,SAElB6E,EAAOF,QAAU,CACfgzB,MAAOya,EAAIza,MACX9e,KAAM7Y,EAAQ,cACdovC,IAAKpvC,EAAQ,aACb6yB,QAASuf,EAAIvf,UAGb,CAACwf,QAAQ,GAAGC,YAAY,GAAGC,aAAa,KAAKC,GAAG,CAAC,SAASxyC,EAAQ6E,EAAOF,GAC3E,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAoB4uB,GAClB,IAEIkf,EAFA1e,EAAU,GACV2e,EAAQ,GAGZ,SAAS1e,EAAI/pB,GACPmpB,EAAEa,IAAIF,EAAS9pB,KACnB8pB,EAAQ9pB,IAAK,EACbwoC,EAAKpvC,KAAK4G,GACVmpB,EAAEc,KAAKX,EAAEoO,WAAW13B,GAAI+pB,GACxBZ,EAAEc,KAAKX,EAAE8T,aAAap9B,GAAI+pB,IAW5B,OARAZ,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzBwoC,EAAO,GACPze,EAAI/pB,GACAwoC,EAAKjwC,QACPkwC,EAAMrvC,KAAKovC,MAIRC,IAGP,CAACzQ,YAAY,KAAK0Q,GAAG,CAAC,SAAS3yC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QASP,SAAa4uB,EAAGuO,EAAIjH,GACbzH,EAAEwf,QAAQ9Q,KACbA,EAAK,CAACA,IAGR,IAAIpB,EAAM,GACN3M,EAAU,GAQd,OAPAX,EAAEc,KAAK4N,GAAI,SAAS73B,GAClB,IAAKspB,EAAEoP,QAAQ14B,GACb,MAAM,IAAItG,MAAM,6BAA+BsG,IAQrD,SAAS4oC,EAAMtf,EAAGtpB,EAAGu+B,EAAWzU,EAAS2M,GAClCtN,EAAEa,IAAIF,EAAS9pB,KAClB8pB,EAAQ9pB,IAAK,EAERu+B,GAAa9H,EAAIr9B,KAAK4G,GAC3BmpB,EAAEc,KAAKX,EAAEkd,UAAUxmC,IAAI,SAASmqB,GAC9Bye,EAAMtf,EAAGa,EAAGoU,EAAWzU,EAAS2M,MAE9B8H,GAAa9H,EAAIr9B,KAAK4G,IAb1B4oC,CAAMtf,EAAGtpB,EAAa,SAAV4wB,EAAkB9G,EAAS2M,MAElCA,IAeP,CAACuB,YAAY,KAAK6Q,GAAG,CAAC,SAAS9yC,EAAQ6E,EAAOF,GAChD,IAAIouC,EAAW/yC,EAAQ,cACnBozB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAqB4uB,EAAGyf,EAAYC,GAClC,OAAO7f,EAAE8f,UAAU3f,EAAEc,SAAS,SAASqM,EAAKz2B,GAC1Cy2B,EAAIz2B,GAAK8oC,EAASxf,EAAGtpB,EAAG+oC,EAAYC,KACnC,MAGH,CAAChR,YAAY,GAAGkR,aAAa,KAAKC,GAAG,CAAC,SAASpzC,EAAQ6E,EAAOF,GAChE,IAAIyuB,EAAIpzB,EAAQ,aACZqzC,EAAgBrzC,EAAQ,0BAE5B6E,EAAOF,QAIP,SAAkB4uB,EAAGgT,EAAQ1S,EAAUyf,GACrC,OAKF,SAAqB/f,EAAGgT,EAAQ1S,EAAUyf,GACxC,IAEIrpC,EAAGo8B,EAFH5M,EAAU,GACV8Z,EAAK,IAAIF,EAGTG,EAAkB,SAAS7f,GAC7B,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAK1pB,EAAI0pB,EAAKS,EACjC+F,EAASV,EAAQrF,GACjBR,EAASC,EAASF,GAClBpH,EAAW8Z,EAAO9Z,SAAWqH,EAEjC,GAAIA,EAAS,EACX,MAAM,IAAIjwB,MAAM,4DACegwB,EAAO,YAAcC,GAGlDrH,EAAW4N,EAAO5N,WACpB4N,EAAO5N,SAAWA,EAClB4N,EAAOsZ,YAAcxpC,EACrBspC,EAAGG,SAAStf,EAAG7H,KAInBgH,EAAEc,QAAQ1nB,SAAQ,SAAS1C,GACzB,IAAIsiB,EAAWtiB,IAAMs8B,EAAS,EAAIrmB,OAAO2d,kBACzCpE,EAAQxvB,GAAK,CAAEsiB,SAAUA,GACzBgnB,EAAGtrC,IAAIgC,EAAGsiB,MAGZ,KAAOgnB,EAAGjF,OAAS,IACjBrkC,EAAIspC,EAAGI,aACPtN,EAAS5M,EAAQxvB,IACNsiB,WAAarM,OAAO2d,oBAI/ByV,EAAOrpC,GAAG0C,QAAQ6mC,GAGpB,OAAO/Z,EA5CAma,CAAYrgB,EAAGhtB,OAAOggC,GACV1S,GAAYggB,EACZP,GAAU,SAASrpC,GAAK,OAAOspB,EAAEY,SAASlqB,MAL/D,IAAI4pC,EAAsBzgB,EAAE2G,SAAS,IAkDnC,CAAC+Z,yBAAyB,GAAG7R,YAAY,KAAK8R,GAAG,CAAC,SAAS/zC,EAAQ6E,EAAOF,GAC5E,IAAIyuB,EAAIpzB,EAAQ,aACZg0C,EAASh0C,EAAQ,YAErB6E,EAAOF,QAEP,SAAoB4uB,GAClB,OAAOH,EAAE/T,OAAO20B,EAAOzgB,IAAI,SAASkf,GAAQ,OAAOA,EAAKjwC,OAAS,OAGjE,CAACy/B,YAAY,GAAGgS,WAAW,KAAKC,GAAG,CAAC,SAASl0C,EAAQ6E,EAAOF,GAC9D,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAIP,SAAuB4uB,EAAGM,EAAUyf,GAClC,OAKF,SAA0B/f,EAAGM,EAAUyf,GACrC,IAAI7Z,EAAU,GACVpF,EAAQd,EAAEc,QAkCd,OAhCAA,EAAM1nB,SAAQ,SAAS1C,GACrBwvB,EAAQxvB,GAAK,GACbwvB,EAAQxvB,GAAGA,GAAK,CAAEsiB,SAAU,GAC5B8H,EAAM1nB,SAAQ,SAASynB,GACjBnqB,IAAMmqB,IACRqF,EAAQxvB,GAAGmqB,GAAK,CAAE7H,SAAUrM,OAAO2d,uBAGvCyV,EAAOrpC,GAAG0C,SAAQ,SAASgnB,GACzB,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAKS,EAAIT,EAAK1pB,EACjCqW,EAAIuT,EAASF,GACjB8F,EAAQxvB,GAAGmqB,GAAK,CAAE7H,SAAUjM,EAAGmzB,YAAaxpC,SAIhDoqB,EAAM1nB,SAAQ,SAASwP,GACrB,IAAIg4B,EAAO1a,EAAQtd,GACnBkY,EAAM1nB,SAAQ,SAAS1K,GACrB,IAAImyC,EAAO3a,EAAQx3B,GACnBoyB,EAAM1nB,SAAQ,SAASzK,GACrB,IAAImyC,EAAKD,EAAKj4B,GACVm4B,EAAKH,EAAKjyC,GACVqyC,EAAKH,EAAKlyC,GACVsyC,EAAcH,EAAG9nB,SAAW+nB,EAAG/nB,SAC/BioB,EAAcD,EAAGhoB,WACnBgoB,EAAGhoB,SAAWioB,EACdD,EAAGd,YAAca,EAAGb,sBAMrBha,EAzCAgb,CAAiBlhB,EACAM,GAAYggB,EACZP,GAAU,SAASrpC,GAAK,OAAOspB,EAAEY,SAASlqB,MALpE,IAAI4pC,EAAsBzgB,EAAE2G,SAAS,IA+CnC,CAACkI,YAAY,KAAKyS,GAAG,CAAC,SAAS10C,EAAQ6E,EAAOF,GAChDE,EAAOF,QAAU,CACfgwC,WAAY30C,EAAQ,gBACpB+yC,SAAU/yC,EAAQ,cAClB40C,YAAa50C,EAAQ,kBACrB60C,WAAY70C,EAAQ,iBACpB80C,cAAe90C,EAAQ,oBACvB+0C,UAAW/0C,EAAQ,gBACnBwoC,UAAWxoC,EAAQ,eACnBmvC,SAAUnvC,EAAQ,cAClBg1C,KAAMh1C,EAAQ,UACdg0C,OAAQh0C,EAAQ,YAChBi1C,QAASj1C,EAAQ,eAGjB,CAACk1C,eAAe,GAAG/B,aAAa,GAAGgC,iBAAiB,GAAGC,gBAAgB,GAAGC,mBAAmB,GAAGC,eAAe,GAAGC,cAAc,GAAGC,aAAa,GAAGC,SAAS,GAAGxB,WAAW,GAAGyB,YAAY,KAAKC,GAAG,CAAC,SAAS31C,EAAQ6E,EAAOF,GAC5N,IAAIswC,EAAUj1C,EAAQ,aAEtB6E,EAAOF,QAEP,SAAmB4uB,GACjB,IACE0hB,EAAQ1hB,GACR,MAAO3uB,GACP,GAAIA,aAAaqwC,EAAQW,eACvB,OAAO,EAET,MAAMhxC,EAER,OAAO,IAGP,CAAC8wC,YAAY,KAAKG,GAAG,CAAC,SAAS71C,EAAQ6E,EAAOF,GAChD,IAAIqvB,EAAMh0B,EAAQ,SAElB6E,EAAOF,QAEP,SAAmB4uB,EAAGuO,GACpB,OAAO9N,EAAIT,EAAGuO,EAAI,UAGlB,CAACgU,QAAQ,KAAKC,GAAG,CAAC,SAAS/1C,EAAQ6E,EAAOF,GAC5C,IAAIqvB,EAAMh0B,EAAQ,SAElB6E,EAAOF,QAEP,SAAkB4uB,EAAGuO,GACnB,OAAO9N,EAAIT,EAAGuO,EAAI,SAGlB,CAACgU,QAAQ,KAAKE,GAAG,CAAC,SAASh2C,EAAQ6E,EAAOF,GAC5C,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,YAChBqzC,EAAgBrzC,EAAQ,0BAE5B6E,EAAOF,QAEP,SAAc4uB,EAAGyf,GACf,IAGI/oC,EAHAo4B,EAAS,IAAI1K,EACbse,EAAU,GACV1C,EAAK,IAAIF,EAGb,SAASG,EAAgB7f,GACvB,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAKS,EAAIT,EAAK1pB,EACjCisC,EAAM3C,EAAG4C,SAAS/hB,GACtB,QAAY7uB,IAAR2wC,EAAmB,CACrB,IAAIld,EAAaga,EAAWrf,GACxBqF,EAAakd,IACfD,EAAQ7hB,GAAKnqB,EACbspC,EAAGG,SAAStf,EAAG4E,KAKrB,GAAsB,IAAlBzF,EAAEkF,YACJ,OAAO4J,EAGTjP,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzBspC,EAAGtrC,IAAIgC,EAAGiW,OAAO2d,mBACjBwE,EAAOlK,QAAQluB,MAIjBspC,EAAGG,SAASngB,EAAEc,QAAQ,GAAI,GAE1B,IAAI9jB,GAAO,EACX,KAAOgjC,EAAGjF,OAAS,GAAG,CAEpB,GADArkC,EAAIspC,EAAGI,YACHvgB,EAAEa,IAAIgiB,EAAShsC,GACjBo4B,EAAO1N,QAAQ1qB,EAAGgsC,EAAQhsC,QACrB,CAAA,GAAIsG,EACT,MAAM,IAAI5M,MAAM,iCAAmC4vB,GAEnDhjB,GAAO,EAGTgjB,EAAE0a,UAAUhkC,GAAG0C,QAAQ6mC,GAGzB,OAAOnR,IAGP,CAACyR,yBAAyB,GAAGsC,WAAW,GAAGnU,YAAY,KAAKoU,GAAG,CAAC,SAASr2C,EAAQ6E,EAAOF,GAC1F,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAgB4uB,GACd,IAAIzvB,EAAQ,EACRgwB,EAAQ,GACRC,EAAU,GACV0F,EAAU,GAqCd,OANAlG,EAAEc,QAAQ1nB,SAAQ,SAAS1C,GACpBmpB,EAAEa,IAAIF,EAAS9pB,IA9BtB,SAAS+pB,EAAI/pB,GACX,IAAIktB,EAAQpD,EAAQ9pB,GAAK,CACvBqsC,SAAS,EACTC,QAASzyC,EACTA,MAAOA,KAaT,GAXAgwB,EAAMzwB,KAAK4G,GAEXspB,EAAEoO,WAAW13B,GAAG0C,SAAQ,SAASynB,GAC1BhB,EAAEa,IAAIF,EAASK,GAGTL,EAAQK,GAAGkiB,UACpBnf,EAAMof,QAAUtd,KAAKsF,IAAIpH,EAAMof,QAASxiB,EAAQK,GAAGtwB,SAHnDkwB,EAAII,GACJ+C,EAAMof,QAAUtd,KAAKsF,IAAIpH,EAAMof,QAASxiB,EAAQK,GAAGmiB,aAMnDpf,EAAMof,UAAYpf,EAAMrzB,MAAO,CACjC,IACIswB,EADAqe,EAAO,GAEX,GACEre,EAAIN,EAAM4S,MACV3S,EAAQK,GAAGkiB,SAAU,EACrB7D,EAAKpvC,KAAK+wB,SACHnqB,IAAMmqB,GACfqF,EAAQp2B,KAAKovC,IAMbze,CAAI/pB,MAIDwvB,IAGP,CAACwI,YAAY,KAAKuU,GAAG,CAAC,SAASx2C,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAKhB,SAASi1C,EAAQ1hB,GACf,IAAIQ,EAAU,GACVD,EAAQ,GACR2F,EAAU,GAkBd,GAFArG,EAAEc,KAAKX,EAAEoG,SAdT,SAAS8c,EAAM3vC,GACb,GAAIssB,EAAEa,IAAIH,EAAOhtB,GACf,MAAM,IAAI8uC,EAGPxiB,EAAEa,IAAIF,EAASjtB,KAClBgtB,EAAMhtB,IAAQ,EACditB,EAAQjtB,IAAQ,EAChBssB,EAAEc,KAAKX,EAAE8T,aAAavgC,GAAO2vC,UACtB3iB,EAAMhtB,GACb2yB,EAAQp2B,KAAKyD,OAMbssB,EAAEkb,KAAKva,KAAaR,EAAEkF,YACxB,MAAM,IAAImd,EAGZ,OAAOnc,EAGT,SAASmc,KA/BT/wC,EAAOF,QAAUswC,EACjBA,EAAQW,eAAiBA,GAgCvB,CAAC3T,YAAY,KAAKyU,GAAG,CAAC,SAAS12C,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAWhB,SAASqzC,IACPntC,KAAKywC,KAAO,GACZzwC,KAAK0wC,YAAc,GAXrB/xC,EAAOF,QAAU0uC,EAiBjBA,EAAcxyC,UAAUytC,KAAO,WAC7B,OAAOpoC,KAAKywC,KAAKn0C,QAMnB6wC,EAAcxyC,UAAUof,KAAO,WAC7B,OAAO/Z,KAAKywC,KAAKr0C,KAAI,SAASg0B,GAAK,OAAOA,EAAEpa,QAM9Cm3B,EAAcxyC,UAAUozB,IAAM,SAAS/X,GACrC,OAAOkX,EAAEa,IAAI/tB,KAAK0wC,YAAa16B,IASjCm3B,EAAcxyC,UAAUs1C,SAAW,SAASj6B,GAC1C,IAAIpY,EAAQoC,KAAK0wC,YAAY16B,GAC7B,QAAc3W,IAAVzB,EACF,OAAOoC,KAAKywC,KAAK7yC,GAAOqyC,UAQ5B9C,EAAcxyC,UAAU09B,IAAM,WAC5B,GAAoB,IAAhBr4B,KAAKooC,OACP,MAAM,IAAI3qC,MAAM,mBAElB,OAAOuC,KAAKywC,KAAK,GAAGz6B,KAWtBm3B,EAAcxyC,UAAUoH,IAAM,SAASiU,EAAKi6B,GAC1C,IAAIU,EAAa3wC,KAAK0wC,YAEtB,GADA16B,EAAM3V,OAAO2V,IACRkX,EAAEa,IAAI4iB,EAAY36B,GAAM,CAC3B,IAAIkQ,EAAMlmB,KAAKywC,KACX7yC,EAAQsoB,EAAI5pB,OAIhB,OAHAq0C,EAAW36B,GAAOpY,EAClBsoB,EAAI/oB,KAAK,CAAC6Y,IAAKA,EAAKi6B,SAAUA,IAC9BjwC,KAAK4wC,UAAUhzC,IACR,EAET,OAAO,GAMTuvC,EAAcxyC,UAAU8yC,UAAY,WAClCztC,KAAK6wC,MAAM,EAAG7wC,KAAKywC,KAAKn0C,OAAS,GACjC,IAAI+7B,EAAMr4B,KAAKywC,KAAKjQ,MAGpB,cAFOxgC,KAAK0wC,YAAYrY,EAAIriB,KAC5BhW,KAAK8wC,SAAS,GACPzY,EAAIriB,KAUbm3B,EAAcxyC,UAAU6yC,SAAW,SAASx3B,EAAKi6B,GAC/C,IAAIryC,EAAQoC,KAAK0wC,YAAY16B,GAC7B,GAAIi6B,EAAWjwC,KAAKywC,KAAK7yC,GAAOqyC,SAC9B,MAAM,IAAIxyC,MAAM,uDACFuY,EAAM,SAAWhW,KAAKywC,KAAK7yC,GAAOqyC,SAAW,SAAWA,GAExEjwC,KAAKywC,KAAK7yC,GAAOqyC,SAAWA,EAC5BjwC,KAAK4wC,UAAUhzC,IAGjBuvC,EAAcxyC,UAAUm2C,SAAW,SAAS/0C,GAC1C,IAAImqB,EAAMlmB,KAAKywC,KACXjwB,EAAI,EAAIzkB,EACRuY,EAAIkM,EAAI,EACRuwB,EAAUh1C,EACVykB,EAAI0F,EAAI5pB,SACVy0C,EAAU7qB,EAAI1F,GAAGyvB,SAAW/pB,EAAI6qB,GAASd,SAAWzvB,EAAIuwB,EACpDz8B,EAAI4R,EAAI5pB,SACVy0C,EAAU7qB,EAAI5R,GAAG27B,SAAW/pB,EAAI6qB,GAASd,SAAW37B,EAAIy8B,GAEtDA,IAAYh1C,IACdiE,KAAK6wC,MAAM90C,EAAGg1C,GACd/wC,KAAK8wC,SAASC,MAKpB5D,EAAcxyC,UAAUi2C,UAAY,SAAShzC,GAI3C,IAHA,IAEI0S,EAFA4V,EAAMlmB,KAAKywC,KACXR,EAAW/pB,EAAItoB,GAAOqyC,SAET,IAAVryC,KAEDsoB,EADJ5V,EAAS1S,GAAS,GACFqyC,SAAWA,IAG3BjwC,KAAK6wC,MAAMjzC,EAAO0S,GAClB1S,EAAQ0S,GAIZ68B,EAAcxyC,UAAUk2C,MAAQ,SAAS90C,EAAGC,GAC1C,IAAIkqB,EAAMlmB,KAAKywC,KACXE,EAAa3wC,KAAK0wC,YAClBM,EAAW9qB,EAAInqB,GACfk1C,EAAW/qB,EAAIlqB,GACnBkqB,EAAInqB,GAAKk1C,EACT/qB,EAAIlqB,GAAKg1C,EACTL,EAAWM,EAASj7B,KAAOja,EAC3B40C,EAAWK,EAASh7B,KAAOha,IAG3B,CAAC+/B,YAAY,KAAKmV,GAAG,CAAC,SAASp3C,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,YAEhB6E,EAAOF,QAAUgzB,EAgBjB,SAASA,EAAMmD,GACb50B,KAAKmxC,aAAcjkB,EAAEa,IAAI6G,EAAM,aAAcA,EAAKuT,SAClDnoC,KAAKoxC,gBAAgBlkB,EAAEa,IAAI6G,EAAM,eAAgBA,EAAK7C,WACtD/xB,KAAKqxC,cAAcnkB,EAAEa,IAAI6G,EAAM,aAAcA,EAAK9C,SAGlD9xB,KAAKsxC,YAASjyC,EAGdW,KAAKuxC,oBAAsBrkB,EAAE2G,cAASx0B,GAGtCW,KAAKwxC,oBAAsBtkB,EAAE2G,cAASx0B,GAGtCW,KAAKyxC,OAAS,GAEVzxC,KAAKqxC,cAEPrxC,KAAKyR,QAAU,GAGfzR,KAAK0xC,UAAY,GACjB1xC,KAAK0xC,UApCQ,MAoCgB,IAI/B1xC,KAAK2xC,IAAM,GAGX3xC,KAAK4xC,OAAS,GAGd5xC,KAAK6xC,KAAO,GAGZ7xC,KAAK8xC,MAAQ,GAGb9xC,KAAK+xC,UAAY,GAGjB/xC,KAAKgyC,YAAc,GAgXrB,SAASC,EAAqB71C,EAAK6Z,GAC7BiX,EAAEa,IAAI3xB,EAAK6Z,GACb7Z,EAAI6Z,KAEJ7Z,EAAI6Z,GAAK,EAIb,SAASi8B,EAAuB91C,EAAK6Z,KAC5B7Z,EAAI6Z,WAAa7Z,EAAI6Z,GAG9B,SAASk8B,EAAaC,EAAYruC,EAAGmqB,EAAG7yB,GACtC,IAAK+2C,GAAcruC,EAAImqB,EAAG,CACxB,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,OAAO97B,EAxbY,IAwbSmqB,EAxbT,KAybPhB,EAAE0P,YAAYvhC,GA3bJ,KA2bgCA,GAGxD,SAASg3C,EAAcD,EAAYruC,EAAGmqB,EAAG7yB,GACvC,IAAK+2C,GAAcruC,EAAImqB,EAAG,CACxB,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,IAAIvE,EAAW,CAAEv3B,EAAGA,EAAGmqB,EAAGA,GAI1B,OAHI7yB,IACFigC,EAAQjgC,KAAOA,GAEVigC,EAGT,SAASgX,EAAYF,EAAY9W,GAC/B,OAAO6W,EAAaC,EAAY9W,EAAQv3B,EAAGu3B,EAAQpN,EAAGoN,EAAQjgC,MAhZhEo2B,EAAM92B,UAAU43C,WAAa,EAG7B9gB,EAAM92B,UAAU63C,WAAa,EAK7B/gB,EAAM92B,UAAUy3C,WAAa,WAC3B,OAAOpyC,KAAKmxC,aAGd1f,EAAM92B,UAAUwwC,aAAe,WAC7B,OAAOnrC,KAAKoxC,eAGd3f,EAAM92B,UAAU83C,WAAa,WAC3B,OAAOzyC,KAAKqxC,aAGd5f,EAAM92B,UAAUq3B,SAAW,SAAS3D,GAElC,OADAruB,KAAKsxC,OAASjjB,EACPruB,MAGTyxB,EAAM92B,UAAU4yB,MAAQ,WACtB,OAAOvtB,KAAKsxC,QAMd7f,EAAM92B,UAAUgiC,oBAAsB,SAAS+V,GAK7C,OAJKxlB,EAAEylB,WAAWD,KAChBA,EAAaxlB,EAAE2G,SAAS6e,IAE1B1yC,KAAKuxC,oBAAsBmB,EACpB1yC,MAGTyxB,EAAM92B,UAAU43B,UAAY,WAC1B,OAAOvyB,KAAKuyC,YAGd9gB,EAAM92B,UAAUwzB,MAAQ,WACtB,OAAOjB,EAAEnT,KAAK/Z,KAAKyxC,SAGrBhgB,EAAM92B,UAAU64B,QAAU,WACxB,OAAOtG,EAAE/T,OAAOnZ,KAAKmuB,SAAS,SAASpqB,GACrC,OAAOmpB,EAAE7D,QAAQrpB,KAAK2xC,IAAI5tC,MACzB/D,OAGLyxB,EAAM92B,UAAU84B,MAAQ,WACtB,OAAOvG,EAAE/T,OAAOnZ,KAAKmuB,SAAS,SAASpqB,GACrC,OAAOmpB,EAAE7D,QAAQrpB,KAAK6xC,KAAK9tC,MAC1B/D,OAGLyxB,EAAM92B,UAAUi4C,SAAW,SAAShX,EAAIr+B,GACtC,IAAIN,EAAOC,UAQX,OAPAgwB,EAAEc,KAAK4N,GAAI,SAAS73B,GACd9G,EAAKX,OAAS,EAChB0D,KAAKiyB,QAAQluB,EAAGxG,GAEhByC,KAAKiyB,QAAQluB,KAEd/D,MACIA,MAGTyxB,EAAM92B,UAAUs3B,QAAU,SAASluB,EAAGxG,GACpC,OAAI2vB,EAAEa,IAAI/tB,KAAKyxC,OAAQ1tC,IACjB7G,UAAUZ,OAAS,IACrB0D,KAAKyxC,OAAO1tC,GAAKxG,GAEZyC,OAGTA,KAAKyxC,OAAO1tC,GAAK7G,UAAUZ,OAAS,EAAIiB,EAAQyC,KAAKuxC,oBAAoBxtC,GACrE/D,KAAKqxC,cACPrxC,KAAKyR,QAAQ1N,GA7IA,KA8Ib/D,KAAK0xC,UAAU3tC,GAAK,GACpB/D,KAAK0xC,UA/IQ,MA+Ic3tC,IAAK,GAElC/D,KAAK2xC,IAAI5tC,GAAK,GACd/D,KAAK4xC,OAAO7tC,GAAK,GACjB/D,KAAK6xC,KAAK9tC,GAAK,GACf/D,KAAK8xC,MAAM/tC,GAAK,KACd/D,KAAKuyC,WACAvyC,OAGTyxB,EAAM92B,UAAUiG,KAAO,SAASmD,GAC9B,OAAO/D,KAAKyxC,OAAO1tC,IAGrB0tB,EAAM92B,UAAU8hC,QAAU,SAAS14B,GACjC,OAAOmpB,EAAEa,IAAI/tB,KAAKyxC,OAAQ1tC,IAG5B0tB,EAAM92B,UAAU+4B,WAAc,SAAS3vB,GACrC,IAAIgoB,EAAO/rB,KACX,GAAIktB,EAAEa,IAAI/tB,KAAKyxC,OAAQ1tC,GAAI,CACzB,IAAIuqB,EAAa,SAAS5vB,GAAKqtB,EAAKuC,WAAWvC,EAAKgmB,UAAUrzC,YACvDsB,KAAKyxC,OAAO1tC,GACf/D,KAAKqxC,cACPrxC,KAAK6yC,4BAA4B9uC,UAC1B/D,KAAKyR,QAAQ1N,GACpBmpB,EAAEc,KAAKhuB,KAAKwF,SAASzB,IAAI,SAASq2B,GAChCp6B,KAAKuvB,UAAU6K,KACdp6B,aACIA,KAAK0xC,UAAU3tC,IAExBmpB,EAAEc,KAAKd,EAAEnT,KAAK/Z,KAAK2xC,IAAI5tC,IAAKuqB,UACrBtuB,KAAK2xC,IAAI5tC,UACT/D,KAAK4xC,OAAO7tC,GACnBmpB,EAAEc,KAAKd,EAAEnT,KAAK/Z,KAAK6xC,KAAK9tC,IAAKuqB,UACtBtuB,KAAK6xC,KAAK9tC,UACV/D,KAAK8xC,MAAM/tC,KAChB/D,KAAKuyC,WAET,OAAOvyC,MAGTyxB,EAAM92B,UAAU40B,UAAY,SAASxrB,EAAGuM,GACtC,IAAKtQ,KAAKqxC,YACR,MAAM,IAAI5zC,MAAM,6CAGlB,GAAIyvB,EAAE0P,YAAYtsB,GAChBA,EA/La,SAgMR,CACL,IAAK,IAAIwiC,EAAWxiC,GACd4c,EAAE0P,YAAYkW,GACfA,EAAW9yC,KAAKsQ,OAAOwiC,GAC1B,GAAIA,IAAa/uC,EACf,MAAM,IAAItG,MAAM,WAAa6S,EAAQ,iBAAmBvM,EACxC,gCAIpB/D,KAAKiyB,QAAQ3hB,GAOf,OAJAtQ,KAAKiyB,QAAQluB,GACb/D,KAAK6yC,4BAA4B9uC,GACjC/D,KAAKyR,QAAQ1N,GAAKuM,EAClBtQ,KAAK0xC,UAAUphC,GAAQvM,IAAK,EACrB/D,MAGTyxB,EAAM92B,UAAUk4C,4BAA8B,SAAS9uC,UAC9C/D,KAAK0xC,UAAU1xC,KAAKyR,QAAQ1N,IAAIA,IAGzC0tB,EAAM92B,UAAU2V,OAAS,SAASvM,GAChC,GAAI/D,KAAKqxC,YAAa,CACpB,IAAI/gC,EAAStQ,KAAKyR,QAAQ1N,GAC1B,GA3Na,OA2NTuM,EACF,OAAOA,IAKbmhB,EAAM92B,UAAU6K,SAAW,SAASzB,GAKlC,GAJImpB,EAAE0P,YAAY74B,KAChBA,EAnOa,MAsOX/D,KAAKqxC,YAAa,CACpB,IAAI7rC,EAAWxF,KAAK0xC,UAAU3tC,GAC9B,GAAIyB,EACF,OAAO0nB,EAAEnT,KAAKvU,OAEX,CAAA,GA3OQ,OA2OJzB,EACT,OAAO/D,KAAKmuB,QACP,GAAInuB,KAAKy8B,QAAQ14B,GACtB,MAAO,KAIX0tB,EAAM92B,UAAUwmC,aAAe,SAASp9B,GACtC,IAAIgvC,EAAS/yC,KAAK4xC,OAAO7tC,GACzB,GAAIgvC,EACF,OAAO7lB,EAAEnT,KAAKg5B,IAIlBthB,EAAM92B,UAAU8gC,WAAa,SAAS13B,GACpC,IAAIivC,EAAQhzC,KAAK8xC,MAAM/tC,GACvB,GAAIivC,EACF,OAAO9lB,EAAEnT,KAAKi5B,IAIlBvhB,EAAM92B,UAAU4vC,UAAY,SAASxmC,GACnC,IAAIynC,EAAQxrC,KAAKmhC,aAAap9B,GAC9B,GAAIynC,EACF,OAAOte,EAAE+lB,MAAMzH,EAAOxrC,KAAKy7B,WAAW13B,KAM1C0tB,EAAM92B,UAAUu4C,oBAAsB,SAASR,GAK7C,OAJKxlB,EAAEylB,WAAWD,KAChBA,EAAaxlB,EAAE2G,SAAS6e,IAE1B1yC,KAAKwxC,oBAAsBkB,EACpB1yC,MAGTyxB,EAAM92B,UAAUw4C,UAAY,WAC1B,OAAOnzC,KAAKwyC,YAGd/gB,EAAM92B,UAAUi0B,MAAQ,WACtB,OAAO1B,EAAEia,OAAOnnC,KAAK+xC,YAGvBtgB,EAAM92B,UAAUy4C,QAAU,SAASxX,EAAIr+B,GACrC,IAAIwuB,EAAO/rB,KACP/C,EAAOC,UASX,OARAgwB,EAAEiF,OAAOyJ,GAAI,SAAS73B,EAAGmqB,GAMvB,OALIjxB,EAAKX,OAAS,EAChByvB,EAAK0C,QAAQ1qB,EAAGmqB,EAAG3wB,GAEnBwuB,EAAK0C,QAAQ1qB,EAAGmqB,GAEXA,KAEFluB,MAOTyxB,EAAM92B,UAAU8zB,QAAU,WACxB,IAAI1qB,EAAGmqB,EAAG7yB,EAAMkC,EACZ81C,GAAiB,EAEjBnmB,EAAEomB,cAAcp2C,UAAU,KAC5B6G,EAAI7G,UAAU,GAAG6G,EACjBmqB,EAAIhxB,UAAU,GAAGgxB,EACjB7yB,EAAO6B,UAAU,GAAG7B,KACK,IAArB6B,UAAUZ,SACZiB,EAAQL,UAAU,GAClBm2C,GAAiB,KAGnBtvC,EAAI7G,UAAU,GACdgxB,EAAIhxB,UAAU,GACd7B,EAAO6B,UAAU,GACbA,UAAUZ,OAAS,IACrBiB,EAAQL,UAAU,GAClBm2C,GAAiB,IAIrBtvC,EAAI,GAAKA,EACTmqB,EAAI,GAAKA,EACJhB,EAAE0P,YAAYvhC,KACjBA,EAAO,GAAKA,GAGd,IAAIqD,EAAIyzC,EAAanyC,KAAKmxC,YAAaptC,EAAGmqB,EAAG7yB,GAC7C,GAAI6xB,EAAEa,IAAI/tB,KAAKgyC,YAAatzC,GAI1B,OAHI20C,IACFrzC,KAAKgyC,YAAYtzC,GAAKnB,GAEjByC,KAGT,IAAKktB,EAAE0P,YAAYvhC,KAAU2E,KAAKoxC,cAChC,MAAM,IAAI3zC,MAAM,qDAKlBuC,KAAKiyB,QAAQluB,GACb/D,KAAKiyB,QAAQ/D,GAEbluB,KAAKgyC,YAAYtzC,GAAK20C,EAAiB91C,EAAQyC,KAAKwxC,oBAAoBztC,EAAGmqB,EAAG7yB,GAE9E,IAAIigC,EAAU+W,EAAcryC,KAAKmxC,YAAaptC,EAAGmqB,EAAG7yB,GAYpD,OAVA0I,EAAIu3B,EAAQv3B,EACZmqB,EAAIoN,EAAQpN,EAEZxzB,OAAO64C,OAAOjY,GACdt7B,KAAK+xC,UAAUrzC,GAAK48B,EACpB2W,EAAqBjyC,KAAK4xC,OAAO1jB,GAAInqB,GACrCkuC,EAAqBjyC,KAAK8xC,MAAM/tC,GAAImqB,GACpCluB,KAAK2xC,IAAIzjB,GAAGxvB,GAAK48B,EACjBt7B,KAAK6xC,KAAK9tC,GAAGrF,GAAK48B,EAClBt7B,KAAKwyC,aACExyC,MAGTyxB,EAAM92B,UAAU8yB,KAAO,SAAS1pB,EAAGmqB,EAAG7yB,GACpC,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACPg2C,EAAYtyC,KAAKmxC,YAAaj0C,UAAU,IACxCi1C,EAAanyC,KAAKmxC,YAAaptC,EAAGmqB,EAAG7yB,GACjD,OAAO2E,KAAKgyC,YAAYtzC,IAG1B+yB,EAAM92B,UAAUuvC,QAAU,SAASnmC,EAAGmqB,EAAG7yB,GACvC,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACPg2C,EAAYtyC,KAAKmxC,YAAaj0C,UAAU,IACxCi1C,EAAanyC,KAAKmxC,YAAaptC,EAAGmqB,EAAG7yB,GACjD,OAAO6xB,EAAEa,IAAI/tB,KAAKgyC,YAAatzC,IAGjC+yB,EAAM92B,UAAU2zB,WAAa,SAASvqB,EAAGmqB,EAAG7yB,GAC1C,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACPg2C,EAAYtyC,KAAKmxC,YAAaj0C,UAAU,IACxCi1C,EAAanyC,KAAKmxC,YAAaptC,EAAGmqB,EAAG7yB,GAC7CoyB,EAAOztB,KAAK+xC,UAAUrzC,GAY1B,OAXI+uB,IACF1pB,EAAI0pB,EAAK1pB,EACTmqB,EAAIT,EAAKS,SACFluB,KAAKgyC,YAAYtzC,UACjBsB,KAAK+xC,UAAUrzC,GACtBwzC,EAAuBlyC,KAAK4xC,OAAO1jB,GAAInqB,GACvCmuC,EAAuBlyC,KAAK8xC,MAAM/tC,GAAImqB,UAC/BluB,KAAK2xC,IAAIzjB,GAAGxvB,UACZsB,KAAK6xC,KAAK9tC,GAAGrF,GACpBsB,KAAKwyC,cAEAxyC,MAGTyxB,EAAM92B,UAAUo5B,QAAU,SAAShwB,EAAGmoB,GACpC,IAAIgQ,EAAMl8B,KAAK2xC,IAAI5tC,GACnB,GAAIm4B,EAAK,CACP,IAAItN,EAAQ1B,EAAEia,OAAOjL,GACrB,OAAKhQ,EAGEgB,EAAE/T,OAAOyV,GAAO,SAASnB,GAAQ,OAAOA,EAAK1pB,IAAMmoB,KAFjD0C,IAMb6C,EAAM92B,UAAUszB,SAAW,SAASlqB,EAAGmqB,GACrC,IAAIslB,EAAOxzC,KAAK6xC,KAAK9tC,GACrB,GAAIyvC,EAAM,CACR,IAAI5kB,EAAQ1B,EAAEia,OAAOqM,GACrB,OAAKtlB,EAGEhB,EAAE/T,OAAOyV,GAAO,SAASnB,GAAQ,OAAOA,EAAKS,IAAMA,KAFjDU,IAMb6C,EAAM92B,UAAUotC,UAAY,SAAShkC,EAAGmqB,GACtC,IAAI6F,EAAU/zB,KAAK+zB,QAAQhwB,EAAGmqB,GAC9B,GAAI6F,EACF,OAAOA,EAAQp3B,OAAOqD,KAAKiuB,SAASlqB,EAAGmqB,MA2CzC,CAACY,WAAW,KAAK2kB,GAAG,CAAC,SAAS35C,EAAQ6E,EAAOF,GAE/CE,EAAOF,QAAU,CACfgzB,MAAO33B,EAAQ,WACf6yB,QAAS7yB,EAAQ,eAGjB,CAAC45C,UAAU,GAAGC,YAAY,KAAKC,GAAG,CAAC,SAAS95C,EAAQ6E,EAAOF,GAC7D,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,WAuBpB,SAAS+5C,EAAWxmB,GAClB,OAAOH,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAC/B,IAAIgC,EAAYsnB,EAAEzsB,KAAKmD,GACnBuM,EAAS+c,EAAE/c,OAAOvM,GAClBnD,EAAO,CAAEmD,EAAGA,GAOhB,OANKmpB,EAAE0P,YAAY72B,KACjBnF,EAAKrD,MAAQwI,GAEVmnB,EAAE0P,YAAYtsB,KACjB1P,EAAK0P,OAASA,GAET1P,KAIX,SAASkzC,EAAWzmB,GAClB,OAAOH,EAAE9wB,IAAIixB,EAAEuB,SAAS,SAASlwB,GAC/B,IAAIq1C,EAAY1mB,EAAEI,KAAK/uB,GACnB+uB,EAAO,CAAE1pB,EAAGrF,EAAEqF,EAAGmqB,EAAGxvB,EAAEwvB,GAO1B,OANKhB,EAAE0P,YAAYl+B,EAAErD,QACnBoyB,EAAKpyB,KAAOqD,EAAErD,MAEX6xB,EAAE0P,YAAYmX,KACjBtmB,EAAKlwB,MAAQw2C,GAERtmB,KA9CX9uB,EAAOF,QAAU,CACfu1C,MAIF,SAAe3mB,GACb,IAAI1a,EAAO,CACT4T,QAAS,CACP4hB,SAAU9a,EAAE+kB,aACZrgB,WAAY1E,EAAE8d,eACdrZ,SAAUzE,EAAEolB,cAEdtkB,MAAO0lB,EAAWxmB,GAClBuB,MAAOklB,EAAWzmB,IAEfH,EAAE0P,YAAYvP,EAAEE,WACnB5a,EAAKpV,MAAQ2vB,EAAE+mB,MAAM5mB,EAAEE,UAEzB,OAAO5a,GAhBPuhC,KAgDF,SAAcvhC,GACZ,IAAI0a,EAAI,IAAIoE,EAAM9e,EAAK4T,SAASyL,SAASrf,EAAKpV,OAU9C,OATA2vB,EAAEc,KAAKrb,EAAKwb,OAAO,SAAS8C,GAC1B5D,EAAE4E,QAAQhB,EAAMltB,EAAGktB,EAAM1zB,OACrB0zB,EAAM3gB,QACR+c,EAAEkC,UAAU0B,EAAMltB,EAAGktB,EAAM3gB,WAG/B4c,EAAEc,KAAKrb,EAAKic,OAAO,SAASqC,GAC1B5D,EAAEoB,QAAQ,CAAE1qB,EAAGktB,EAAMltB,EAAGmqB,EAAG+C,EAAM/C,EAAG7yB,KAAM41B,EAAM51B,MAAQ41B,EAAM1zB,UAEzD8vB,KAGP,CAACqmB,UAAU,GAAG5kB,WAAW,KAAKqlB,GAAG,CAAC,SAASr6C,EAAQ6E,EAAOF,GAC5DE,EAAOF,QAAQ3E,EAAQ,KACrB,CAACs6C,+CAA+C,GAAGpa,OAAS,KAAKqa,GAAG,CAAC,SAASv6C,EAAQ6E,EAAOF,GAC/FE,EAAOF,QAAU,SAEf,IAAI61C,GAAG,CAAC,SAASx6C,EAAQ6E,EAAOF,IAClC,SAAWqtB,IAUT,WAGA,IAGIyoB,EAAY,GACZC,EAAa,GAGbC,EAAY,EAGZC,GAAa,IAAIx5B,KAAO,GAqBxBy5B,EAAuB,iBACvBC,EAAsB,qBACtBC,EAAwB,gCAMxBC,EAAe,kCAGfC,EAAU,OAGVC,EAAa,2BAGbC,EAAgB,mBAGhBC,EAA0B90C,OAAO,8DAGjC+0C,EAAY,OAGZC,EAAS,WAGTC,EAAoB,2BAGpBC,EAAe,CACjB,QAAS,UAAW,OAAQ,WAAY,OAAQ,SAAU,SAC1D,SAAU,SAAU,IAAK,cAAe,eAAgB,WAAY,QACpE,WAAY,cAIVC,EAAkB,EAGlBC,EAAY,qBACZC,EAAa,iBACbC,EAAY,mBACZC,EAAY,gBAGZC,EAAc,kBAEdC,EAAc,kBAGdC,EAAmB,CACvBC,qBAA8B,GAC9BD,EAAiBN,GAAaM,EAAiBL,GAC/CK,EAAiBJ,GAAaI,EAAiBH,GAC/CG,EAVkB,mBAUcA,EAAiBF,GACjDE,EATkB,mBAScA,EAAiBD,IAAe,EAGhE,IAAIG,EAAkB,CACpBC,SAAW,EACXC,QAAW,EACXC,UAAY,GAIVC,EAAa,CACfC,cAAgB,EAChBC,YAAc,EACd/4C,MAAS,KACTg5C,UAAY,GAIVC,EAAc,CAChBC,SAAW,EACXC,UAAY,EACZC,QAAU,EACVC,QAAU,EACVnvC,QAAU,EACVpI,WAAa,GAIXw3C,EAAgB,CAClBC,KAAM,KACNC,IAAK,IACLC,KAAM,IACNC,KAAM,IACNC,KAAM,IACNC,SAAU,QACVC,SAAU,SAIRllC,EAAQskC,SAAmB52C,SAAWA,QAAWI,KAGjDq3C,EAAcb,SAAmB/3C,IAAYA,IAAYA,EAAQyH,UAAYzH,EAG7E64C,EAAad,SAAmB73C,IAAWA,IAAWA,EAAOuH,UAAYvH,EAGzE44C,EAAgBD,GAAcA,EAAW74C,UAAY44C,GAAeA,EAGpEG,EAAahB,SAAmB1qB,IAAWA,EAiB/C,SAAS2rB,EAAYC,EAAOn6C,EAAOo6C,GAIjC,IAHA,IAAI/5C,GAAS+5C,GAAa,GAAK,EAC3Br7C,EAASo7C,EAAQA,EAAMp7C,OAAS,IAE3BsB,EAAQtB,GACf,GAAIo7C,EAAM95C,KAAWL,EACnB,OAAOK,EAGX,OAAQ,EAYV,SAASg6C,EAAaC,EAAOt6C,GAC3B,IAAI6F,SAAc7F,EAGlB,GAFAs6C,EAAQA,EAAMA,MAEF,WAARz0C,GAA8B,MAAT7F,EACvB,OAAOs6C,EAAMt6C,GAAS,GAAK,EAEjB,UAAR6F,GAA4B,UAARA,IACtBA,EAAO,UAET,IAAI4S,EAAc,UAAR5S,EAAmB7F,EAAQm3C,EAAYn3C,EAGjD,OAFAs6C,GAASA,EAAQA,EAAMz0C,KAAUy0C,EAAM7hC,GAExB,UAAR5S,EACFy0C,GAASJ,EAAYI,EAAOt6C,IAAU,EAAI,GAAK,EAC/Cs6C,EAAQ,GAAK,EASpB,SAASC,EAAUv6C,GACjB,IAAIs6C,EAAQ73C,KAAK63C,MACbz0C,SAAc7F,EAElB,GAAY,WAAR6F,GAA8B,MAAT7F,EACvBs6C,EAAMt6C,IAAS,MACV,CACO,UAAR6F,GAA4B,UAARA,IACtBA,EAAO,UAET,IAAI4S,EAAc,UAAR5S,EAAmB7F,EAAQm3C,EAAYn3C,EAC7Cw6C,EAAYF,EAAMz0C,KAAUy0C,EAAMz0C,GAAQ,IAElC,UAARA,GACD20C,EAAU/hC,KAAS+hC,EAAU/hC,GAAO,KAAK7Y,KAAKI,GAE/Cw6C,EAAU/hC,IAAO,GAavB,SAASgiC,EAAez6C,GACtB,OAAOA,EAAM06C,WAAW,GAY1B,SAASC,EAAiBvkC,EAAGlE,GAM3B,IALA,IAAI0oC,EAAKxkC,EAAEykC,SACPC,EAAK5oC,EAAE2oC,SACPx6C,GAAS,EACTtB,EAAS67C,EAAG77C,SAEPsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQ46C,EAAGv6C,GACXqjC,EAAQoX,EAAGz6C,GAEf,GAAIL,IAAU0jC,EAAO,CACnB,GAAI1jC,EAAQ0jC,QAAyB,IAAT1jC,EAC1B,OAAO,EAET,GAAIA,EAAQ0jC,QAAyB,IAATA,EAC1B,OAAQ,GAUd,OAAOttB,EAAE/V,MAAQ6R,EAAE7R,MAUrB,SAAS06C,EAAYZ,GACnB,IAAI95C,GAAS,EACTtB,EAASo7C,EAAMp7C,OACfi8C,EAAQb,EAAM,GACdc,EAAMd,EAAOp7C,EAAS,EAAK,GAC3Bg7B,EAAOogB,EAAMp7C,EAAS,GAE1B,GAAIi8C,GAAyB,iBAATA,GAChBC,GAAqB,iBAAPA,GAAmBlhB,GAAuB,iBAARA,EAClD,OAAO,EAET,IAAIugB,EAAQY,IACZZ,EAAa,MAAIA,EAAY,KAAIA,EAAY,KAAIA,OAAM,IAAe,EAEtE,IAAI1b,EAASsc,IAKb,IAJAtc,EAAOub,MAAQA,EACfvb,EAAO0b,MAAQA,EACf1b,EAAOh/B,KAAO26C,IAELl6C,EAAQtB,GACf6/B,EAAOh/B,KAAKu6C,EAAM95C,IAEpB,OAAOu+B,EAWT,SAASuc,EAAiBrhC,GACxB,MAAO,KAAOw/B,EAAcx/B,GAS9B,SAASshC,IACP,OAAOpE,EAAU/T,OAAS,GAS5B,SAASiY,IACP,OAAOjE,EAAWhU,OAAS,CACzBkX,MAAS,KACTG,MAAS,KACTO,SAAY,KACZQ,OAAS,EACTh7C,MAAS,EACTi7C,MAAQ,EACRjC,OAAU,KACVD,OAAU,KACVx5C,KAAQ,KACRsK,OAAU,KACVqxC,MAAQ,EACRz5C,WAAa,EACb9B,MAAS,MAUb,SAASw7C,EAAarB,GACpBA,EAAMp7C,OAAS,EACXi4C,EAAUj4C,OAtVE,IAuVdi4C,EAAUp3C,KAAKu6C,GAUnB,SAASsB,EAAcrC,GACrB,IAAIkB,EAAQlB,EAAOkB,MACfA,GACFmB,EAAcnB,GAEhBlB,EAAOe,MAAQf,EAAOkB,MAAQlB,EAAOyB,SAAWzB,EAAOA,OAASA,EAAOC,OAASD,EAAOlvC,OAASkvC,EAAOp5C,MAAQ,KAC3Gi3C,EAAWl4C,OAvWC,IAwWdk4C,EAAWr3C,KAAKw5C,GAiBpB,SAAS77C,EAAM48C,EAAOptB,EAAO2uB,GAC3B3uB,IAAUA,EAAQ,QACA,IAAP2uB,IACTA,EAAMvB,EAAQA,EAAMp7C,OAAS,GAM/B,IAJA,IAAIsB,GAAS,EACTtB,EAAS28C,EAAM3uB,GAAS,EACxB6R,EAASzwB,MAAMpP,EAAS,EAAI,EAAIA,KAE3BsB,EAAQtB,GACf6/B,EAAOv+B,GAAS85C,EAAMptB,EAAQ1sB,GAEhC,OAAOu+B,GAxQLqb,GAAeA,EAAW1rB,SAAW0rB,GAAcA,EAAW53C,SAAW43C,IAC3EtlC,EAAOslC,GAw8MT,IAAItqB,EAnrMJ,SAASgsB,EAAaC,GAQpB,IAAIztC,GAHJytC,EAAUA,EAAUjsB,EAAEqI,SAASrjB,EAAKxX,SAAUy+C,EAASjsB,EAAEmI,KAAKnjB,EAAMojC,IAAiBpjC,GAGjExG,MAChB0tC,EAAUD,EAAQC,QAClBl+B,EAAOi+B,EAAQj+B,KACfm+B,EAAWF,EAAQE,SACnBtmB,EAAOomB,EAAQpmB,KACf/Y,EAASm/B,EAAQn/B,OACjBtf,EAASy+C,EAAQz+C,OACjB0F,EAAS+4C,EAAQ/4C,OACjBC,EAAS84C,EAAQ94C,OACjBi5C,EAAYH,EAAQG,UAQpBC,EAAW,GAGXC,EAAc9+C,EAAOC,UAGrB8+C,EAAUN,EAAQjsB,EAGlB9rB,EAAWo4C,EAAYp4C,SAGvBs4C,GAAWt5C,EAAO,IACpBC,EAAOe,GACJ3E,QAAQ,sBAAuB,QAC/BA,QAAQ,wBAAyB,OAAS,KAI3C0oC,GAAOpS,EAAKoS,KACZwU,GAAeR,EAAQQ,aACvB1U,GAAQlS,EAAKkS,MACb2U,GAAaP,EAAS1+C,UAAUyG,SAChCy4C,GAAiBC,GAASD,GAAiBn/C,EAAOm/C,iBAAmBA,GACrEj/C,GAAiB4+C,EAAY5+C,eAC7BuC,GAAOo8C,EAASp8C,KAChBoC,GAAa45C,EAAQ55C,WACrB3C,GAAS28C,EAAS38C,OAClB6jB,GAAU84B,EAAS94B,QAGnBs5B,GAAkB,WAEpB,IACE,IAAI9tB,EAAI,GACJ+tB,EAAOF,GAASE,EAAOt/C,EAAOq/C,iBAAmBC,EACjD7d,EAAS6d,EAAK/tB,EAAGA,EAAGA,IAAM+tB,EAC9B,MAAMt7C,IACR,OAAOy9B,EAPY,GAWjB8d,GAAeH,GAASG,GAAev/C,EAAOwJ,SAAW+1C,GACzDC,GAAgBJ,GAASI,GAAgBxuC,EAAMghC,UAAYwN,GAC3DC,GAAiBhB,EAAQiB,SACzBC,GAAclB,EAAQmB,MACtBC,GAAaT,GAASS,GAAa7/C,EAAOqf,OAASwgC,GACnDC,GAAYznB,EAAKC,IACjBynB,GAAY1nB,EAAKsF,IACjBqiB,GAAiBvB,EAAQ1wC,SACzBkyC,GAAe5nB,EAAK6nB,OAGpBC,GAAc,GA6ElB,SAAS7gB,GAAOz8B,GAEd,OAAQA,GAAyB,iBAATA,IAAsBmvC,GAAQnvC,IAAU3C,GAAeO,KAAKoC,EAAO,eACxFA,EACA,IAAIu9C,GAAcv9C,GAWvB,SAASu9C,GAAcv9C,EAAOw9C,GAC5B/6C,KAAKg7C,YAAcD,EACnB/6C,KAAKi7C,YAAc19C,EA7FrBs9C,GAAYpF,GAAc/pC,EAC1BmvC,GAAYnF,GAAa0D,EACzByB,GAAYlF,GAAaz6B,EACzB2/B,GAxac,qBAwaWxB,EACzBwB,GAAYjF,GAAel7C,EAC3BmgD,GAzagB,mBAyaW7gC,EAC3B6gC,GAxagB,mBAwaWz6C,EAC3By6C,GAAYhF,GAAex1C,EAyF3By6C,GAAcngD,UAAYq/B,GAAOr/B,UASjC,IAAIugD,GAAUlhB,GAAOkhB,QAAU,GA0F/B,SAASC,GAASC,GAChB,IAAIpB,EAAOoB,EAAS,GAChBC,EAAcD,EAAS,GACvBE,EAAUF,EAAS,GAEvB,SAASG,IAGP,GAAIF,EAAa,CAIf,IAAIp+C,EAAOnC,EAAMugD,GACjBl+C,GAAKC,MAAMH,EAAMC,WAInB,GAAI8C,gBAAgBu7C,EAAO,CAEzB,IAAIC,EAAcC,GAAWzB,EAAKr/C,WAC9BwhC,EAAS6d,EAAK58C,MAAMo+C,EAAav+C,GAAQC,WAC7C,OAAOw+C,GAASvf,GAAUA,EAASqf,EAErC,OAAOxB,EAAK58C,MAAMk+C,EAASr+C,GAAQC,WAGrC,OADAy+C,GAAYJ,EAAOH,GACZG,EAeT,SAASK,GAAUr+C,EAAOs+C,EAAQ98C,EAAU+8C,EAAQC,GAClD,GAAIh9C,EAAU,CACZ,IAAIo9B,EAASp9B,EAASxB,GACtB,QAAqB,IAAV4+B,EACT,OAAOA,EAKX,IADYuf,GAASn+C,GAsBnB,OAAOA,EApBP,IAAIy+C,EAAY56C,EAASjG,KAAKoC,GAC9B,IAAKu4C,EAAiBkG,GACpB,OAAOz+C,EAET,IAAI0+C,EAAOpB,GAAYmB,GACvB,OAAQA,GACN,KAAKtG,EACL,KAAKC,EACH,OAAO,IAAIsG,GAAM1+C,GAEnB,IApqBU,kBAqqBV,KAAKs4C,EACH,OAAO,IAAIoG,EAAK1+C,GAElB,IAtqBU,kBAyqBR,OAFA4+B,EAAS8f,EAAK1+C,EAAM8iC,OAAQ0U,EAAQjtB,KAAKvqB,KAClC5B,UAAY4B,EAAM5B,UAClBwgC,EAKb,IAAI+f,EAAQxP,GAAQnvC,GACpB,GAAIs+C,EAAQ,CAEV,IAAIM,GAAeL,EACnBA,IAAWA,EAASnD,KACpBoD,IAAWA,EAASpD,KAGpB,IADA,IAAIr8C,EAASw/C,EAAOx/C,OACbA,KACL,GAAIw/C,EAAOx/C,IAAWiB,EACpB,OAAOw+C,EAAOz/C,GAGlB6/B,EAAS+f,EAAQD,EAAK1+C,EAAMjB,QAAU,QAGtC6/B,EAAS+f,EAAQphD,EAAMyC,GAAS6+C,GAAO,GAAI7+C,GAY7C,OATI2+C,IACEthD,GAAeO,KAAKoC,EAAO,WAC7B4+B,EAAOv+B,MAAQL,EAAMK,OAEnBhD,GAAeO,KAAKoC,EAAO,WAC7B4+B,EAAOrkB,MAAQva,EAAMua,QAIpB+jC,GAKLC,EAAO3+C,KAAKI,GACZw+C,EAAO5+C,KAAKg/B,IAGX+f,EAAQz1C,GAAU41C,IAAQ9+C,GAAO,SAAS++C,EAAUtmC,GACnDmmB,EAAOnmB,GAAO4lC,GAAUU,EAAUT,EAAQ98C,EAAU+8C,EAAQC,MAG1DI,IACFpD,EAAa+C,GACb/C,EAAagD,IAER5f,GAhBEA,EA2BX,SAASsf,GAAW9gD,EAAW4hD,GAC7B,OAAOb,GAAS/gD,GAAas/C,GAAat/C,GAAa,GA2BzD,SAAS6hD,GAAmBxC,EAAMsB,EAASmB,GACzC,GAAmB,mBAARzC,EACT,OAAO0C,GAGT,QAAsB,IAAXpB,KAA4B,cAAetB,GACpD,OAAOA,EAET,IAAIoB,EAAWpB,EAAK2C,aACpB,QAAuB,IAAZvB,IACLF,GAAQ0B,YACVxB,GAAYpB,EAAK3+C,QAEnB+/C,EAAWA,IAAaF,GAAQ2B,aACjB,CACb,IAAIxc,EAASuZ,GAAWz+C,KAAK6+C,GACxBkB,GAAQ0B,YACXxB,GAAYpG,EAAWx4C,KAAK6jC,IAEzB+a,IAEHA,EAAWhG,EAAO54C,KAAK6jC,GACvBsb,GAAY3B,EAAMoB,IAKxB,IAAiB,IAAbA,IAAoC,IAAbA,GAAmC,EAAdA,EAAS,GACvD,OAAOpB,EAET,OAAQyC,GACN,KAAK,EAAG,OAAO,SAASl/C,GACtB,OAAOy8C,EAAK7+C,KAAKmgD,EAAS/9C,IAE5B,KAAK,EAAG,OAAO,SAASoW,EAAGlE,GACzB,OAAOuqC,EAAK7+C,KAAKmgD,EAAS3nC,EAAGlE,IAE/B,KAAK,EAAG,OAAO,SAASlS,EAAOK,EAAOiuC,GACpC,OAAOmO,EAAK7+C,KAAKmgD,EAAS/9C,EAAOK,EAAOiuC,IAE1C,KAAK,EAAG,OAAO,SAASiR,EAAav/C,EAAOK,EAAOiuC,GACjD,OAAOmO,EAAK7+C,KAAKmgD,EAASwB,EAAav/C,EAAOK,EAAOiuC,IAGzD,OAAOzmC,GAAK40C,EAAMsB,GAWpB,SAASyB,GAAkB3B,GACzB,IAAIpB,EAAOoB,EAAS,GAChB4B,EAAU5B,EAAS,GACnBC,EAAcD,EAAS,GACvB6B,EAAmB7B,EAAS,GAC5BE,EAAUF,EAAS,GACnB8B,EAAQ9B,EAAS,GAEjB+B,EAAmB,EAAVH,EACTI,EAAsB,EAAVJ,EACZK,EAAoB,EAAVL,EACVM,EAAyB,EAAVN,EACfhnC,EAAMgkC,EAEV,SAASuB,IACP,IAAIC,EAAc2B,EAAS7B,EAAUt7C,KACrC,GAAIq7C,EAAa,CACf,IAAIp+C,EAAOnC,EAAMugD,GACjBl+C,GAAKC,MAAMH,EAAMC,WAEnB,IAAI+/C,GAAoBI,KACtBpgD,IAASA,EAAOnC,EAAMoC,YAClB+/C,GACF9/C,GAAKC,MAAMH,EAAMggD,GAEfI,GAAWpgD,EAAKX,OAAS4gD,GAE3B,OADAF,GAAW,GACJD,GAAkB,CAAC/C,EAAOsD,EAAeN,GAAoB,EAAVA,EAAe//C,EAAM,KAAMq+C,EAAS4B,IAOlG,GAJAjgD,IAASA,EAAOC,WACZkgD,IACFpD,EAAOwB,EAAYxlC,IAEjBhW,gBAAgBu7C,EAAO,CACzBC,EAAcC,GAAWzB,EAAKr/C,WAC9B,IAAIwhC,EAAS6d,EAAK58C,MAAMo+C,EAAav+C,GACrC,OAAOy+C,GAASvf,GAAUA,EAASqf,EAErC,OAAOxB,EAAK58C,MAAMo+C,EAAav+C,GAGjC,OADA0+C,GAAYJ,EAAOH,GACZG,EAYT,SAASgC,GAAe7F,EAAOvQ,GAC7B,IAAIvpC,GAAS,EACTC,EAAU2/C,KACVlhD,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChCmhD,EAAUnhD,GAt7BG,IAs7ByBuB,IAAY45C,EAClDtb,EAAS,GAEb,GAAIshB,EAAS,CACX,IAAI5F,EAAQS,EAAYnR,GACpB0Q,GACFh6C,EAAU+5C,EACVzQ,EAAS0Q,GAET4F,GAAU,EAGd,OAAS7/C,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQm6C,EAAM95C,GACdC,EAAQspC,EAAQ5pC,GAAS,GAC3B4+B,EAAOh/B,KAAKI,GAMhB,OAHIkgD,GACFzE,EAAc7R,GAEThL,EAcT,SAASuhB,GAAYhG,EAAOiG,EAAWC,EAAUjG,GAK/C,IAJA,IAAI/5C,GAAS+5C,GAAa,GAAK,EAC3Br7C,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChC6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQm6C,EAAM95C,GAElB,GAAIL,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,SAC9CowC,GAAQnvC,IAAUsgD,GAAYtgD,IAAS,CAExCogD,IACHpgD,EAAQmgD,GAAYngD,EAAOogD,EAAWC,IAExC,IAAIE,GAAY,EACZC,EAAYxgD,EAAMjB,OAClB0hD,EAAW7hB,EAAO7/B,OAGtB,IADA6/B,EAAO7/B,QAAUyhD,IACRD,EAAWC,GAClB5hB,EAAO6hB,KAAczgD,EAAMugD,QAEnBF,GACVzhB,EAAOh/B,KAAKI,GAGhB,OAAO4+B,EAgBT,SAAS8hB,GAAYtqC,EAAGlE,EAAG1Q,EAAUm/C,EAASpC,EAAQC,GAEpD,GAAIh9C,EAAU,CACZ,IAAIo9B,EAASp9B,EAAS4U,EAAGlE,GACzB,QAAqB,IAAV0sB,EACT,QAASA,EAIb,GAAIxoB,IAAMlE,EAER,OAAa,IAANkE,GAAY,EAAIA,GAAK,EAAIlE,EAMlC,KAAIkE,GAAMA,GACJA,GAAK6iC,SALO7iC,IAMZlE,GAAK+mC,SALY/mC,IAMrB,OAAO,EAIT,GAAS,MAALkE,GAAkB,MAALlE,EACf,OAAOkE,IAAMlE,EAGf,IAAIusC,EAAY56C,EAASjG,KAAKwY,GAC1BwqC,EAAa/8C,EAASjG,KAAKsU,GAQ/B,GANIusC,GAAaxG,IACfwG,EAAYpG,GAEVuI,GAAc3I,IAChB2I,EAAavI,GAEXoG,GAAamC,EACf,OAAO,EAET,OAAQnC,GACN,KAAKtG,EACL,KAAKC,EAGH,OAAQhiC,IAAMlE,EAEhB,IAj/BY,kBAm/BV,OAAQkE,IAAMA,EACVlE,IAAMA,EAEA,GAALkE,EAAU,EAAIA,GAAK,EAAIlE,EAAKkE,IAAMlE,EAEzC,IAt/BY,kBAu/BZ,KAAKomC,EAGH,OAAOliC,GAAKtT,EAAOoP,GAEvB,IAAIysC,EAAQF,GAAavG,EACzB,IAAKyG,EAAO,CAEV,IAAIkC,EAAWxjD,GAAeO,KAAKwY,EAAG,eAClC0qC,EAAWzjD,GAAeO,KAAKsU,EAAG,eAEtC,GAAI2uC,GAAYC,EACd,OAAOJ,GAAYG,EAAWzqC,EAAEsnC,YAActnC,EAAG0qC,EAAW5uC,EAAEwrC,YAAcxrC,EAAG1Q,EAAUm/C,EAASpC,EAAQC,GAG5G,GAAIC,GAAapG,EACf,OAAO,EAGT,IAAI0I,EAAQ3qC,EAAE4qC,YACVC,EAAQ/uC,EAAE8uC,YAGd,GAAID,GAASE,KACL7L,GAAW2L,IAAUA,aAAiBA,GAAS3L,GAAW6L,IAAUA,aAAiBA,IACtF,gBAAiB7qC,GAAK,gBAAiBlE,EAE5C,OAAO,EAMX,IAAI0sC,GAAeL,EACnBA,IAAWA,EAASnD,KACpBoD,IAAWA,EAASpD,KAGpB,IADA,IAAIr8C,EAASw/C,EAAOx/C,OACbA,KACL,GAAIw/C,EAAOx/C,IAAWqX,EACpB,OAAOooC,EAAOz/C,IAAWmT,EAG7B,IAAI24B,EAAO,EAQX,GAPAjM,GAAS,EAGT2f,EAAO3+C,KAAKwW,GACZooC,EAAO5+C,KAAKsS,GAGRysC,GAMF,GAJA5/C,EAASqX,EAAErX,OACX8rC,EAAO34B,EAAEnT,QACT6/B,EAASiM,GAAQ9rC,IAEH4hD,EAEZ,KAAO9V,KAAQ,CACb,IAAIxqC,EAAQtB,EACRiB,EAAQkS,EAAE24B,GAEd,GAAI8V,EACF,KAAOtgD,OACAu+B,EAAS8hB,GAAYtqC,EAAE/V,GAAQL,EAAOwB,EAAUm/C,EAASpC,EAAQC,WAInE,KAAM5f,EAAS8hB,GAAYtqC,EAAEy0B,GAAO7qC,EAAOwB,EAAUm/C,EAASpC,EAAQC,IAC3E,YAQN0C,GAAMhvC,GAAG,SAASlS,EAAOyY,EAAKvG,GAC5B,GAAI7U,GAAeO,KAAKsU,EAAGuG,GAIzB,OAFAoyB,IAEQjM,EAASvhC,GAAeO,KAAKwY,EAAGqC,IAAQioC,GAAYtqC,EAAEqC,GAAMzY,EAAOwB,EAAUm/C,EAASpC,EAAQC,MAItG5f,IAAW+hB,GAEbO,GAAM9qC,GAAG,SAASpW,EAAOyY,EAAKrC,GAC5B,GAAI/Y,GAAeO,KAAKwY,EAAGqC,GAEzB,OAAQmmB,IAAWiM,GAAQ,KAYnC,OAPA0T,EAAOtb,MACPub,EAAOvb,MAEH2b,IACFpD,EAAa+C,GACb/C,EAAagD,IAER5f,EAcT,SAASuiB,GAAU/H,EAAQtW,EAAQthC,EAAU+8C,EAAQC,IAClDrP,GAAQrM,GAAU55B,GAAU41C,IAAQhc,GAAQ,SAASA,EAAQrqB,GAC5D,IAAIwD,EACA0iC,EACA/f,EAASkE,EACT9iC,EAAQo5C,EAAO3gC,GAEnB,GAAIqqB,KAAY6b,EAAQxP,GAAQrM,KAAYiT,GAAcjT,IAAU,CAGlE,IADA,IAQMsd,EARFgB,EAAc7C,EAAOx/C,OAClBqiD,KACL,GAAKnlC,EAAQsiC,EAAO6C,IAAgBte,EAAS,CAC3C9iC,EAAQw+C,EAAO4C,GACf,MAGJ,IAAKnlC,EAECza,IAEG4+C,OAA6B,KADlCxhB,EAASp9B,EAASxB,EAAO8iC,OAEvB9iC,EAAQ4+B,GAGPwhB,IACHpgD,EAAQ2+C,EACHxP,GAAQnvC,GAASA,EAAQ,GACzB+1C,GAAc/1C,GAASA,EAAQ,IAGtCu+C,EAAO3+C,KAAKkjC,GACZ0b,EAAO5+C,KAAKI,GAGPogD,GACHe,GAAUnhD,EAAO8iC,EAAQthC,EAAU+8C,EAAQC,QAK3Ch9C,QAEmB,KADrBo9B,EAASp9B,EAASxB,EAAO8iC,MAEvBlE,EAASkE,QAGQ,IAAVlE,IACT5+B,EAAQ4+B,GAGZwa,EAAO3gC,GAAOzY,KAalB,SAASqhD,GAAWvmB,EAAKrF,GACvB,OAAOqF,EAAM4M,GAAM0V,MAAkB3nB,EAAMqF,EAAM,IAanD,SAASwmB,GAASnH,EAAOoH,EAAU//C,GACjC,IAAInB,GAAS,EACTC,EAAU2/C,KACVlhD,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChC6/B,EAAS,GAETshB,GAAWqB,GAAYxiD,GAnwCV,IAmwCsCuB,IAAY45C,EAC/DsH,EAAQhgD,GAAY0+C,EAAW9E,IAAaxc,EAE5CshB,IAEF5/C,EAAU+5C,EACVmH,EAFYzG,EAAYyG,IAI1B,OAASnhD,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQm6C,EAAM95C,GACdohD,EAAWjgD,EAAWA,EAASxB,EAAOK,EAAO85C,GAASn6C,GAEtDuhD,GACKlhD,GAASmhD,EAAKA,EAAKziD,OAAS,KAAO0iD,EACpCnhD,EAAQkhD,EAAMC,GAAY,MAE5BjgD,GAAY0+C,IACdsB,EAAK5hD,KAAK6hD,GAEZ7iB,EAAOh/B,KAAKI,IAShB,OANIkgD,GACF1E,EAAagG,EAAKrH,OAClBsB,EAAc+F,IACLhgD,GACTg6C,EAAagG,GAER5iB,EAaT,SAAS8iB,GAAiBC,GACxB,OAAO,SAASrT,EAAY9sC,EAAUu8C,GACpC,IAAInf,EAAS,GACbp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQsuC,EAAWjuC,GACvBshD,EAAO/iB,EAAQ5+B,EAAOwB,EAASxB,EAAOK,EAAOiuC,GAAaA,QAG5DwQ,GAAOxQ,GAAY,SAAStuC,EAAOyY,EAAK61B,GACtCqT,EAAO/iB,EAAQ5+B,EAAOwB,EAASxB,EAAOyY,EAAK61B,GAAaA,MAG5D,OAAO1P,GA0BX,SAASijB,GAAcpF,EAAMgD,EAAS3B,EAAa4B,EAAkB3B,EAAS4B,GAC5E,IAAIC,EAAmB,EAAVH,EAETK,EAAoB,EAAVL,EAEVqC,EAAsB,GAAVrC,EACZsC,EAA2B,GAAVtC,EAErB,KAN0B,EAAVA,KAMGrK,GAAWqH,GAC5B,MAAM,IAAIV,EAER+F,IAAchE,EAAY/+C,SAC5B0gD,IAAW,GACXqC,EAAYhE,GAAc,GAExBiE,IAAmBrC,EAAiB3gD,SACtC0gD,IAAW,GACXsC,EAAiBrC,GAAmB,GAEtC,IAAI7B,EAAWpB,GAAQA,EAAK2C,aAC5B,OAAIvB,IAAyB,IAAbA,IAEdA,EAAWtgD,EAAMsgD,IACJ,KACXA,EAAS,GAAKtgD,EAAMsgD,EAAS,KAE3BA,EAAS,KACXA,EAAS,GAAKtgD,EAAMsgD,EAAS,MAG3B+B,GAA0B,EAAd/B,EAAS,KACvBA,EAAS,GAAKE,IAGX6B,GAAwB,EAAd/B,EAAS,KACtB4B,GAAW,IAGTK,GAA2B,EAAdjC,EAAS,KACxBA,EAAS,GAAK8B,GAGZmC,GACFliD,GAAKC,MAAMg+C,EAAS,KAAOA,EAAS,GAAK,IAAKC,GAG5CiE,GACF7+B,GAAQrjB,MAAMg+C,EAAS,KAAOA,EAAS,GAAK,IAAK6B,GAGnD7B,EAAS,IAAM4B,EACRoC,GAAchiD,MAAM,KAAMg+C,KAGT,GAAX4B,GAA4B,KAAZA,EAAkB7B,GAAW4B,IAC7C,CAAC/C,EAAMgD,EAAS3B,EAAa4B,EAAkB3B,EAAS4B,IAUzE,SAASqC,GAAeloC,GACtB,OAAOmoC,GAAYnoC,GAWrB,SAASmmC,KACP,IAAIrhB,GAAUA,EAASnC,GAAOn8B,WAAaA,GAAU45C,EAActb,EACnE,OAAOA,EAUT,SAAS2d,GAASv8C,GAChB,MAAuB,mBAATA,GAAuBm8C,GAASl9C,KAAKe,GA31BrD29C,GAAQ2B,YAAc/C,GAASX,EAAQsG,aAAerK,EAAO54C,KAAK08C,GAQlEgC,GAAQ0B,UAAoC,iBAAjBvD,EAASh+C,KAWpC2+B,GAAO0lB,iBAAmB,CAQxBC,OAAU,mBAQVC,SAAY,kBAQZC,YAAe5K,EAQf6K,SAAY,GAQZC,QAAW,CAQT7yB,EAAK8M,KAmJJigB,KACHwB,GAAc,WACZ,SAAS/gD,KACT,OAAO,SAASC,GACd,GAAI+gD,GAAS/gD,GAAY,CACvBD,EAAOC,UAAYA,EACnB,IAAIwhC,EAAS,IAAIzhC,EACjBA,EAAOC,UAAY,KAErB,OAAOwhC,GAAUgd,EAAQz+C,UARhB,IA8oBf,IAAIihD,GAAe5B,GAAwB,SAASC,EAAMz8C,GACxD64C,EAAW74C,MAAQA,EACnBw8C,GAAeC,EAAM,eAAgB5D,IAFH4J,GAepC,SAASC,GAAkB1iD,GACzB,IAAI0+C,EACA9f,EAGJ,SAAM5+B,GAAS6D,EAASjG,KAAKoC,IAAUq4C,GACRjD,GAA1BsJ,EAAO1+C,EAAMghD,gBAAmCtC,aAAgBA,MAMrEwC,GAAMlhD,GAAO,SAASA,EAAOyY,GAC3BmmB,EAASnmB,UAEa,IAAVmmB,GAAyBvhC,GAAeO,KAAKoC,EAAO4+B,IAUpE,SAAS+jB,GAAiB7oC,GACxB,OAAO8oC,GAAc9oC,GAqBvB,SAASwmC,GAAYtgD,GACnB,OAAOA,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,QACvD8E,EAASjG,KAAKoC,IAAUi4C,IAAa,EAoBzC,IAAI9I,GAAUwN,IAAiB,SAAS38C,GACtC,OAAOA,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,QACvD8E,EAASjG,KAAKoC,IAAUk4C,IAAc,GAqCtC17B,GAAQwgC,GAAwB,SAAS5D,GAC3C,OAAK+E,GAAS/E,GAGP4D,GAAW5D,GAFT,IA3BI,SAASA,GACtB,IAAI/4C,EAAOwiD,EAAWzJ,EAAQxa,EAAS,GACvC,IAAKikB,EAAU,OAAOjkB,EACtB,IAAMqa,SAAmBG,GAAU,OAAOxa,EACxC,IAAKv+B,KAASwiD,EACRxlD,GAAeO,KAAKilD,EAAUxiD,IAChCu+B,EAAOh/B,KAAKS,GAGlB,OAAOu+B,GA+BLqjB,GAAc,CAChBa,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLzJ,IAAK,SAIHoJ,GAAgBM,GAAOjB,IAGvBkB,GAAgBtgD,EAAO,IAAM2Z,GAAKomC,IAAetjD,KAAK,KAAO,IAAK,KAClE8jD,GAAkBvgD,EAAO,IAAM2Z,GAAKylC,IAAa3iD,KAAK,IAAM,IAAK,KAkCjEu/C,GAAS,SAASzF,EAAQtW,EAAQugB,GACpC,IAAIhjD,EAAOwiD,EAAWzJ,EAAQxa,EAASikB,EACvC,IAAKA,EAAU,OAAOjkB,EACtB,IAAIl/B,EAAOC,UACP2jD,EAAY,EACZC,EAA6B,iBAATF,EAAoB,EAAI3jD,EAAKX,OACrD,GAAIwkD,EAAa,GAAoC,mBAAxB7jD,EAAK6jD,EAAa,GAC7C,IAAI/hD,EAAWy9C,GAAmBv/C,IAAO6jD,EAAa,GAAI7jD,EAAK6jD,KAAe,QACrEA,EAAa,GAAoC,mBAAxB7jD,EAAK6jD,EAAa,KACpD/hD,EAAW9B,IAAO6jD,IAEpB,OAASD,EAAYC,GAEnB,IADAV,EAAWnjD,EAAK4jD,KACArK,SAAmB4J,GAKnC,IAJA,IAAIW,GAAY,EACZC,EAAWxK,SAAmB4J,IAAarmC,GAAKqmC,GAChD9jD,EAAS0kD,EAAWA,EAAS1kD,OAAS,IAEjCykD,EAAWzkD,GAElB6/B,EADAv+B,EAAQojD,EAASD,IACDhiD,EAAWA,EAASo9B,EAAOv+B,GAAQwiD,EAASxiD,IAAUwiD,EAASxiD,GAInF,OAAOu+B,GA2JL5G,GAAW,SAASohB,EAAQtW,EAAQugB,GACtC,IAAIhjD,EAAOwiD,EAAWzJ,EAAQxa,EAASikB,EACvC,IAAKA,EAAU,OAAOjkB,EAItB,IAHA,IAAIl/B,EAAOC,UACP2jD,EAAY,EACZC,EAA6B,iBAATF,EAAoB,EAAI3jD,EAAKX,SAC5CukD,EAAYC,GAEnB,IADAV,EAAWnjD,EAAK4jD,KACArK,SAAmB4J,GAKnC,IAJA,IAAIW,GAAY,EACZC,EAAWxK,SAAmB4J,IAAarmC,GAAKqmC,GAChD9jD,EAAS0kD,EAAWA,EAAS1kD,OAAS,IAEjCykD,EAAWzkD,QAEU,IAAjB6/B,EADXv+B,EAAQojD,EAASD,MACwB5kB,EAAOv+B,GAASwiD,EAASxiD,IAItE,OAAOu+B,GA4ILsiB,GAAQ,SAAS5S,EAAY9sC,EAAUu8C,GACzC,IAAI19C,EAAOwiD,EAAWvU,EAAY1P,EAASikB,EAC3C,IAAKA,EAAU,OAAOjkB,EACtB,IAAKqa,SAAmB4J,GAAW,OAAOjkB,EAExC,IAAKv+B,KADPmB,EAAWA,QAA8B,IAAXu8C,EAAyBv8C,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GACxF8E,EACZ,IAAqD,IAAjDrhD,EAASqhD,EAASxiD,GAAQA,EAAOiuC,GAAuB,OAAO1P,EAEvE,OAAOA,GAqELkgB,GAAS,SAASxQ,EAAY9sC,EAAUu8C,GAC1C,IAAI19C,EAAOwiD,EAAWvU,EAAY1P,EAASikB,EAC3C,IAAKA,EAAU,OAAOjkB,EACtB,IAAKqa,SAAmB4J,GAAW,OAAOjkB,EAC1Cp9B,EAAWA,QAA8B,IAAXu8C,EAAyBv8C,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GAKtG,IAJA,IAAIyF,GAAY,EACZC,EAAWxK,SAAmB4J,IAAarmC,GAAKqmC,GAChD9jD,EAAS0kD,EAAWA,EAAS1kD,OAAS,IAEjCykD,EAAWzkD,GAElB,IAAqD,IAAjDyC,EAASqhD,EADbxiD,EAAQojD,EAASD,IACanjD,EAAOiuC,GAAuB,OAAO1P,EAEvE,OAAOA,GAqBT,SAAS8kB,GAAYtK,EAAQ53C,EAAUu8C,GACrC,IAAIh3C,EAAQyV,GAAK48B,GACbr6C,EAASgI,EAAMhI,OAGnB,IADAyC,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GAC1Ch/C,KAAU,CACf,IAAI0Z,EAAM1R,EAAMhI,GAChB,IAA2C,IAAvCyC,EAAS43C,EAAO3gC,GAAMA,EAAK2gC,GAC7B,MAGJ,OAAOA,EAkBT,SAASuK,GAAUvK,GACjB,IAAIxa,EAAS,GAMb,OALAsiB,GAAM9H,GAAQ,SAASp5C,EAAOyY,GACxB28B,GAAWp1C,IACb4+B,EAAOh/B,KAAK6Y,MAGTmmB,EAAO3X,OAmChB,SAASi8B,GAAO9J,GAMd,IALA,IAAI/4C,GAAS,EACT0G,EAAQyV,GAAK48B,GACbr6C,EAASgI,EAAMhI,OACf6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOwa,EAAO3gC,IAAQA,EAExB,OAAOmmB,EAqLT,SAASwW,GAAWp1C,GAClB,MAAuB,mBAATA,EAuBhB,SAASm+C,GAASn+C,GAKhB,SAAUA,IAASi5C,SAAmBj5C,IAqExC,SAAS4jD,GAAS5jD,GAChB,MAAuB,iBAATA,GACZA,GAAyB,iBAATA,GA/1EJ,mBA+1EyB6D,EAASjG,KAAKoC,KAAyB,EA2BhF,IAAI+1C,GAAiBuG,GAAqC,SAASt8C,GACjE,IAAMA,GAAS6D,EAASjG,KAAKoC,IAAUq4C,EACrC,OAAO,EAET,IAAIwL,EAAU7jD,EAAM6jD,QAChBC,EAAWvH,GAASsH,KAAaC,EAAWxH,GAAeuH,KAAavH,GAAewH,GAE3F,OAAOA,EACF9jD,GAAS8jD,GAAYxH,GAAet8C,IAAU8jD,EAC/CpB,GAAkB1iD,IATc0iD,GA0CtC,SAASqB,GAAS/jD,GAChB,MAAuB,iBAATA,GACZA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUs4C,IAAe,EAuVhF,SAAS1O,GAAOwP,GAMd,IALA,IAAI/4C,GAAS,EACT0G,EAAQyV,GAAK48B,GACbr6C,EAASgI,EAAMhI,OACf6/B,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GACf6/B,EAAOv+B,GAAS+4C,EAAOryC,EAAM1G,IAE/B,OAAOu+B,EAkET,SAASr6B,GAAS+pC,EAAYvnB,EAAQqzB,GACpC,IAAI/5C,GAAS,EACTC,EAAU2/C,KACVlhD,EAASuvC,EAAaA,EAAWvvC,OAAS,EAC1C6/B,GAAS,EAcb,OAZAwb,GAAaA,EAAY,EAAI6C,GAAU,EAAGl+C,EAASq7C,GAAaA,IAAc,EAC1EjL,GAAQb,GACV1P,EAASt+B,EAAQguC,EAAYvnB,EAAQqzB,IAAc,EACzB,iBAAVr7C,EAChB6/B,GAAUmlB,GAASzV,GAAcA,EAAWhuC,QAAQymB,EAAQqzB,GAAa95C,EAAQguC,EAAYvnB,EAAQqzB,KAAe,EAEpH0E,GAAOxQ,GAAY,SAAStuC,GAC1B,KAAMK,GAAS+5C,EACb,QAASxb,EAAS5+B,IAAU+mB,MAI3B6X,EAqCT,IAAIolB,GAAUtC,IAAiB,SAAS9iB,EAAQ5+B,EAAOyY,GACpDpb,GAAeO,KAAKghC,EAAQnmB,GAAOmmB,EAAOnmB,KAASmmB,EAAOnmB,GAAO,KA4CpE,SAASwrC,GAAM3V,EAAY9sC,EAAUu8C,GACnC,IAAInf,GAAS,EACbp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,IACT6/B,IAAWp9B,EAAS8sC,EAAWjuC,GAAQA,EAAOiuC,WAKtDwQ,GAAOxQ,GAAY,SAAStuC,EAAOK,EAAOiuC,GACxC,OAAQ1P,IAAWp9B,EAASxB,EAAOK,EAAOiuC,MAG9C,OAAO1P,EA2CT,SAAShjB,GAAO0yB,EAAY9sC,EAAUu8C,GACpC,IAAInf,EAAS,GACbp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQsuC,EAAWjuC,GACnBmB,EAASxB,EAAOK,EAAOiuC,IACzB1P,EAAOh/B,KAAKI,QAIhB8+C,GAAOxQ,GAAY,SAAStuC,EAAOK,EAAOiuC,GACpC9sC,EAASxB,EAAOK,EAAOiuC,IACzB1P,EAAOh/B,KAAKI,MAIlB,OAAO4+B,EA8CT,SAAS3jB,GAAKqzB,EAAY9sC,EAAUu8C,GAClCv8C,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAWMnf,EAXFv+B,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GAAqB,iBAAVA,EAeT,OANA+/C,GAAOxQ,GAAY,SAAStuC,EAAOK,EAAOiuC,GACxC,GAAI9sC,EAASxB,EAAOK,EAAOiuC,GAEzB,OADA1P,EAAS5+B,GACF,KAGJ4+B,EAdP,OAASv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQsuC,EAAWjuC,GACvB,GAAImB,EAASxB,EAAOK,EAAOiuC,GACzB,OAAOtuC,GAyEf,SAASkJ,GAAQolC,EAAY9sC,EAAUu8C,GACrC,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAG9C,GADAyC,EAAWA,QAA8B,IAAXu8C,EAAyBv8C,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GACnF,iBAAVh/C,EACT,OAASsB,EAAQtB,IACwC,IAAnDyC,EAAS8sC,EAAWjuC,GAAQA,EAAOiuC,UAKzCwQ,GAAOxQ,EAAY9sC,GAErB,OAAO8sC,EAoBT,SAAS4V,GAAa5V,EAAY9sC,EAAUu8C,GAC1C,IAAIh/C,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GADAyC,EAAWA,QAA8B,IAAXu8C,EAAyBv8C,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GACnF,iBAAVh/C,EACT,KAAOA,MACoD,IAArDyC,EAAS8sC,EAAWvvC,GAASA,EAAQuvC,SAItC,CACL,IAAIvnC,EAAQyV,GAAK8xB,GACjBvvC,EAASgI,EAAMhI,OACf+/C,GAAOxQ,GAAY,SAAStuC,EAAOyY,EAAK61B,GAEtC,OADA71B,EAAM1R,EAAQA,IAAQhI,KAAYA,EAC3ByC,EAAS8sC,EAAW71B,GAAMA,EAAK61B,MAG1C,OAAOA,EAsCT,IAAI6V,GAAUzC,IAAiB,SAAS9iB,EAAQ5+B,EAAOyY,IACpDpb,GAAeO,KAAKghC,EAAQnmB,GAAOmmB,EAAOnmB,GAAOmmB,EAAOnmB,GAAO,IAAI7Y,KAAKI,MA0CvEokD,GAAU1C,IAAiB,SAAS9iB,EAAQ5+B,EAAOyY,GACrDmmB,EAAOnmB,GAAOzY,KA6EhB,SAASnB,GAAIyvC,EAAY9sC,EAAUu8C,GACjC,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAG9C,GADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAC/B,iBAAVh/C,EAET,IADA,IAAI6/B,EAASzwB,EAAMpP,KACVsB,EAAQtB,GACf6/B,EAAOv+B,GAASmB,EAAS8sC,EAAWjuC,GAAQA,EAAOiuC,QAGrD1P,EAAS,GACTkgB,GAAOxQ,GAAY,SAAStuC,EAAOyY,EAAK61B,GACtC1P,IAASv+B,GAASmB,EAASxB,EAAOyY,EAAK61B,MAG3C,OAAO1P,EA2CT,SAASnJ,GAAI6Y,EAAY9sC,EAAUu8C,GACjC,IAAI0D,GAAY4C,EAAAA,EACZzlB,EAAS6iB,EAOb,GAHuB,mBAAZjgD,GAA0Bu8C,GAAWA,EAAQv8C,KAAc8sC,IACpE9sC,EAAW,MAEG,MAAZA,GAAoB2tC,GAAQb,GAI9B,IAHA,IAAIjuC,GAAS,EACTtB,EAASuvC,EAAWvvC,SAEfsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQsuC,EAAWjuC,GACnBL,EAAQ4+B,IACVA,EAAS5+B,QAIbwB,EAAwB,MAAZA,GAAoBuiD,GAASzV,GACrCmM,EACAhe,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAE7C70C,GAAQolC,GAAY,SAAStuC,EAAOK,EAAOiuC,GACzC,IAAIgW,EAAU9iD,EAASxB,EAAOK,EAAOiuC,GACjCgW,EAAU7C,IACZA,EAAW6C,EACX1lB,EAAS5+B,MAIf,OAAO4+B,EAkGT,IAAI6K,GAAQ5qC,GAgCZ,SAAS+1B,GAAO0Z,EAAY9sC,EAAU+9C,EAAaxB,GACjD,IAAKzP,EAAY,OAAOiR,EACxB,IAAIgF,EAAU5kD,UAAUZ,OAAS,EACjCyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAAI19C,GAAS,EACTtB,EAASuvC,EAAWvvC,OAExB,GAAqB,iBAAVA,EAIT,IAHIwlD,IACFhF,EAAcjR,IAAajuC,MAEpBA,EAAQtB,GACfwgD,EAAc/9C,EAAS+9C,EAAajR,EAAWjuC,GAAQA,EAAOiuC,QAGhEwQ,GAAOxQ,GAAY,SAAStuC,EAAOK,EAAOiuC,GACxCiR,EAAcgF,GACTA,GAAU,EAAOvkD,GAClBwB,EAAS+9C,EAAav/C,EAAOK,EAAOiuC,MAG5C,OAAOiR,EAsBT,SAASiF,GAAYlW,EAAY9sC,EAAU+9C,EAAaxB,GACtD,IAAIwG,EAAU5kD,UAAUZ,OAAS,EAOjC,OANAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpDmG,GAAa5V,GAAY,SAAStuC,EAAOK,EAAOiuC,GAC9CiR,EAAcgF,GACTA,GAAU,EAAOvkD,GAClBwB,EAAS+9C,EAAav/C,EAAOK,EAAOiuC,MAEnCiR,EA6FT,SAASkF,GAAQnW,GACf,IAAIjuC,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAOxD,OALAmK,GAAQolC,GAAY,SAAStuC,GAC3B,IAAI0kD,EAAOrD,GAAW,IAAKhhD,GAC3Bu+B,EAAOv+B,GAASu+B,EAAO8lB,GACvB9lB,EAAO8lB,GAAQ1kD,KAEV4+B,EAsET,SAAS+lB,GAAKrW,EAAY9sC,EAAUu8C,GAClC,IAAInf,EACJp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpD,IAAI19C,GAAS,EACTtB,EAASuvC,EAAaA,EAAWvvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,KACV6/B,EAASp9B,EAAS8sC,EAAWjuC,GAAQA,EAAOiuC,WAKnDwQ,GAAOxQ,GAAY,SAAStuC,EAAOK,EAAOiuC,GACxC,QAAS1P,EAASp9B,EAASxB,EAAOK,EAAOiuC,OAG7C,QAAS1P,EAkIX,IAAIgmB,GAAQhpC,GAgNZ,SAASo/B,GAAMb,EAAO34C,EAAUu8C,GAC9B,IAAIh9C,EAAI,EACJhC,EAASo7C,EAAQA,EAAMp7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,GAAS,EAEb,IADAmB,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,KAC3C19C,EAAQtB,GAAUyC,EAAS24C,EAAM95C,GAAQA,EAAO85C,IACvDp5C,SAIF,GAAS,OADTA,EAAIS,IACau8C,EACf,OAAO5D,EAAQA,EAAM,QA9sIzBr4C,EAitIA,OAAOvE,EAAM48C,EAAO,EAAG+C,GAAUD,GAAU,EAAGl8C,GAAIhC,IAiFpD,SAASuB,GAAQ65C,EAAOn6C,EAAOo6C,GAC7B,GAAwB,iBAAbA,EAAuB,CAChC,IAAIr7C,EAASo7C,EAAQA,EAAMp7C,OAAS,EACpCq7C,EAAaA,EAAY,EAAI6C,GAAU,EAAGl+C,EAASq7C,GAAaA,GAAa,OACxE,GAAIA,EAAW,CACpB,IAAI/5C,EAAQwkD,GAAY1K,EAAOn6C,GAC/B,OAAOm6C,EAAM95C,KAAWL,EAAQK,GAAS,EAE3C,OAAO65C,EAAYC,EAAOn6C,EAAOo6C,GAgbnC,SAAS0K,GAAK3K,EAAO34C,EAAUu8C,GAC7B,GAAuB,iBAAZv8C,GAAoC,MAAZA,EAAkB,CACnD,IAAIT,EAAI,EACJV,GAAS,EACTtB,EAASo7C,EAAQA,EAAMp7C,OAAS,EAGpC,IADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,KAC3C19C,EAAQtB,GAAUyC,EAAS24C,EAAM95C,GAAQA,EAAO85C,IACvDp5C,SAGFA,EAAiB,MAAZS,GAAoBu8C,EAAW,EAAId,GAAU,EAAGz7C,GAEvD,OAAOjE,EAAM48C,EAAOp5C,GAmDtB,SAAS8jD,GAAY1K,EAAOn6C,EAAOwB,EAAUu8C,GAC3C,IAAIjZ,EAAM,EACNigB,EAAO5K,EAAQA,EAAMp7C,OAAS+lC,EAMlC,IAFA9kC,GADAwB,EAAWA,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAAKoB,IACnDn/C,GAEV8kC,EAAMigB,GAAM,CACjB,IAAI9J,EAAOnW,EAAMigB,IAAU,EAC1BvjD,EAAS24C,EAAMc,IAAQj7C,EACpB8kC,EAAMmW,EAAM,EACZ8J,EAAO9J,EAEb,OAAOnW,EAiET,SAASkgB,GAAK7K,EAAOoH,EAAU//C,EAAUu8C,GAUvC,MARuB,kBAAZwD,GAAqC,MAAZA,IAClCxD,EAAUv8C,EACVA,EAA+B,mBAAZ+/C,GAA0BxD,GAAWA,EAAQwD,KAAcpH,EAAS,KAAOoH,EAC9FA,GAAW,GAEG,MAAZ//C,IACFA,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,IAE/CuD,GAASnH,EAAOoH,EAAU//C,GAsEnC,SAASyjD,KAMP,IALA,IAAI9K,EAAQx6C,UAAUZ,OAAS,EAAIY,UAAYA,UAAU,GACrDU,GAAS,EACTtB,EAASo7C,EAAQ1kB,GAAIgU,GAAM0Q,EAAO,WAAa,EAC/Cvb,EAASzwB,EAAMpP,EAAS,EAAI,EAAIA,KAE3BsB,EAAQtB,GACf6/B,EAAOv+B,GAASopC,GAAM0Q,EAAO95C,GAE/B,OAAOu+B,EAqBT,SAASgB,GAAUpjB,EAAMotB,GACvB,IAAIvpC,GAAS,EACTtB,EAASyd,EAAOA,EAAKzd,OAAS,EAC9B6/B,EAAS,GAKb,IAHKgL,IAAU7qC,GAAWowC,GAAQ3yB,EAAK,MACrCotB,EAAS,MAEFvpC,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM+D,EAAKnc,GACXupC,EACFhL,EAAOnmB,GAAOmxB,EAAOvpC,GACZoY,IACTmmB,EAAOnmB,EAAI,IAAMA,EAAI,IAGzB,OAAOmmB,EA8DT,SAAS/2B,GAAK40C,EAAMsB,GAClB,OAAOp+C,UAAUZ,OAAS,EACtB8iD,GAAcpF,EAAM,GAAIl/C,EAAMoC,UAAW,GAAI,KAAMo+C,GACnD8D,GAAcpF,EAAM,EAAG,KAAM,KAAMsB,GAyMzC,SAASmH,GAASzI,EAAM0I,EAAMn8B,GAC5B,IAAItpB,EACA0lD,EACAxmB,EACAymB,EACAtH,EACAuH,EACAC,EACAC,EAAa,EACb7M,GAAU,EACVC,GAAW,EAEf,IAAKxD,GAAWqH,GACd,MAAM,IAAIV,EAGZ,GADAoJ,EAAOlI,GAAU,EAAGkI,IAAS,GACb,IAAZn8B,EAAkB,CACpB,IAAI0vB,GAAU,EACdE,GAAW,OACFuF,GAASn1B,KAClB0vB,EAAU1vB,EAAQ0vB,QAClBC,EAAU,YAAa3vB,IAAYi0B,GAAUkI,EAAMn8B,EAAQ2vB,UAAY,GACvEC,EAAW,aAAc5vB,EAAUA,EAAQ4vB,SAAWA,GAExD,IAAI6M,EAAU,WACZ,IAAIC,EAAYP,GAAQ3W,KAAQ6W,GAChC,GAAIK,GAAa,EAAG,CACdN,GACFhJ,GAAagJ,GAEf,IAAIO,EAAWJ,EACfH,EAAeE,EAAYC,OAhxK/BzjD,EAixKQ6jD,IACFH,EAAahX,KACb5P,EAAS6d,EAAK58C,MAAMk+C,EAASr+C,GACxB4lD,GAAcF,IACjB1lD,EAAOq+C,EAAU,YAIrBuH,EAAYtjD,GAAWyjD,EAASC,IAIhCE,EAAa,WACXN,GACFlJ,GAAakJ,GAEfF,EAAeE,EAAYC,OAjyK7BzjD,GAkyKM82C,GAAaD,IAAYwM,KAC3BK,EAAahX,KACb5P,EAAS6d,EAAK58C,MAAMk+C,EAASr+C,GACxB4lD,GAAcF,IACjB1lD,EAAOq+C,EAAU,QAKvB,OAAO,WAML,GALAr+C,EAAOC,UACP0lD,EAAQ7W,KACRuP,EAAUt7C,KACV8iD,EAAe3M,IAAa0M,IAAc5M,IAE1B,IAAZC,EACF,IAAIkN,EAAcnN,IAAY4M,MACzB,CACAF,GAAiB1M,IACpB8M,EAAaH,GAEf,IAAIK,EAAY/M,GAAW0M,EAAQG,GAC/BG,EAAWD,GAAa,EAExBC,GACEP,IACFA,EAAehJ,GAAagJ,IAE9BI,EAAaH,EACbzmB,EAAS6d,EAAK58C,MAAMk+C,EAASr+C,IAErB0lD,IACRA,EAAepjD,GAAW4jD,EAAYF,IAgB1C,OAbIC,GAAYL,EACdA,EAAYlJ,GAAakJ,GAEjBA,GAAaH,IAASxM,IAC9B2M,EAAYtjD,GAAWyjD,EAASN,IAE9BU,IACFF,GAAW,EACX/mB,EAAS6d,EAAK58C,MAAMk+C,EAASr+C,KAE3BimD,GAAaL,GAAcF,IAC7B1lD,EAAOq+C,EAAU,MAEZnf,GAuYX,SAASugB,GAASn/C,GAChB,OAAOA,EA+BT,SAAS8lD,GAAM1M,EAAQtW,EAAQ9Z,GAC7B,IAAI8W,GAAQ,EACRimB,EAAcjjB,GAAU6gB,GAAU7gB,GAEjCA,IAAY9Z,GAAY+8B,EAAYhnD,UACxB,MAAXiqB,IACFA,EAAU8Z,GAEZ4b,EAAOnB,GACPza,EAASsW,EACTA,EAAS3c,GACTspB,EAAcpC,GAAU7gB,KAEV,IAAZ9Z,EACF8W,GAAQ,EACCqe,GAASn1B,IAAY,UAAWA,IACzC8W,EAAQ9W,EAAQ8W,OAElB,IAAI4e,EAAOtF,EACP4M,EAAS5Q,GAAWsJ,GAExBx1C,GAAQ68C,GAAa,SAASE,GAC5B,IAAIxJ,EAAOrD,EAAO6M,GAAcnjB,EAAOmjB,GACnCD,IACFtH,EAAKthD,UAAU6oD,GAAc,WAC3B,IAAIzI,EAAW/6C,KAAKg7C,UAChBz9C,EAAQyC,KAAKi7C,YACbh+C,EAAO,CAACM,GAEZJ,GAAKC,MAAMH,EAAMC,WACjB,IAAIi/B,EAAS6d,EAAK58C,MAAMu5C,EAAQ15C,GAChC,GAAIogC,GAAS0d,EAAU,CACrB,GAAIx9C,IAAU4+B,GAAUuf,GAASvf,GAC/B,OAAOn8B,MAETm8B,EAAS,IAAI8f,EAAK9f,IACX6e,UAAYD,EAErB,OAAO5e,OAmCf,SAAS6jB,MAiBT,IA4qBM3f,GA5qBF0L,GAAM+N,GAAS/N,GAAM7wB,EAAK6wB,MAAQA,IAAO,WAC3C,OAAO,IAAI7wB,GAAOuoC,WAsBhBh7C,GAAgD,GAArCiyC,GAAegJ,oDAA0BhJ,GAAiB,SAASn9C,EAAOomD,GAEvF,OAAOjJ,GAAe4G,GAAS/jD,GAASA,EAAMd,QAAQy4C,EAAyB,IAAM33C,EAAOomD,GAAS,IA2BvG,SAASC,GAAS5tC,GAChB,OAAO,SAAS2gC,GACd,OAAOA,EAAO3gC,IAydlB,SAAS6tC,KACP,OAAO7jD,KAAKi7C,YA6Od,OAvOAjhB,GAAO8pB,MAr2CP,SAAexlD,EAAG07C,GAChB,IAAKrH,GAAWqH,GACd,MAAM,IAAIV,EAEZ,OAAO,WACL,KAAMh7C,EAAI,EACR,OAAO07C,EAAK58C,MAAM4C,KAAM9C,aAg2C9B88B,GAAOoiB,OAASA,GAChBpiB,GAAO+pB,GA7/GP,SAAYlY,GAOV,IANA,IAAI5uC,EAAOC,UACPU,GAAS,EACT0G,EAAQo5C,GAAYzgD,GAAM,GAAM,EAAO,GACvCX,EAAUW,EAAK,IAAMA,EAAK,GAAGA,EAAK,MAAQ4uC,EAAc,EAAIvnC,EAAMhI,OAClE6/B,EAASzwB,EAAMpP,KAEXsB,EAAQtB,GACd6/B,EAAOv+B,GAASiuC,EAAWvnC,EAAM1G,IAEnC,OAAOu+B,GAo/GTnC,GAAO50B,KAAOA,GACd40B,GAAOgqB,QA1yCP,SAAiBrN,GAKf,IAJA,IAAIsN,EAAQ/mD,UAAUZ,OAAS,EAAIohD,GAAYxgD,WAAW,GAAM,EAAO,GAAKgkD,GAAUvK,GAClF/4C,GAAS,EACTtB,EAAS2nD,EAAM3nD,SAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAMiuC,EAAMrmD,GAChB+4C,EAAO3gC,GAAOopC,GAAczI,EAAO3gC,GAAM,EAAG,KAAM,KAAM2gC,GAE1D,OAAOA,GAkyCT3c,GAAOkqB,QA7vCP,SAAiBvN,EAAQ3gC,GACvB,OAAO9Y,UAAUZ,OAAS,EACtB8iD,GAAcppC,EAAK,GAAIlb,EAAMoC,UAAW,GAAI,KAAMy5C,GAClDyI,GAAcppC,EAAK,EAAG,KAAM,KAAM2gC,IA2vCxC3c,GAAOqD,MAvGP,SAAe9/B,GAGb,OAFAA,EAAQ,IAAIu9C,GAAcv9C,IACpBy9C,WAAY,EACXz9C,GAqGTy8B,GAAOmqB,QA72EP,SAAiBzM,GAKf,IAJA,IAAI95C,GAAS,EACTtB,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChC6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQm6C,EAAM95C,GACdL,GACF4+B,EAAOh/B,KAAKI,GAGhB,OAAO4+B,GAm2ETnC,GAAOoqB,QA5tCP,WAIE,IAHA,IAAIH,EAAQ/mD,UACRZ,EAAS2nD,EAAM3nD,OAEZA,KACL,IAAKq2C,GAAWsR,EAAM3nD,IACpB,MAAM,IAAIg9C,EAGd,OAAO,WAIL,IAHA,IAAIr8C,EAAOC,UACPZ,EAAS2nD,EAAM3nD,OAEZA,KACLW,EAAO,CAACgnD,EAAM3nD,GAAQc,MAAM4C,KAAM/C,IAEpC,OAAOA,EAAK,KA6sChB+8B,GAAOnG,SAjwBP,SAAkBt2B,GAChB,OAAO,WACL,OAAOA,IAgwBXy8B,GAAOunB,QAAUA,GACjBvnB,GAAO91B,OAxlJP,SAAgBvJ,EAAW4hD,GACzB,IAAIpgB,EAASsf,GAAW9gD,GACxB,OAAO4hD,EAAaH,GAAOjgB,EAAQogB,GAAcpgB,GAulJnDnC,GAAOmlB,eA/tBP,SAAwBnF,EAAMsB,EAASmB,GACrC,IAAIr5C,SAAc42C,EAClB,GAAY,MAARA,GAAwB,YAAR52C,EAClB,OAAOo5C,GAAmBxC,EAAMsB,EAASmB,GAG3C,GAAY,UAARr5C,EACF,OAAOwgD,GAAS5J,GAElB,IAAI11C,EAAQyV,GAAKigC,GACbhkC,EAAM1R,EAAM,GACZqP,EAAIqmC,EAAKhkC,GAGb,OAAoB,GAAhB1R,EAAMhI,QAAeqX,GAAMA,GAAM+nC,GAAS/nC,GAQvC,SAASgjC,GAId,IAHA,IAAIr6C,EAASgI,EAAMhI,OACf6/B,GAAS,EAEN7/B,MACC6/B,EAAS8hB,GAAYtH,EAAOryC,EAAMhI,IAAU09C,EAAK11C,EAAMhI,IAAU,MAAM,MAI/E,OAAO6/B,GAdA,SAASwa,GACd,IAAIlnC,EAAIknC,EAAO3gC,GACf,OAAOrC,IAAMlE,IAAY,IAANkE,GAAY,EAAIA,GAAK,EAAIlE,KA6sBlDuqB,GAAOqqB,MAjrCP,SAAerK,EAAMkD,GAEnB,OAAOkC,GAAcpF,EAAM,EAAG,KAAM,KAAM,KAD1CkD,EAAwB,iBAATA,EAAoBA,GAAUA,GAASlD,EAAK19C,SAirC7D09B,GAAOyoB,SAAWA,GAClBzoB,GAAOzE,SAAWA,GAClByE,GAAOsqB,MAphCP,SAAetK,GACb,IAAKrH,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAIr8C,EAAOnC,EAAMoC,UAAW,GAC5B,OAAOqC,IAAW,WAAay6C,EAAK58C,WA12KpCiC,EA02KqDpC,KAAU,IAghCjE+8B,GAAOuqB,MA7/BP,SAAevK,EAAM0I,GACnB,IAAK/P,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAIr8C,EAAOnC,EAAMoC,UAAW,GAC5B,OAAOqC,IAAW,WAAay6C,EAAK58C,WAl4KpCiC,EAk4KqDpC,KAAUylD,IAy/BjE1oB,GAAOwqB,WA31EP,SAAoB9M,GAClB,OAAO6F,GAAe7F,EAAOgG,GAAYxgD,WAAW,GAAM,EAAM,KA21ElE88B,GAAO7gB,OAASA,GAChB6gB,GAAOpG,QAhoEP,SAAiB8jB,EAAOiG,EAAW5+C,EAAUu8C,GAU3C,MARwB,kBAAbqC,GAAuC,MAAbA,IACnCrC,EAAUv8C,EACVA,EAAgC,mBAAb4+C,GAA2BrC,GAAWA,EAAQqC,KAAejG,EAAS,KAAOiG,EAChGA,GAAY,GAEE,MAAZ5+C,IACF24C,EAAQt7C,GAAIs7C,EAAO34C,EAAUu8C,IAExBoC,GAAYhG,EAAOiG,IAunE5B3jB,GAAOvzB,QAAUA,GACjBuzB,GAAOynB,aAAeA,GACtBznB,GAAOykB,MAAQA,GACfzkB,GAAOyqB,WAt4IP,SAAoB9N,EAAQ53C,EAAUu8C,GACpC,IAAIoJ,EAAQ,GAEZjG,GAAM9H,GAAQ,SAASp5C,EAAOyY,GAC5B0uC,EAAMvnD,KAAK6Y,EAAKzY,MAGlB,IAAIjB,EAASooD,EAAMpoD,OAEnB,IADAyC,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,GAC1Ch/C,MACoD,IAArDyC,EAAS2lD,EAAMpoD,KAAWooD,EAAMpoD,GAASq6C,KAI/C,OAAOA,GAy3IT3c,GAAOqiB,OAASA,GAChBriB,GAAOinB,YAAcA,GACrBjnB,GAAOknB,UAAYA,GACnBlnB,GAAO0nB,QAAUA,GACjB1nB,GAAO2nB,QAAUA,GACjB3nB,GAAO2qB,QAxiEP,SAAiBjN,EAAO34C,EAAUu8C,GAChC,IAAIh9C,EAAI,EACJhC,EAASo7C,EAAQA,EAAMp7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,EAAQtB,EAEZ,IADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAC7C19C,KAAWmB,EAAS24C,EAAM95C,GAAQA,EAAO85C,IAC9Cp5C,SAGFA,EAAiB,MAAZS,GAAoBu8C,EAAW,EAAIv8C,GAAYT,EAEtD,OAAOxD,EAAM48C,EAAO,EAAG+C,GAAUD,GAAU,EAAGl+C,EAASgC,GAAIhC,KA4hE7D09B,GAAO4qB,aA3gEP,WASE,IARA,IAAI3nD,EAAO,GACP4jD,GAAa,EACbC,EAAa5jD,UAAUZ,OACvBuoD,EAASlM,IACT96C,EAAU2/C,KACVsH,EAAejnD,IAAY45C,EAC3BsH,EAAOpG,MAEFkI,EAAYC,GAAY,CAC/B,IAAIvjD,EAAQL,UAAU2jD,IAClBnU,GAAQnvC,IAAUsgD,GAAYtgD,MAChCN,EAAKE,KAAKI,GACVsnD,EAAO1nD,KAAK2nD,GAAgBvnD,EAAMjB,QA73IrB,IA83IXg8C,EAAYuI,EAAY5jD,EAAK4jD,GAAa9B,KAGhD,IAAIrH,EAAQz6C,EAAK,GACbW,GAAS,EACTtB,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChC6/B,EAAS,GAEb4oB,EACA,OAASnnD,EAAQtB,GAAQ,CACvB,IAAIu7C,EAAQgN,EAAO,GAGnB,GAFAtnD,EAAQm6C,EAAM95C,IAETi6C,EAAQD,EAAaC,EAAOt6C,GAASM,EAAQkhD,EAAMxhD,IAAU,EAAG,CAGnE,IAFAsjD,EAAYC,GACXjJ,GAASkH,GAAM5hD,KAAKI,KACZsjD,GAEP,KADAhJ,EAAQgN,EAAOhE,IACFjJ,EAAaC,EAAOt6C,GAASM,EAAQZ,EAAK4jD,GAAYtjD,IAAU,EAC3E,SAASwnD,EAGb5oB,EAAOh/B,KAAKI,IAGhB,KAAOujD,MACLjJ,EAAQgN,EAAO/D,KAEb9H,EAAcnB,GAKlB,OAFAkB,EAAa8L,GACb9L,EAAagG,GACN5iB,GA69DTnC,GAAOymB,OAASA,GAChBzmB,GAAOgrB,OA/hGP,SAAgBnZ,EAAY2X,GAC1B,IAAIvmD,EAAOnC,EAAMoC,UAAW,GACxBU,GAAS,EACT2lD,EAA8B,mBAAdC,EAChBlnD,EAASuvC,EAAaA,EAAWvvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAKxD,OAHAmK,GAAQolC,GAAY,SAAStuC,GAC3B4+B,IAASv+B,IAAU2lD,EAASC,EAAajmD,EAAMimD,IAAapmD,MAAMG,EAAON,MAEpEk/B,GAshGTnC,GAAOjgB,KAAOA,GACdigB,GAAO59B,IAAMA,GACb49B,GAAOZ,UAj2HP,SAAmBud,EAAQ53C,EAAUu8C,GACnC,IAAInf,EAAS,GAMb,OALAp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAEpDe,GAAO1F,GAAQ,SAASp5C,EAAOyY,EAAK2gC,GAClCxa,EAAOnmB,GAAOjX,EAASxB,EAAOyY,EAAK2gC,MAE9Bxa,GA21HTnC,GAAOhH,IAAMA,GACbgH,GAAOirB,QAr+BP,SAAiBjL,EAAMkL,GACrB,IAAKvS,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAI6L,EAAW,WACb,IAAItN,EAAQsN,EAAStN,MACjB7hC,EAAMkvC,EAAWA,EAAS9nD,MAAM4C,KAAM9C,WAAaw3C,EAAYx3C,UAAU,GAE7E,OAAOtC,GAAeO,KAAK08C,EAAO7hC,GAC9B6hC,EAAM7hC,GACL6hC,EAAM7hC,GAAOgkC,EAAK58C,MAAM4C,KAAM9C,YAGrC,OADAioD,EAAStN,MAAQ,GACVsN,GAy9BTnrB,GAAO/E,MAvyHP,SAAe0hB,GACb,IAAI15C,EAAOC,UACPZ,EAAS,EAEb,IAAKo/C,GAAS/E,GACZ,OAAOA,EAOT,GAHsB,iBAAX15C,EAAK,KACdX,EAASW,EAAKX,QAEZA,EAAS,GAAgC,mBAApBW,EAAKX,EAAS,GACrC,IAAIyC,EAAWy9C,GAAmBv/C,IAAOX,EAAS,GAAIW,EAAKX,KAAW,QAC7DA,EAAS,GAAgC,mBAApBW,EAAKX,EAAS,KAC5CyC,EAAW9B,IAAOX,IAOpB,IALA,IAAIk3B,EAAU14B,EAAMoC,UAAW,EAAGZ,GAC9BsB,GAAS,EACTk+C,EAASnD,IACToD,EAASpD,MAEJ/6C,EAAQtB,GACfoiD,GAAU/H,EAAQnjB,EAAQ51B,GAAQmB,EAAU+8C,EAAQC,GAItD,OAFAhD,EAAa+C,GACb/C,EAAagD,GACNpF,GA6wHT3c,GAAO3B,IA52FP,SAAawT,EAAY9sC,EAAUu8C,GACjC,IAAI0D,EAAW4C,EAAAA,EACXzlB,EAAS6iB,EAOb,GAHuB,mBAAZjgD,GAA0Bu8C,GAAWA,EAAQv8C,KAAc8sC,IACpE9sC,EAAW,MAEG,MAAZA,GAAoB2tC,GAAQb,GAI9B,IAHA,IAAIjuC,GAAS,EACTtB,EAASuvC,EAAWvvC,SAEfsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQsuC,EAAWjuC,GACnBL,EAAQ4+B,IACVA,EAAS5+B,QAIbwB,EAAwB,MAAZA,GAAoBuiD,GAASzV,GACrCmM,EACAhe,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAE7C70C,GAAQolC,GAAY,SAAStuC,EAAOK,EAAOiuC,GACzC,IAAIgW,EAAU9iD,EAASxB,EAAOK,EAAOiuC,GACjCgW,EAAU7C,IACZA,EAAW6C,EACX1lB,EAAS5+B,MAIf,OAAO4+B,GA60FTnC,GAAOorB,KAjvHP,SAAczO,EAAQ53C,EAAUu8C,GAC9B,IAAInf,EAAS,GACb,GAAuB,mBAAZp9B,EAAwB,CACjC,IAAIuF,EAAQ,GACZm6C,GAAM9H,GAAQ,SAASp5C,EAAOyY,GAC5B1R,EAAMnH,KAAK6Y,MAOb,IAHA,IAAIpY,GAAS,EACTtB,GAHJgI,EAAQi5C,GAAej5C,EAAOo5C,GAAYxgD,WAAW,GAAM,EAAO,KAG/CZ,SAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOnmB,GAAO2gC,EAAO3gC,SAGvBjX,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpDmD,GAAM9H,GAAQ,SAASp5C,EAAOyY,EAAK2gC,GAC5B53C,EAASxB,EAAOyY,EAAK2gC,KACxBxa,EAAOnmB,GAAOzY,MAIpB,OAAO4+B,GA0tHTnC,GAAOqrB,KAx8BP,SAAcrL,GACZ,IAAIsL,EACAnpB,EAEJ,IAAKwW,GAAWqH,GACd,MAAM,IAAIV,EAEZ,OAAO,WACL,OAAIgM,IAGJA,GAAM,EACNnpB,EAAS6d,EAAK58C,MAAM4C,KAAM9C,WAG1B88C,EAAO,MANE7d,IAg8BbnC,GAAO0qB,MA1sHP,SAAe/N,GAMb,IALA,IAAI/4C,GAAS,EACT0G,EAAQyV,GAAK48B,GACbr6C,EAASgI,EAAMhI,OACf6/B,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOv+B,GAAS,CAACoY,EAAK2gC,EAAO3gC,IAE/B,OAAOmmB,GAisHTnC,GAAOurB,QAp6BP,SAAiBvL,GACf,OAAOoF,GAAcpF,EAAM,GAAIl/C,EAAMoC,UAAW,KAo6BlD88B,GAAOwrB,aAt4BP,SAAsBxL,GACpB,OAAOoF,GAAcpF,EAAM,GAAI,KAAMl/C,EAAMoC,UAAW,KAs4BxD88B,GAAO3E,KArqHP,SAAcshB,EAAQ53C,EAAUu8C,GAC9B,IAAInf,EAAS,GACb,GAAuB,mBAAZp9B,EAKT,IAJA,IAAInB,GAAS,EACT0G,EAAQo5C,GAAYxgD,WAAW,GAAM,EAAO,GAC5CZ,EAASo/C,GAAS/E,GAAUryC,EAAMhI,OAAS,IAEtCsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GACZoY,KAAO2gC,IACTxa,EAAOnmB,GAAO2gC,EAAO3gC,SAIzBjX,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpDmD,GAAM9H,GAAQ,SAASp5C,EAAOyY,EAAK2gC,GAC7B53C,EAASxB,EAAOyY,EAAK2gC,KACvBxa,EAAOnmB,GAAOzY,MAIpB,OAAO4+B,GAipHTnC,GAAOgN,MAAQA,GACfhN,GAAO4pB,SAAWA,GAClB5pB,GAAOyrB,KA72DP,SAAc/N,GAMZ,IALA,IAAIz6C,EAAOC,UACP2jD,EAAY,EACZC,EAAa7jD,EAAKX,OAClBA,EAASo7C,EAAQA,EAAMp7C,OAAS,IAE3BukD,EAAYC,GAGnB,IAFA,IAAIljD,GAAS,EACTL,EAAQN,EAAK4jD,KACRjjD,EAAQtB,GACXo7C,EAAM95C,KAAWL,IACnBX,GAAOzB,KAAKu8C,EAAO95C,IAAS,GAC5BtB,KAIN,OAAOo7C,GA81DT1d,GAAO9G,MA3zDP,SAAe5I,EAAO2uB,EAAKyM,GACzBp7B,GAASA,GAAS,EAGP,MAAP2uB,IACFA,EAAM3uB,EACNA,EAAQ,GAQV,IAJA,IAAI1sB,GAAS,EACTtB,EAASk+C,GAAU,EAAGrV,IAAM8T,EAAM3uB,KATtCo7B,EAAsB,iBAARA,EAAmBA,GAASA,GAAQ,IASM,KACpDvpB,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GACf6/B,EAAOv+B,GAAS0sB,EAChBA,GAASo7B,EAEX,OAAOvpB,GA0yDTnC,GAAO2rB,OAnsFP,SAAgB9Z,EAAY9sC,EAAUu8C,GAEpC,OADAv8C,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAC7CniC,GAAO0yB,GAAY,SAAStuC,EAAOK,EAAOiuC,GAC/C,OAAQ9sC,EAASxB,EAAOK,EAAOiuC,OAisFnC7R,GAAOh4B,OAxwDP,SAAgB01C,EAAO34C,EAAUu8C,GAC/B,IAAI19C,GAAS,EACTtB,EAASo7C,EAAQA,EAAMp7C,OAAS,EAChC6/B,EAAS,GAGb,IADAp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,KAC3C19C,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQm6C,EAAM95C,GACdmB,EAASxB,EAAOK,EAAO85C,KACzBvb,EAAOh/B,KAAKI,GACZX,GAAOzB,KAAKu8C,EAAO95C,IAAS,GAC5BtB,KAGJ,OAAO6/B,GA2vDTnC,GAAOqoB,KAAOA,GACdroB,GAAOgoB,QAAUA,GACjBhoB,GAAOsD,OA7/EP,SAAgBuO,EAAY9sC,EAAUu8C,GACpC,IAAI19C,GAAS,EACTs+C,EAAQxP,GAAQ3tC,GAChBzC,EAASuvC,EAAaA,EAAWvvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAkBxD,IAhBK4/C,IACHn9C,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,IAEtD70C,GAAQolC,GAAY,SAAStuC,EAAOyY,EAAK61B,GACvC,IAAI8K,EAASxa,IAASv+B,GAAS66C,IAC3ByD,EACFvF,EAAOyB,SAAWh8C,GAAI2C,GAAU,SAASiX,GAAO,OAAOzY,EAAMyY,OAE5D2gC,EAAOyB,SAAWO,KAAY,GAAK55C,EAASxB,EAAOyY,EAAK61B,GAE3D8K,EAAO/4C,MAAQA,EACf+4C,EAAOp5C,MAAQA,KAGjBjB,EAAS6/B,EAAO7/B,OAChB6/B,EAAO3X,KAAK0zB,GACL57C,KAAU,CACf,IAAIq6C,EAASxa,EAAO7/B,GACpB6/B,EAAO7/B,GAAUq6C,EAAOp5C,MACnB2+C,GACHnD,EAAapC,EAAOyB,UAEtBY,EAAcrC,GAEhB,OAAOxa,GAg+ETnC,GAAO4rB,IA/HP,SAAaroD,EAAOsoD,GAElB,OADAA,EAAYtoD,GACLA,GA8HTy8B,GAAO8rB,SA/2BP,SAAkB9L,EAAM0I,EAAMn8B,GAC5B,IAAI0vB,GAAU,EACVE,GAAW,EAEf,IAAKxD,GAAWqH,GACd,MAAM,IAAIV,EAYZ,OAVgB,IAAZ/yB,EACF0vB,GAAU,EACDyF,GAASn1B,KAClB0vB,EAAU,YAAa1vB,EAAUA,EAAQ0vB,QAAUA,EACnDE,EAAW,aAAc5vB,EAAUA,EAAQ4vB,SAAWA,GAExDH,EAAgBC,QAAUA,EAC1BD,EAAgBE,QAAUwM,EAC1B1M,EAAgBG,SAAWA,EAEpBsM,GAASzI,EAAM0I,EAAM1M,IA+1B9Bhc,GAAO+rB,MAzOP,SAAeznD,EAAGS,EAAUu8C,GAC1Bh9C,GAAKA,GAAKA,IAAM,EAAIA,EAAI,EACxB,IAAIV,GAAS,EACTu+B,EAASzwB,EAAMpN,GAGnB,IADAS,EAAWy9C,GAAmBz9C,EAAUu8C,EAAS,KACxC19C,EAAQU,GACf69B,EAAOv+B,GAASmB,EAASnB,GAE3B,OAAOu+B,GAiOTnC,GAAOgsB,QAn9EP,SAAiBna,GACf,OAAIA,GAA0C,iBAArBA,EAAWvvC,OAC3BxB,EAAM+wC,GAER1E,GAAO0E,IAg9EhB7R,GAAOgT,UA5nHP,SAAmB2J,EAAQ53C,EAAU+9C,EAAaxB,GAChD,IAAIY,EAAQxP,GAAQiK,GACpB,GAAmB,MAAfmG,EACF,GAAIZ,EACFY,EAAc,OACT,CACL,IAAIb,EAAOtF,GAAUA,EAAO4H,YACxB0H,EAAQhK,GAAQA,EAAKthD,UAEzBmiD,EAAcrB,GAAWwK,GAS7B,OANIlnD,IACFA,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,IACnDY,EAAQz1C,GAAU41C,IAAQ1F,GAAQ,SAASp5C,EAAOK,EAAO+4C,GACxD,OAAO53C,EAAS+9C,EAAav/C,EAAOK,EAAO+4C,OAGxCmG,GA2mHT9iB,GAAOiZ,MA7mDP,WACE,OAAO4L,GAASnB,GAAYxgD,WAAW,GAAM,KA6mD/C88B,GAAOuoB,KAAOA,GACdvoB,GAAOmN,OAASA,GAChBnN,GAAOmoB,MAAQA,GACfnoB,GAAOksB,QAriDP,SAAiBxO,GACf,OAAO6F,GAAe7F,EAAO58C,EAAMoC,UAAW,KAqiDhD88B,GAAOrpB,KA/0BP,SAAcpT,EAAO4oD,GACnB,OAAO/G,GAAc+G,EAAS,GAAI,CAAC5oD,KA+0BrCy8B,GAAOosB,IAlhDP,WAIE,IAHA,IAAIxoD,GAAS,EACTtB,EAASY,UAAUZ,SAEdsB,EAAQtB,GAAQ,CACvB,IAAIo7C,EAAQx6C,UAAUU,GACtB,GAAI8uC,GAAQgL,IAAUmG,GAAYnG,GAChC,IAAIvb,EAASA,EACT0iB,GAAStB,GAAephB,EAAQub,GAAO/6C,OAAO4gD,GAAe7F,EAAOvb,KACpEub,EAGR,OAAOvb,GAAU,IAugDnBnC,GAAOwoB,IAAMA,GACbxoB,GAAOmD,UAAYA,GAGnBnD,GAAOqsB,QAAUjqD,GACjB49B,GAAOssB,KAAOjE,GACdroB,GAAOhM,KAAOvnB,GACduzB,GAAOusB,UAAY9E,GACnBznB,GAAOwsB,OAASpK,GAChBpiB,GAAOysB,QAAUvF,GACjBlnB,GAAO2c,OAASxZ,GAChBnD,GAAO1f,OAASnB,GAChB6gB,GAAO0sB,KAAOrE,GACdroB,GAAO2sB,OAASpE,GAChBvoB,GAAO4sB,MAAQpE,GAGfa,GAAMrpB,IAKNA,GAAOia,MA9vJP,SAAe12C,EAAOs+C,EAAQ98C,EAAUu8C,GAQtC,MALqB,kBAAVO,GAAiC,MAAVA,IAChCP,EAAUv8C,EACVA,EAAW88C,EACXA,GAAS,GAEJD,GAAUr+C,EAAOs+C,EAA2B,mBAAZ98C,GAA0By9C,GAAmBz9C,EAAUu8C,EAAS,KAuvJzGthB,GAAOgF,UA3sJP,SAAmBzhC,EAAOwB,EAAUu8C,GAClC,OAAOM,GAAUr+C,GAAO,EAAyB,mBAAZwB,GAA0By9C,GAAmBz9C,EAAUu8C,EAAS,KA2sJvGthB,GAAOl4B,SAAWA,GAClBk4B,GAAO2lB,OA/vBP,SAAgBl4C,GACd,OAAiB,MAAVA,EAAiB,GAAKpH,EAAOoH,GAAQhL,QAAQkkD,GAAiBpB,KA+vBvEvlB,GAAOwnB,MAAQA,GACfxnB,GAAOxhB,KAAOA,GACdwhB,GAAO6sB,UA53EP,SAAmBnP,EAAO34C,EAAUu8C,GAClC,IAAI19C,GAAS,EACTtB,EAASo7C,EAAQA,EAAMp7C,OAAS,EAGpC,IADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,KAC3C19C,EAAQtB,GACf,GAAIyC,EAAS24C,EAAM95C,GAAQA,EAAO85C,GAChC,OAAO95C,EAGX,OAAQ,GAm3EVo8B,GAAO8sB,QAtlJP,SAAiBnQ,EAAQ53C,EAAUu8C,GACjC,IAAInf,EAQJ,OAPAp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpDe,GAAO1F,GAAQ,SAASp5C,EAAOyY,EAAK2gC,GAClC,GAAI53C,EAASxB,EAAOyY,EAAK2gC,GAEvB,OADAxa,EAASnmB,GACF,KAGJmmB,GA8kJTnC,GAAO+sB,SApyGP,SAAkBlb,EAAY9sC,EAAUu8C,GACtC,IAAInf,EAQJ,OAPAp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpDmG,GAAa5V,GAAY,SAAStuC,EAAOK,EAAOiuC,GAC9C,GAAI9sC,EAASxB,EAAOK,EAAOiuC,GAEzB,OADA1P,EAAS5+B,GACF,KAGJ4+B,GA4xGTnC,GAAOgtB,cAz0EP,SAAuBtP,EAAO34C,EAAUu8C,GACtC,IAAIh/C,EAASo7C,EAAQA,EAAMp7C,OAAS,EAEpC,IADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAC7Ch/C,KACL,GAAIyC,EAAS24C,EAAMp7C,GAASA,EAAQo7C,GAClC,OAAOp7C,EAGX,OAAQ,GAk0EV09B,GAAOitB,YApiJP,SAAqBtQ,EAAQ53C,EAAUu8C,GACrC,IAAInf,EAQJ,OAPAp9B,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GACpD2F,GAAYtK,GAAQ,SAASp5C,EAAOyY,EAAK2gC,GACvC,GAAI53C,EAASxB,EAAOyY,EAAK2gC,GAEvB,OADAxa,EAASnmB,GACF,KAGJmmB,GA4hJTnC,GAAOjM,IAr1IP,SAAa4oB,EAAQ3gC,GACnB,QAAO2gC,GAAS/7C,GAAeO,KAAKw7C,EAAQ3gC,IAq1I9CgkB,GAAO0iB,SAAWA,GAClB1iB,GAAOn8B,QAAUA,GACjBm8B,GAAO6jB,YAAcA,GACrB7jB,GAAO0S,QAAUA,GACjB1S,GAAOktB,UA/yIP,SAAmB3pD,GACjB,OAAiB,IAAVA,IAA4B,IAAVA,GACvBA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUm4C,IAAa,GA8yI9E1b,GAAOmtB,OA9xIP,SAAgB5pD,GACd,OAAOA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUo4C,IAAa,GA8xInF3b,GAAOotB,UA9wIP,SAAmB7pD,GACjB,OAAOA,GAA4B,IAAnBA,EAAM2I,WAAkB,GA8wI1C8zB,GAAO3Q,QAtvIP,SAAiB9rB,GACf,IAAI4+B,GAAS,EACb,IAAK5+B,EACH,OAAO4+B,EAET,IAAI6f,EAAY56C,EAASjG,KAAKoC,GAC1BjB,EAASiB,EAAMjB,OAEnB,OAAK0/C,GAAavG,GAAcuG,GAAanG,GAAemG,GAAaxG,GACpEwG,GAAapG,GAAgC,iBAAVt5C,GAAsBq2C,GAAWp1C,EAAMX,SACrEN,GAEV+/C,GAAO9+C,GAAO,WACZ,OAAQ4+B,GAAS,KAEZA,IAwuITnC,GAAOqtB,QA/rIP,SAAiB1zC,EAAGlE,EAAG1Q,EAAUu8C,GAC/B,OAAO2C,GAAYtqC,EAAGlE,EAAsB,mBAAZ1Q,GAA0By9C,GAAmBz9C,EAAUu8C,EAAS,KA+rIlGthB,GAAOogB,SAhqIP,SAAkB78C,GAChB,OAAO48C,GAAe58C,KAAW88C,GAAYiN,WAAW/pD,KAgqI1Dy8B,GAAO2Y,WAAaA,GACpB3Y,GAAOsgB,MAxlIP,SAAe/8C,GAGb,OAAO4jD,GAAS5jD,IAAUA,IAAUA,GAslItCy8B,GAAOutB,OAnkIP,SAAgBhqD,GACd,OAAiB,OAAVA,GAmkITy8B,GAAOmnB,SAAWA,GAClBnnB,GAAO0hB,SAAWA,GAClB1hB,GAAOsZ,cAAgBA,GACvBtZ,GAAOwtB,SA9/HP,SAAkBjqD,GAChB,OAAOA,GAAyB,iBAATA,GAl5ET,mBAk5E8B6D,EAASjG,KAAKoC,KAAyB,GA8/HrFy8B,GAAOsnB,SAAWA,GAClBtnB,GAAO4C,YA79HP,SAAqBr/B,GACnB,YAAuB,IAATA,GA69HhBy8B,GAAO7T,YAn9DP,SAAqBuxB,EAAOn6C,EAAOo6C,GACjC,IAAI/5C,EAAQ85C,EAAQA,EAAMp7C,OAAS,EAInC,IAHwB,iBAAbq7C,IACT/5C,GAAS+5C,EAAY,EAAI6C,GAAU,EAAG58C,EAAQ+5C,GAAa8C,GAAU9C,EAAW/5C,EAAQ,IAAM,GAEzFA,KACL,GAAI85C,EAAM95C,KAAWL,EACnB,OAAOK,EAGX,OAAQ,GA08DVo8B,GAAOqpB,MAAQA,GACfrpB,GAAOytB,WAnrBP,WAEE,OADAtO,EAAQjsB,EAAIusB,EACLz5C,MAkrBTg6B,GAAOgmB,KAAOA,GACdhmB,GAAO+R,IAAMA,GACb/R,GAAOvxB,SAAWA,GAClBuxB,GAAO4gB,OAhkBP,SAAgBviB,EAAKrF,EAAK00B,GACxB,IAAIC,EAAe,MAAPtvB,EACRuvB,EAAe,MAAP50B,EAsBZ,GApBgB,MAAZ00B,IACgB,kBAAPrvB,GAAoBuvB,GAC7BF,EAAWrvB,EACXA,EAAM,GAEEuvB,GAAuB,kBAAP50B,IACxB00B,EAAW10B,EACX40B,GAAQ,IAGRD,GAASC,IACX50B,EAAM,GAERqF,GAAOA,GAAO,EACVuvB,GACF50B,EAAMqF,EACNA,EAAM,GAENrF,GAAOA,GAAO,EAEZ00B,GAAYrvB,EAAM,GAAKrF,EAAM,EAAG,CAClC,IAAIivB,EAAOtH,KACX,OAAOF,GAAUpiB,EAAO4pB,GAAQjvB,EAAMqF,EAAMivB,WAAW,QAAUrF,EAAM,IAAI3lD,OAAS,KAAO02B,GAE7F,OAAO4rB,GAAWvmB,EAAKrF,IAqiBzBgH,GAAO7H,OAASA,GAChB6H,GAAO+nB,YAAcA,GACrB/nB,GAAOmC,OAzgBP,SAAgBwa,EAAQ3gC,GACtB,GAAI2gC,EAAQ,CACV,IAAIp5C,EAAQo5C,EAAO3gC,GACnB,OAAO28B,GAAWp1C,GAASo5C,EAAO3gC,KAASzY,IAugB/Cy8B,GAAOkf,aAAeA,EACtBlf,GAAOoO,KA/rFP,SAAcyD,GACZ,IAAIvvC,EAASuvC,EAAaA,EAAWvvC,OAAS,EAC9C,MAAwB,iBAAVA,EAAqBA,EAASyd,GAAK8xB,GAAYvvC,QA8rF/D09B,GAAOkoB,KAAOA,GACdloB,GAAOooB,YAAcA,GACrBpoB,GAAO6tB,SAjbP,SAAkBtlD,EAAMgN,EAAMgX,GAK5B,IAAIuhC,EAAW9tB,GAAO0lB,iBACtBn9C,EAAOlC,EAAOkC,GAAQ,IAGtBgkB,EAAUgP,GAAS,GAAIhP,EAASuhC,GAEhC,IAIIC,EAJAhI,EAAUxqB,GAAS,GAAIhP,EAAQw5B,QAAS+H,EAAS/H,SACjDiI,EAAcjuC,GAAKgmC,GACnBkI,EAAgB9gB,GAAO4Y,GAGvBniD,EAAQ,EACRiiD,EAAct5B,EAAQs5B,aAAe1K,EACrC9U,EAAS,WAGT6nB,EAAe9nD,GAChBmmB,EAAQo5B,QAAUxK,GAAW9U,OAAS,IACvCwf,EAAYxf,OAAS,KACpBwf,IAAgB5K,EAAgBH,EAAeK,GAAW9U,OAAS,KACnE9Z,EAAQq5B,UAAYzK,GAAW9U,OAAS,KACzC,KAEF99B,EAAK9F,QAAQyrD,GAAc,SAAS7wC,EAAO8wC,EAAaC,EAAkBC,EAAiBC,EAAe9/C,GAqBxG,OApBA4/C,IAAqBA,EAAmBC,GAGxChoB,GAAU99B,EAAKzH,MAAM8C,EAAO4K,GAAQ/L,QAAQ44C,EAAmBqD,GAG3DyP,IACF9nB,GAAU,YAAc8nB,EAAc,UAEpCG,IACFP,GAAe,EACf1nB,GAAU,OAASioB,EAAgB,eAEjCF,IACF/nB,GAAU,iBAAmB+nB,EAAmB,+BAElDxqD,EAAQ4K,EAAS6O,EAAM/a,OAIhB+a,KAGTgpB,GAAU,OAIV,IAAIyf,EAAWv5B,EAAQu5B,SACnByI,EAAczI,EAEbyI,IAEHloB,EAAS,UADTyf,EAAW,OACoB,QAAUzf,EAAS,SAGpDA,GAAU0nB,EAAe1nB,EAAO5jC,QAAQk4C,EAAsB,IAAMtU,GACjE5jC,QAAQm4C,EAAqB,MAC7Bn4C,QAAQo4C,EAAuB,OAGlCxU,EAAS,YAAcyf,EAAW,SAC/ByI,EAAc,GAAKzI,EAAW,QAAUA,EAAW,aACpD,qCACCiI,EACG,uFAEA,OAEJ1nB,EACA,gBAIF,IAAImoB,EAAY,wBAA0BjiC,EAAQiiC,WAAa,2BAA8BjT,IAAqB,KAAO,OAEzH,IACE,IAAIpZ,EAASkd,EAAS2O,EAAa,UAAY3nB,EAASmoB,GAAWprD,WAppMrEiC,EAopMsF4oD,GACpF,MAAMvpD,GAEN,MADAA,EAAE2hC,OAASA,EACL3hC,EAER,OAAI6Q,EACK4sB,EAAO5sB,IAKhB4sB,EAAOkE,OAASA,EACTlE,IAiVTnC,GAAOyuB,SA5RP,SAAkBhhD,GAChB,OAAiB,MAAVA,EAAiB,GAAKpH,EAAOoH,GAAQhL,QAAQikD,GAAeR,KA4RrElmB,GAAOtL,SAzQP,SAAkB/wB,GAChB,IAAIiB,IAAO61C,EACX,OAAOp0C,EAAiB,MAAV1C,EAAiB,GAAKA,GAAUiB,GA0QhDo7B,GAAO0uB,IAAMlH,GACbxnB,GAAO2uB,IAAMzG,GACbloB,GAAO4uB,OAASpwC,GAChBwhB,GAAO6uB,UAAYrwC,GACnBwhB,GAAO8uB,MAAQ32B,GACf6H,GAAO+uB,MAAQhH,GACf/nB,GAAOgvB,QAAUlnD,GACjBk4B,GAAOivB,OAAS92B,GAEhBkxB,IACMhjB,GAAS,GACbgc,GAAOriB,IAAQ,SAASggB,EAAMwJ,GACvBxpB,GAAOr/B,UAAU6oD,KACpBnjB,GAAOmjB,GAAcxJ,MAGlB3Z,KACJ,GAKLrG,GAAOue,MAAQA,GACfve,GAAO1C,KA3iEP,SAAcogB,EAAO34C,EAAUu8C,GAC7B,IAAIh9C,EAAI,EACJhC,EAASo7C,EAAQA,EAAMp7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,EAAQtB,EAEZ,IADAyC,EAAWi7B,GAAOmlB,eAAepgD,EAAUu8C,EAAS,GAC7C19C,KAAWmB,EAAS24C,EAAM95C,GAAQA,EAAO85C,IAC9Cp5C,SAIF,GAAS,OADTA,EAAIS,IACau8C,EACf,OAAO5D,EAAQA,EAAMp7C,EAAS,QA9+IlC+C,EAi/IA,OAAOvE,EAAM48C,EAAO8C,GAAU,EAAGl+C,EAASgC,KA4hE5C07B,GAAOkvB,OA1xFP,SAAgBrd,EAAYvtC,EAAGsiD,GAI7B,GAHI/U,GAA0C,iBAArBA,EAAWvvC,SAClCuvC,EAAa1E,GAAO0E,IAEb,MAALvtC,GAAasiD,EACf,OAAO/U,EAAaA,EAAW+S,GAAW,EAAG/S,EAAWvvC,OAAS,SAxvHnE+C,EA0vHA,IAAI88B,EAAS6lB,GAAQnW,GAErB,OADA1P,EAAO7/B,OAASm+C,GAAUD,GAAU,EAAGl8C,GAAI69B,EAAO7/B,QAC3C6/B,GAoxFTnC,GAAOmvB,KAAO5Q,GACdve,GAAO/2B,KAAOs1C,GAEd8D,GAAOriB,IAAQ,SAASggB,EAAMwJ,GAC5B,IAAI4F,EAA8B,WAAf5F,EACdxpB,GAAOr/B,UAAU6oD,KACpBxpB,GAAOr/B,UAAU6oD,GAAa,SAASllD,EAAGsiD,GACxC,IAAI7F,EAAW/6C,KAAKg7C,UAChB7e,EAAS6d,EAAKh6C,KAAKi7C,YAAa38C,EAAGsiD,GAEvC,OAAQ7F,GAAkB,MAALz8C,KAAcsiD,GAAWwI,GAA4B,mBAAL9qD,GAEjE,IAAIw8C,GAAc3e,EAAQ4e,GAD1B5e,OAeVnC,GAAOqvB,QAAU,QAGjBrvB,GAAOr/B,UAAU0iC,MA7OjB,WAEE,OADAr9B,KAAKg7C,WAAY,EACVh7C,MA4OTg6B,GAAOr/B,UAAUyG,SA7NjB,WACE,OAAOf,EAAOL,KAAKi7C,cA6NrBjhB,GAAOr/B,UAAU4C,MAAQsmD,GACzB7pB,GAAOr/B,UAAUymD,QAAUyC,GAG3Bp9C,GAAQ,CAAC,OAAQ,MAAO,UAAU,SAAS+8C,GACzC,IAAIxJ,EAAOT,EAASiK,GACpBxpB,GAAOr/B,UAAU6oD,GAAc,WAC7B,IAAIzI,EAAW/6C,KAAKg7C,UAChB7e,EAAS6d,EAAK58C,MAAM4C,KAAKi7C,YAAa/9C,WAE1C,OAAO69C,EACH,IAAID,GAAc3e,EAAQ4e,GAC1B5e,MAKR11B,GAAQ,CAAC,OAAQ,UAAW,OAAQ,YAAY,SAAS+8C,GACvD,IAAIxJ,EAAOT,EAASiK,GACpBxpB,GAAOr/B,UAAU6oD,GAAc,WAE7B,OADAxJ,EAAK58C,MAAM4C,KAAKi7C,YAAa/9C,WACtB8C,SAKXyG,GAAQ,CAAC,SAAU,QAAS,WAAW,SAAS+8C,GAC9C,IAAIxJ,EAAOT,EAASiK,GACpBxpB,GAAOr/B,UAAU6oD,GAAc,WAC7B,OAAO,IAAI1I,GAAcd,EAAK58C,MAAM4C,KAAKi7C,YAAa/9C,WAAY8C,KAAKg7C,eAIpEhhB,GAMDkf,GAgBC7B,GAAeC,EAElBC,GACDD,EAAW74C,QAAUyuB,GAAGA,EAAIA,EAI7BmqB,EAAYnqB,EAAIA,EAKlBhb,EAAKgb,EAAIA,IAEX/xB,KAAK6E,QAEJ7E,KAAK6E,KAAuB,oBAAX8rB,OAAyBA,OAAyB,oBAATC,KAAuBA,KAAyB,oBAAXnsB,OAAyBA,OAAS,KAClI,KAAK,GAAG,CAAC,GAvkVoU,CAukVhU,MAUf7F,EAAO,sBAAsB,CAAC,cAAc,SAAUiyB,GAEpD,MAAM5R,EAAIhY,SAEJskB,EAAU,IAAItmB,OAAO,kCAmB3B,MAAO,CAML8D,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MACnBoE,MAAMuiB,IAKVviB,MAAQ,SAAUuiB,GAChB3mB,KAAK6wB,MAAQ,IAAI7W,OAAO,GAGxB,IAAI4M,EAAOxM,EAAE/X,cAAc,OAC3BukB,EAAKrf,UAAYof,EAEjB,MAAM0G,EAAI,IAAIrB,EAAMK,SAASoF,MAAM,CACjC0W,UAAa,IA2Bf,OAxBA9a,EAAE2E,SAAS,CACTmH,QAAY,GACZrD,QAAY,GACZmC,QAAY,GACZE,QAAY,KAEd9K,EAAE6lB,oBAAoB,IAEtBlzC,KAAKspD,OAASj8B,EAGdrtB,KAAKupD,SACHvpD,KAAK6wB,QACL,CAAE24B,MAAU,SAIdxpD,KAAKmnB,OAAO,EAAGP,EAAKnhB,gBAAYpG,GAGH,IAAzBguB,EAAEY,SAAS,GAAG3xB,QAChB+wB,EAAEqG,WAAW,GAEf9M,OAAOvnB,EACAW,MAITypD,GAAK,SAAUvnD,GACb,OAAOkY,EAAEsvC,gBAzEC,6BAyEsBxnD,IAOlCisB,MAAQ,WACN,OAAOnuB,KAAK6wB,OAKd04B,SAAW,SAAU3qD,EAAI3D,GAIvB,OAHAA,EAAW,MAnFF,GAoFTA,EAAY,OApFU,GAqFtB+E,KAAKspD,OAAOr3B,QAAQrzB,EAAI3D,GACjBA,GAKT0uD,SAAW,SAAUrmD,EAAKghB,GACxBtkB,KAAKspD,OAAO76B,QAAQnrB,EAAKghB,IAK3BslC,OAAS,SAAUt6C,GACjB,OAAOA,EAAM7S,QAAQiqB,EAAS,OAKhCS,OAAS,SAAU7W,EAAQ9K,EAAUmiB,GAsDnC,OArDAniB,EAASiB,SAAQ,SAAS2W,GAGxB,GAAkB,GAAdA,EAAElX,SAGJ,GAAIkX,EAAE2K,aAAa,SAAU,CAG3B,MAAMnpB,EAAKoB,KAAK6wB,QAEV51B,EAAM+E,KAAKupD,SAAS3qD,EAAI,CAC5B4qD,MAAU,SACVn7B,MAAUruB,KAAK4pD,OAAOxsC,EAAE2K,aAAa,iBAG1B1oB,IAATsoB,IACF1sB,EAAIuuD,OAAS,SAGfxpD,KAAK2pD,SAASr5C,EAAQ1R,GAGlBwe,EAAE+K,iBACJnoB,KAAKmnB,OAAOvoB,EAAIwe,EAAE3X,WAAYkiB,QAIzBvK,EAAE+K,iBAETnoB,KAAKmnB,OACH7W,EACA8M,EAAE3X,WACY,SAAd2X,EAAEoI,SAA4BmC,QAM/B,GAAkB,GAAdvK,EAAElX,UAELkX,EAAErX,UAAUsR,MAAM,cAAe,CAGnC,MAAMzY,EAAKoB,KAAK6wB,QAChB7wB,KAAKupD,SAAS3qD,EAAI,CAChB4qD,MAAU,OACVn7B,MAAUjR,EAAErX,YAGd/F,KAAK2pD,SAASr5C,EAAQ1R,MAEzBoB,MACIA,MAKTuN,KAAO,aAUPs8C,OAAS,WACP,QAAiBxqD,IAAbW,KAAKiF,IACP,OAEF,MAAM6kD,EAAU9pD,KAAKiF,IAAIY,WACnBkkD,EAASzC,WAAW1nD,OAAOoqD,iBAAiBhqD,KAAKiF,KAAKmqB,OACtD66B,EAAY3C,WAAW1nD,OAAOoqD,iBAAiBF,GAAS16B,OAG1D26B,EAASE,IACXH,EAAQI,YAAcH,EAASE,GAAa,IAQhDE,SAAW,WAGT,MAAMC,EAAahwC,EAAE/X,cAAc,OACnC+nD,EAAW7iD,UAAYvH,KAAK+E,UAAUslD,UAEtC,MAAMC,EAAMF,EAAWvpD,WACjBsI,EAAQnJ,KAAKypD,GAAG,SAYtB,OAVAa,EAAI1kD,qBAAqB,QAAQ,GAAGzD,YAAYgH,GAEhDA,EAAM5B,UACL,kSAOMgjD,KAAK9B,SAAS+B,mBAAmBF,EAAID,YAAY5tD,QAAQ,UAAW,OAO7EsI,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAEd,MAAMooB,EAAIrtB,KAAKspD,OACft9B,EAAMM,OAAOe,GAEb,MAAMo9B,EAASzqD,KAAKypD,GAAG,OACvBzpD,KAAKiF,IAAMwlD,EAEXA,EAAOtoD,YAAYnC,KAAKypD,GAAG,SAG3B,MAAM/5C,EAAO1P,KAEb,IAAIsD,EAAKghB,EAAQ9lB,EAEjB6uB,EAAEuB,QAAQnoB,SACR,SAAU/H,GACR4E,EAAM+pB,EAAEzsB,KAAKlC,EAAEqF,GACfugB,EAAS+I,EAAEzsB,KAAKlC,EAAEwvB,GAClB1vB,EAAIkR,EAAK+5C,GAAG,QACZjrD,EAAEksD,eAAe,KAAM,IA5O/B,SAAgBpnD,EAAKghB,GACnB,MAAMqmC,EAAKrnD,EAAI8sB,EACTw6B,EAAKtnD,EAAI4sB,EACT26B,EAAKvmC,EAAO8L,EACZ06B,EAAKxmC,EAAO4L,EAAI5L,EAAO5a,OAAS,EAGtC,MAAO,KAAOihD,EAAK,IAAMC,EAAlB,MACED,EAAK,IAAMC,EAAK,IACvBC,EAAK,KAAOC,GAAMA,EAAKF,GAAM,GAAM,IACnCC,EAAK,IAAMC,EAkOqBC,CAAMznD,EAAKghB,IACvC9lB,EAAEqD,UAAUE,IAAI,QAChB0oD,EAAOtoD,YAAY3D,MAIvB,IAAIkL,EAAS2jB,EAAEE,QAAQ7jB,OAgFvB,OA7EA2jB,EAAEc,QAAQ1nB,SACR,SAAU1C,GACRA,EAAIspB,EAAEzsB,KAAKmD,GACX,MAAMiO,EAAQtC,EAAK+5C,GAAG,KACtBz3C,EAAMpI,aAAa,QAAS7F,EAAEylD,OAG9B,MAAM/d,EAAOz5B,EAAM7P,YAAYuN,EAAK+5C,GAAG,SAevC,GAdAhe,EAAK7hC,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACvCqc,EAAK7hC,aAAa,IAAK7F,EAAEmsB,EAAInsB,EAAE2F,OAAS,GACxC+hC,EAAK7hC,aAAa,KAAM,GACxB6hC,EAAK7hC,aAAa,KAAM,GACxB6hC,EAAK7hC,aAAa,QAAS7F,EAAEqrB,OAC7Bqc,EAAK7hC,aAAa,SAAU7F,EAAE2F,QAEd,SAAZ3F,EAAEylD,YAAgCnqD,IAAZ0E,EAAEsqB,QAC1Bod,EAAK7hC,aAAa,QAAS7F,EAAE2F,QAC7B+hC,EAAK7hC,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAE2F,OAAS,GACxC+hC,EAAK7hC,aAAa,QAAS,eAIbvK,IAAZ0E,EAAEsqB,MAAqB,CACzB,MAAM9rB,EAAOyP,EAAM7P,YAAYuN,EAAK+5C,GAAG,SACvC,IAAIv5B,EAAInsB,EAAEmsB,EAAInsB,EAAE2F,OAAS,EACzBnH,EAAKqH,aAAa,IAAKsmB,GACvB3tB,EAAKqH,aACH,YACA,aAAe7F,EAAEqrB,MAAM,EAAI,KAAQrrB,EAAE2F,OAAS,EAAK,GAAK,KAG1D,MAAMi8B,EAAS5hC,EAAEsqB,MAAM5xB,QAAQ,UAAW,KACnCA,QAAQ,SAAU,KAClBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KAExB,GAAgB,SAAZsH,EAAEylD,MAAkB,CACtBjnD,EAAKqH,aAAa,QAAS+7B,GAE3B,IACIqlB,EADA1sD,EAAI,EAERqnC,EAAOxpC,MAAM,KAAKsK,SAAQ,SAASjI,GAChB,IAAbA,EAAElC,SAGN0uD,EAAQt7C,EAAK+5C,GAAG,SAChBuB,EAAM7oD,YAAYiY,EAAE5X,eAAehE,IAEzB,IAANF,EACF0sD,EAAMphD,aAAa,KAAMqhD,QAEzB3sD,EAAI,EAEN0sD,EAAMphD,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACxCc,GA9S6B,GA+S7B3tB,EAAKJ,YAAY6oD,OAGnB96B,GAlT+B,GAqT3BA,EAAIxmB,IACNA,EAASwmB,OAER,CACH,MAAM86B,EAAQt7C,EAAK+5C,GAAG,SACtBuB,EAAM7oD,YAAYiY,EAAE5X,eAAemjC,IACnCqlB,EAAMphD,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACxC7sB,EAAKJ,YAAY6oD,IAGrBP,EAAOtoD,YAAY6P,MAIvBy4C,EAAO7gD,aAAa,QAASyjB,EAAEE,QAAQ6B,OACvCq7B,EAAO7gD,aAAa,SAAUF,GACvB1J,KAAKiF,KAGdimD,aAAe,WACb,MAAMv3C,EAAIyG,EAAE/X,cAAc,KAM1B,OALAsR,EAAE/J,aAAa,YAAa,iBAC5B+J,EAAE/J,aAAa,OAAQ,6BAA+B5J,KAAKmqD,YAC3Dx2C,EAAE/J,aAAa,WAAY,YAC3B+J,EAAE2Q,OAAS,SACX3Q,EAAE/J,aAAa,MAAO,uBACf+J,OAYb5Z,EAAO,gBAAgB,IAAI,WAEzB,MACM2sB,EAAU,IAAItmB,OAAO,kCACrBga,EAAIhY,SAEV,MAAO,CACL8B,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MAAMoE,MAAMuiB,IAInCviB,MAAQ,SAAUuiB,GAEhB,MAAM7f,EAAI9G,KAoBV,GAjBA8G,EAAEqkD,QAAW,GACbrkD,EAAEskD,MAAW,GACbtkD,EAAEukD,eAAiB,GACnBvkD,EAAEwkD,GAAK,EACPxkD,EAAEykD,qBAAkBlsD,EAGpByH,EAAE0kD,OAAc,IAChB1kD,EAAE2kD,YAAc,GAChB3kD,EAAE4kD,QAAc,GAChB5kD,EAAE6kD,WAAc,EAChB7kD,EAAE8kD,YAAc,GAChB9kD,EAAE+kD,SAAc,GAChB/kD,EAAEglD,SAAc,GAChBhlD,EAAEilD,SAAc,EAGD1sD,MAAXsnB,GAAmC,MAAXA,EAC1B,OAAO7f,EAGT,MAAM8f,EAAOxM,EAAE/X,cAAc,OAC7BukB,EAAKrf,UAAYof,EAGjB7f,EAAEklD,KAAO,CACP1nC,OAAS,GACTsK,MAAS,GACTroB,IAAS,GAIXO,EAAEqgB,OAAO,EAAGP,EAAKnhB,gBAAYpG,GAG7B,MAAM4sD,EAAYnlD,EAAEklD,KAAa,OAGjC,IAAIE,EAAU5nC,EAAQ6nC,EAoCtB,OAtCcrlD,EAAEklD,KAAY,MAOtBvlD,SAAQ,SAASgnB,GAGrBy+B,EAAWz+B,EAAKy+B,SAChB5nC,EAAS2nC,EAAUC,GAEL7sD,MAAVilB,IAWF6nC,EAAW,CACT7hC,MAAQ,CAACmD,EAAK2+B,SAAU3+B,EAAK4+B,QAC7BpT,IAAM30B,EACNgoC,UAAY,MACZj+B,MAAQZ,EAAKY,OAGfruB,KAAKusD,OAAOJ,MAEbrlD,UAGIA,EAAQ,KAER9G,MAITmnB,OAAS,SAAU7W,EAAQ9K,EAAUmiB,GAGnCjc,MAAMma,KAAKrgB,GAAUiB,SAAQ,SAAS2W,GAGpC,GAAkB,GAAdA,EAAElX,SAAe,CAEnB,IAAIsmD,EAAOloC,EAAQgG,EAAO2uB,EAG1B,GAAI77B,EAAEyK,aAAa,UAGjB2kC,EAAQpvC,EAAE2K,aAAa,UAEvBuC,EAAQtqB,KAAKgsD,KAAU,IACvB/S,EAAMj5C,KAAKgsD,KAAU,SAKlB,GAAI5uC,EAAEyK,aAAa,cAGtB,GAAoC,SAAhCzK,EAAE2K,aAAa,eACf3K,EAAEyK,aAAa,gBACkB,QAAjCzK,EAAE2K,aAAa,eAEjBykC,EAAQpvC,EAAE2K,aAAa,cAActrB,QAAQ,KAAM,IACnD6tB,EAAQtqB,KAAKgsD,KAAU,IACvB/S,EAAMj5C,KAAKgsD,KAAU,QAQlB,CACH,IAAI39B,EAGJ/J,EAASlH,EAAE2K,aAAa,cAActrB,QAAQ,KAAM,IAEhD2gB,EAAEyK,aAAa,iBACjBwG,EAAQruB,KAAK4pD,OAAOxsC,EAAE2K,aAAa,iBAKrC,IAAI0F,EAAO,CACTY,MAAWA,EACX+9B,SAAWpsD,KAAKgsD,KAAU,IAC1BE,SAAW5nC,GAIR+J,EAAMhX,MAAM,QAAWgX,EAAMhX,MAAM,UACtCrX,KAAKgsD,KAAY,MAAE7uD,KAAKswB,GAa9B,GANIrQ,EAAE+K,iBACJnoB,KAAKmnB,OAAO,EAAG/J,EAAE3X,WAAYkiB,QAKjBtoB,IAAVmtD,EAAqB,CAKvB,QAAmCntD,IAA/BW,KAAKgsD,KAAa,OAAEQ,GAAsB,CAC5C,MAAMC,EAAYzsD,KAAKgsD,KAAa,OAAEQ,GACtCvT,EAAMj5C,KAAKgsD,KAAU,IAAI,EACzBS,EAAU,GAAKniC,EAAQmiC,EAAU,GAAKniC,EAAQmiC,EAAU,GACxDA,EAAU,GAAKxT,EAAMwT,EAAU,GAAKxT,EAAMwT,EAAU,QAKpDxT,EAAMj5C,KAAKgsD,KAAU,IAAI,EACzBhsD,KAAKgsD,KAAa,OAAEQ,GAAS,CAACliC,EAAO2uB,GAUvCuT,OAAQntD,YAIUA,IAAXilB,IAGPmJ,EAAa,OAAIztB,KAAKgsD,KAAU,IAAG,EAUnC1nC,OAASjlB,QAKR,GAAkB,GAAd+d,EAAElX,eAGW7G,IAAhB+d,EAAErX,UAAyB,CAE7B,MAAMmN,EAAMkK,EAAErX,UAAUM,YAEZhH,IAAR6T,GAAqBA,EAAI5W,OAAS,IAGpC0D,KAAK0sD,SAASx5C,GAGdlT,KAAKgsD,KAAU,UAIpBhsD,OAOL4pD,OAAS,SAAUt6C,GACjB,OAAOA,EAAM7S,QAAQiqB,EAAS,OAQhC0hB,KAAO,WACL,OAAOpoC,KAAKmrD,QAAQ7uD,QAKtBmtD,GAAK,SAAUvnD,GACb,OAAOkY,EAAEsvC,gBA5PC,6BA4PsBxnD,IAKlCyqD,MAAQ,SAAU/rD,GAChB,GAAoB,SAAhBA,EAAK4kB,UAAuBonC,UAAUC,UAAUx1C,MAAM,QAAS,CACjE,MAAM6b,EAAQ9Y,EAAE0yC,cAChB55B,EAAM65B,WAAWnsD,GACjB,MAAM6qC,EAAOvY,EAAMhkB,wBAEnB,OADAgkB,EAAM85B,SACCvhB,EAET,OAAO7qC,EAAKsO,yBAKd+9C,YAAc,SAAUrsD,GACvB,MAAMssD,EAAMltD,KAAK2sD,MAAM/rD,GACvB,OAAOssD,EAAI/9C,KAAQ+9C,EAAI99B,MAAQ,GAKhC+9B,YAAc,SAAUC,GAGtB,MAAMC,EAAWrtD,KAAK2sD,MAAM3sD,KAAKqrD,eAAe+B,EAAO7U,QACjD+U,EAAWttD,KAAK2sD,MAAM3sD,KAAKqrD,eAAe+B,EAAO91B,OAEjDpH,EAAIlwB,KAAKsrD,GAAM8B,EAAOG,SAAWvtD,KAAK2rD,WAAc3rD,KAAK4rD,YACzDprC,EAAIxgB,KAAKypD,GAAG,QAEnBzpD,KAAKwtD,aAAarrD,YAAYqe,GAE7B,MAAMitC,EAAU,MACXJ,EAASl+C,KAAOnP,KAAK0tD,YACtB,IACAx9B,EACA,OACCo9B,EAAQK,MAAQ3tD,KAAK0tD,YACtB,IAAMx9B,EAMV,OAJA1P,EAAE5W,aAAa,IAAK6jD,GACpBjtC,EAAE5W,aAAa,QAAS,UACxBwjD,EAAOroD,QAAUyb,EACjB4sC,EAAOl9B,EAAIA,EACJ1P,GAMTotC,SAAW,SAAUC,GAEnB,MAAM/mD,EAAI9G,KACV,IAAI8tD,EAAUC,EACVC,EAAShuD,KAAKsrD,GACd2C,EAAOjuD,KAAKsrD,QAEQjsD,IAApBwuD,EAAIK,aACNJ,EAAWhnD,EAAEmmD,YAAYY,EAAIK,YAAYnpD,SACzCipD,EAASH,EAAIK,YAAYh+B,GAGzB49B,EAAWhnD,EAAEmmD,YAAYnmD,EAAEukD,eAAewC,EAAItV,aAG1Bl5C,IAAlBwuD,EAAIM,WACNJ,EAASjnD,EAAEmmD,YAAYY,EAAIM,UAAUppD,SACrCkpD,EAAOJ,EAAIM,UAAUj+B,GAGrB69B,EAASjnD,EAAEmmD,YAAYnmD,EAAEukD,eAAewC,EAAIv2B,OAG9Cw2B,GAAYhnD,EAAE4mD,WACdK,GAAUjnD,EAAE4mD,WAGZ,IAAIH,EAAWM,EAAIN,SACfO,GAAYC,IACdD,GAAYhnD,EAAE2kD,YAAc,EAC5BsC,GAAYjnD,EAAE2kD,YAAc,EAC5B8B,GAAY,IAGd,MAAMlgC,EAAIvmB,EAAE2iD,GAAG,KACfp8B,EAAEzjB,aAAa,QAAS,OACxB,MAAMpL,EAAI6uB,EAAElrB,YAAY2E,EAAE2iD,GAAG,SAC7BjrD,EAAEoL,aAAa,QAAS,QAGxB9C,EAAE0mD,aAAarrD,YAAYkrB,GAG3B,IAAI+gC,EAASr7B,KAAKwE,IAAIw2B,EAASD,GAAY,EAIvCO,EAAUvnD,EAAE4kD,QAAW6B,EAAWzmD,EAAE2kD,YAAgB2C,EAAS,EAGjEC,EAAUA,EAAUvnD,EAAE0kD,OAAS6C,EAAUvnD,EAAE0kD,OAE3C,IAAIp7B,EAAI2C,KAAKsF,IAAIy1B,EAAUC,GAG3B,IAAIO,EAAYL,EAAOI,EAEvB,MAAME,EAAO,KAAMT,EAAW,IAAME,EAChC,MAAQF,EAAW,IAAMQ,EACzB,IAAMP,EAAS,IAAMO,EACrB,IAAMP,EAAS,IAAME,EAWzB,GATAzvD,EAAEoL,aAAa,IAAK2kD,QAEElvD,IAAlBwuD,EAAIvB,YACN9tD,EAAEoL,aAAa,aAAc,aACP,OAAlBikD,EAAIvB,WACN9tD,EAAEoL,aAAa,eAAgB,mBAIjBvK,IAAdwuD,EAAIx/B,MACN,OAAOhB,EAST,IAAImhC,IAAaR,EAASM,GAAY,EAAKA,GAAY,EAGvD,MAAMjgC,EAAQruB,KAAKypD,GAAG,KACtBp7B,EAAMzkB,aAAa,QAAS,SAC5B9C,EAAE2nD,eAAetsD,YAAYksB,GAG7BA,EAAMqgC,OAASrhC,EAEf,MAAM3d,EAAO5I,EACbunB,EAAMvkB,iBAAiB,cAAc,WACnC4F,EAAKi/C,QAAQ3uD,SAGf,MAAM4uD,EAASvgC,EAAMlsB,YAAY2E,EAAE2iD,GAAG,SACtCmF,EAAOhlD,aAAa,IAAKwmB,EAAIg+B,GAC7BQ,EAAOhlD,aAAa,IAAK4kD,EAAU,GACnCI,EAAOhlD,aAAa,cAAe,UACnC,MAAMilD,EAAWz0C,EAAE5X,eAAeqrD,EAAIx/B,OACtCugC,EAAOzsD,YAAY0sD,GAEnB,MAAMC,EAAaF,EAAOG,UAOpBC,EAAaF,EAAS1/B,MACtB6/B,EAAaH,EAASplD,OAGtBwlD,EAAS7gC,EAAM3nB,aAAaI,EAAE2iD,GAAG,QAASmF,GAC1CO,EAAWH,EAAY,EAAIloD,EAAEglD,SACnCoD,EAAOtlD,aAAa,IAAKwmB,EAAIg+B,EAAUe,EAAW,GAClDD,EAAOtlD,aAAa,KAAM,GAC1BslD,EAAOtlD,aAAa,IAAKklD,EAAS5+B,EAAIppB,EAAEilD,UACxCmD,EAAOtlD,aAAa,QAASulD,GAC7BD,EAAOtlD,aAAa,SAAUqlD,EAAa,EAAInoD,EAAEilD,WAOnDhnD,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMqlD,EAAMtqD,KAAKypD,GAAG,OAEpB7pD,OAAOkK,iBAAiB,SAAU,WAKhC9J,KAAKuN,QACLnI,KAAKpF,OAGP,MACMovD,EADO9E,EAAInoD,YAAYnC,KAAKypD,GAAG,SACjBtnD,YAAYnC,KAAKypD,GAAG,WACxC2F,EAAOxlD,aAAa,OAAQ,GAC5BwlD,EAAOxlD,aAAa,KAAM,OAC1BwlD,EAAOxlD,aAAa,SAAU,sBAC9BwlD,EAAOxlD,aAAa,cAAc,kBAElC,MAAMylD,EAAQrvD,KAAKypD,GAAG,QAMtB,OALA4F,EAAMzlD,aAAa,YAAa,cAChCylD,EAAMzlD,aAAa,IAAK,qBACxBwlD,EAAOjtD,YAAYktD,GAEnBrvD,KAAKiF,IAAMqlD,EACJtqD,KAAKiF,KAMdsnD,OAAS,SAAU+C,GAEjB,OADAtvD,KAAKorD,MAAMjuD,KAAKmyD,GACTtvD,MAKT0sD,SAAW,SAASzmC,GAElB,OADAjmB,KAAKmrD,QAAQhuD,KAAK8oB,GACXjmB,MAKT2uD,QAAU,SAAU5pD,GAClB,IAAIwqD,EAEJ,GAAIvvD,KAAKurD,gBAAiB,CAGxB,GAAIvrD,KAAKurD,kBAAoBxmD,EAC3B,OAEFwqD,EAAMvvD,KAAKurD,gBACXgE,EAAI1tD,UAAUG,OAAO,WACrButD,EAAIb,OAAO7sD,UAAUG,OAAO,WAG9ButD,EAAMvvD,KAAKurD,gBAAkBxmD,EAC7B/E,KAAKyuD,eAAetsD,YAAYotD,GAChCvvD,KAAKwtD,aAAarrD,YAAYotD,EAAIb,QAClCa,EAAI1tD,UAAUE,IAAI,WAClBwtD,EAAIb,OAAO7sD,UAAUE,IAAI,YAQ3BytD,UAAY,WAMV,IAAIC,EAAU,GAYd,MAAMC,EAAa1vD,KAAKorD,MAAMhvD,KAAI,SAAU2H,GAG1C,GAAIA,EAAEumB,iBAAiB5e,MAErB,GAAI3H,EAAEumB,MAAM,IAAMvmB,EAAEumB,MAAM,GACxBvmB,EAAEumB,MAAQvmB,EAAEumB,MAAM,OAGf,CAEH,MAAM8jC,EAASr7B,KAAKoS,KAAKpS,KAAKwE,IAAIxzB,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,IAAM,GAAKvmB,EAAEumB,MAAM,GAG1E,IAAIqlC,EAAY,IAAM5rD,EAAEumB,MAAM,GAAK,IAAMvmB,EAAEumB,MAAM,GAG7CvmB,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,KACvBqlC,EAAY,IAAM5rD,EAAEumB,MAAM,GAAK,IAAMvmB,EAAEumB,MAAM,IAI/C,IAAI8iC,EAASqC,EAAQE,QACNtwD,IAAX+tD,IACFA,EAAS,CACP7U,MAAWx0C,EAAEumB,MAAM,GACnBgN,KAAWvzB,EAAEumB,MAAM,GACnBhuB,OAAWyH,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,IAElCmlC,EAAQE,GAAavC,GAGvBrpD,EAAEmqD,YAAcd,EAGhBrpD,EAAEumB,MAAQ8jC,EAId,GAAIrqD,EAAEk1C,eAAevtC,MAEnB,GAAI3H,EAAEk1C,IAAI,IAAMl1C,EAAEk1C,IAAI,GACpBl1C,EAAEk1C,IAAMl1C,EAAEk1C,IAAI,OAGX,CAEH,MAAMmV,EAASr7B,KAAKwE,IAAIxzB,EAAEk1C,IAAI,GAAKl1C,EAAEk1C,IAAI,IAAMl1C,EAAEk1C,IAAI,GAGrD,IAAI0W,EAAY,IAAM5rD,EAAEk1C,IAAI,GAAK,IAAMl1C,EAAEk1C,IAAI,GAGzCl1C,EAAEk1C,IAAI,GAAKl1C,EAAEk1C,IAAI,KACnB0W,EAAY,IAAM5rD,EAAEk1C,IAAI,GAAK,IAAMl1C,EAAEk1C,IAAI,IAI3C,IAAImU,EAASqC,EAAQE,QACNtwD,IAAX+tD,IACFA,EAAS,CACP7U,MAAWx0C,EAAEk1C,IAAI,GACjB3hB,KAAWvzB,EAAEk1C,IAAI,GACjB38C,OAAWyH,EAAEk1C,IAAI,GAAKl1C,EAAEk1C,IAAI,IAE9BwW,EAAQE,GAAavC,GAGvBrpD,EAAEoqD,UAAYf,EAGdrpD,EAAEk1C,IAAMmV,EAgBZ,OAZArqD,EAAEw0C,MAAQx0C,EAAEumB,MACZvmB,EAAEuzB,KAAQvzB,EAAEk1C,IAGRl1C,EAAEumB,MAAQvmB,EAAEk1C,IACdl1C,EAAEzH,OAASyH,EAAEk1C,IAAMl1C,EAAEumB,MAIrBvmB,EAAEzH,OAASyH,EAAEumB,MAAQvmB,EAAEk1C,IAGlBl1C,KAIT2rD,EAAWlrC,MAAK,SAAU7Q,EAAGlE,GAC3B,OAAIkE,EAAErX,OAASmT,EAAEnT,QACP,EAED,KAIX0D,KAAK4vD,YAAiBC,EAAWH,GAAY,GAC7C1vD,KAAK8vD,eAAiBD,EAAWn1D,OAAOysC,OAAOsoB,IAAU,IAS3D5F,OAAS,WACP,QAAiBxqD,IAAbW,KAAKiF,IACR,OAED,MAAM6kD,EAAU9pD,KAAKiF,IAAIY,WAEnBkkD,EAASzC,WAAW1nD,OAAOoqD,iBAAiBhqD,KAAKiF,KAAKmqB,OACtD66B,EAAY3C,WAAW1nD,OAAOoqD,iBAAiBF,GAAS16B,OAE9D,GAAI26B,EAASE,EAAW,CACvB,IAAI8F,GAAehG,EAASE,GAAa,EACzCH,EAAQI,WAAa6F,IAMxBxiD,KAAO,WACL,MAAMzG,EAAI9G,KACJsqD,EAAMtqD,KAAKiF,IACXyE,EAAS1J,KAAKwrD,YAGqBnsD,IAArCirD,EAAI1kD,qBAAqB,KAAK,KAChC0kD,EAAIxpD,YACFwpD,EAAI1kD,qBAAqB,KAAK,IAEhCkB,EAAEukD,eAAiB,IAGrB,MAAMh+B,EAAIi9B,EAAInoD,YAAY2E,EAAE2iD,GAAG,MAGzBlnD,EAAO8qB,EAAElrB,YAAY2E,EAAE2iD,GAAG,SAChClnD,EAAKqH,aAAa,QAAS,QAC3BrH,EAAKqH,aAAa,cAAe,SACjCrH,EAAKqH,aAAa,IAAKF,GAGvB5C,EAAEwkD,GAAK5hD,EAAU5C,EAAa,YAG9B,MAAMi+B,EAAKxiC,EAAKJ,YAAY2E,EAAE2iD,GAAG,UACjC1kB,EAAG5iC,YAAYiY,EAAE5X,eAAe,MAChCuiC,EAAG57B,MAAM6mD,WAAa,QAEtBlpD,EAAEqkD,QAAQ1kD,SAAQ,SAASwpD,GAGzB,MAAMjF,EAAQzoD,EAAKJ,YAAYnC,KAAKypD,GAAG,UACvCuB,EAAM7oD,YAAYiY,EAAE5X,eAAeytD,IACnCjF,EAAMphD,aAAa,cAAe,UAElC5J,KAAKqrD,eAAeluD,KAAK6tD,GAGzBA,EAAMphD,aAAa,KAAM5J,KAAK6rD,YAC7B/kD,GAGHA,EAAE4mD,WAAa5mD,EAAE6lD,MAAMt/B,GAAGle,KAG1B,MAAM+gD,EAAO7iC,EAAElrB,YAAY2E,EAAE2iD,GAAG,MAChC3iD,EAAE0mD,aAAe0C,EACjBA,EAAKruD,UAAUE,IAAI,QAEnB,MAAMouD,EAAS9iC,EAAElrB,YAAY2E,EAAE2iD,GAAG,MAClC3iD,EAAE2nD,eAAiB0B,EACnBA,EAAOtuD,UAAUE,IAAI,eAGC1C,IAAlByH,EAAE8oD,aACJ9oD,EAAE0oD,YAGJ1oD,EAAEgpD,eAAerpD,QACf1K,GAAK+K,EAAEqmD,YAAYpxD,IAIrB+K,EAAE8oD,YAAYnpD,QACZ1K,GAAK+K,EAAE8mD,SAAS7xD,IAIlBuuD,EAAI1gD,aAAa,QAAS9C,EAAE6lD,MAAMpqD,GAAM6sB,MAAQ,IAChDk7B,EAAI1gD,aAAa,SAAUF,EAAS,IACpC4gD,EAAI1gD,aAAa,QAAS,aAK9B,SAASimD,EAAY5kD,EAAMmlD,GAQzB,IAAIxiC,EAAQ,GAgDZ,OA7CA3iB,EAAKxE,SAAQ,SAASo7C,GAGpB,IACI9xC,EADAw9C,EAAW,EAEf,IAAK,IAAIvxD,EAAK4xB,EAAMtxB,OAAS,EAAIN,GAAK,EAAGA,IAAK,CAI5C,GAHA+T,EAAQ6d,EAAM5xB,GAGV6lD,EAAQtJ,OAASxoC,EAAMwoC,OAASsJ,EAAQvqB,MAAQvnB,EAAMunB,KAAM,CAC9Di2B,EAAWx9C,EAAMw9C,SAAW,EAC5B,MAIO1L,EAAQtJ,OAASxoC,EAAMwoC,OAASsJ,EAAQvqB,MAAQvnB,EAAMwoC,OAEzD6X,GAAcvO,EAAQtJ,OAASxoC,EAAMwoC,OAASsJ,EAAQvqB,MAAQvnB,EAAMwoC,SACtEgV,EAAWx9C,EAAMw9C,UAAY1L,EAAQvlD,QAAUyT,EAAMzT,OAAS,EAAI,IAK7DulD,EAAQtJ,OAASxoC,EAAMunB,MAAQuqB,EAAQvqB,MAAQvnB,EAAMunB,OAExD84B,GAAcvO,EAAQtJ,OAASxoC,EAAMunB,MAAQuqB,EAAQvqB,MAAQvnB,EAAMunB,QACrEi2B,EAAWx9C,EAAMw9C,UAAY1L,EAAQvlD,QAAUyT,EAAMzT,OAAS,EAAI,IAMxEulD,EAAQ0L,SAAWA,EAEnB3/B,EAAMzwB,KAAK0kD,GAMXj0B,EAAMpJ,MAAK,SAAU7Q,EAAElE,GACrBA,EAAE89C,SAAW55C,EAAE45C,eAIZ3/B,MAMX7zB,EAAO,uBAAuB,CAC5B,OACA,sBACA,kBACC,SAAUmkB,EAAWmyC,EAAyBC,GAE/C,MAAMl2C,EAAIhY,SACJO,EAAQ9C,MAAM6C,OAIpB,OAHAC,EAAIif,SAAWjf,EAAIif,UAAY,WAGxB,CACL1d,OAAS,SAAUmT,EAAMwM,EAAQE,EAAM3gB,GACrC,OAAO1I,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,cACPC,UAAUrE,MACVoE,MAAMiT,EAAOwM,EAASE,EAAO3gB,IAKlCgB,MAAQ,SAAUiT,EAAMwM,EAASE,EAAO3gB,GAKtC,OAJApD,KAAK2oB,OAAStR,EACdrX,KAAK8jB,SAAWD,EAChB7jB,KAAKgkB,OAASD,EACd/jB,KAAKsX,MAAQlU,EACNpD,MAOTuN,KAAO,WAEL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAM4xC,EAAYn2C,EAAE/X,cAAc,OAClCkuD,EAAU1uD,UAAUE,IAAI,YAAa,WAGrC,MAAMyuD,EAAKD,EAAUtuD,KAAK,MAM1B,OALAuuD,EAAGvuD,KAAK,QAAQK,KAAKtC,KAAK8jB,UAC1B0sC,EAAGvuD,KAAK,QAAQK,KAAKtC,KAAKgkB,QAE1BhkB,KAAKywD,MAAQF,EAAUtuD,KAAK,OAErBjC,KAAK2e,MAAQ4xC,GAOtB5yC,WAAa,WAEX,MAAMkG,EAAU7jB,KAAK8jB,SACfC,EAAQ/jB,KAAKgkB,OACb5gB,EAAOpD,KAAKsX,MAEZ5H,EAAO1P,KACPy9B,EAAOz9B,KAAKywD,MACZF,EAAYvwD,KAAK2e,MAGvB3e,KAAK6oB,QAAQhF,EAASE,EAAO3gB,GAAM,SAAUstD,GAE3CH,EAAU1uD,UAAUG,OAAO,WAIX,OAAZ0uD,EACFjzB,EAAKn7B,KAAK,uBAGVm7B,EAAKt7B,YAAYuuD,EAAQ3rD,WACzB2rD,EAAQnjD,OAOK,UAATnK,GAGFsM,EAAK2N,QAAQtb,IACXY,EAAIif,SACJ,CAACrQ,IAAM,CAAC,cAAc,cACtB,SAAU7S,GACR,MAAMiV,EAAI+8C,EAAQxF,eAClB9wC,EAAEu2C,KAAKxuD,YAAYwR,GACnBA,EAAEgJ,QACFvC,EAAEu2C,KAAK7vD,YAAY6S,MAKzB+8C,EAAQ7G,aAIZ0G,EAAU1uD,UAAUG,OAAO,YAM7BqV,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUhF,EAASE,EAAO3gB,EAAMoM,GAGxC,IAEE3P,MAAM4C,IAAIumB,aACRhpB,KAAK2oB,OAAQ,CACXM,OAAU,EACVpF,QAAYA,EACZE,MAAUA,GAEZ,SAAUmF,QACc7pB,IAAlB6pB,QAM6B7pB,IAA7B6pB,EAAuB,QAKvB1Z,EADW,UAATpM,EACCitD,EAAwBnsD,OAAOglB,EAAuB,SAEzC,SAAT9lB,EACJktD,EAAkBpsD,OAAOglB,EAAuB,SAKhD,MAlBL1Z,EAAG,OAwBLpK,KAAKpF,OAGX,MAAOtB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAMPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAYpBtF,EAAO,cAAc,CACnB,QACA,iBACA,wBACA,kBACA,uBACA,qBACC,SAAUwlB,EAAWqxC,EAAcC,EAAUC,EAASC,EAAcC,GAGrEnxD,MAAM4C,IAAIumB,aAAenpB,MAAM4C,IAAIumB,cAAgB,WAEjD,OADAnpB,MAAMsD,IAAI,EAAG,4CACN,IAGT,MAAMR,EAAM9C,MAAM6C,OAMlB,OAJAC,EAAI+e,SAAY/e,EAAI+e,UAAa,SACjC/e,EAAIof,UAAYpf,EAAIof,WAAa,WACjCpf,EAAI8e,QAAY9e,EAAI8e,SAAa,YAE1B,CACLvd,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,cAAcC,UAAUrE,MAAMoE,MAAMiT,IAI9EjT,MAAQ,SAAUiT,GAEhBrX,KAAK2oB,OAAStR,EAEd,MAAM1D,EAAI3T,KAAKqd,QAITzb,EAAK+R,EAAE5O,UAAUlD,UA4CvB,GA3CAD,EAAGI,OAAO,aACVJ,EAAGG,IAAI,oBAGP4R,EAAE5R,IACAY,EAAIof,UAAW,CAACxQ,IAAM,CAAC,eAAe,SAAU7S,GAC9CsB,KAAKixD,aAKTt9C,EAAE5R,IACAY,EAAI+e,SAAU,CAACnQ,IAAM,CAAC,UAAU,SAAU7S,GACxCsB,KAAKkxD,cAKTv9C,EAAE5R,IACAY,EAAI8e,QAAS,CAAClQ,IAAM,CAAC,UAAU,SAAU7S,QAGhBW,IAAnBQ,MAAMsxD,WACRtxD,MAAMsxD,SAAWH,EAAqB9sD,OAAO,GAAI0sD,GACjD/wD,MAAMsxD,SAASpsD,UAAU6E,aAAa,KAAM,aAG9C,MAAMwnD,EAAKvxD,MAAMsxD,SAGjBC,EAAG5iD,MAAMxO,MAGToxD,EAAGzlD,UAAU3L,KAAKqxD,iBAGlBD,EAAG7jD,OACH6jD,EAAGziD,OAAO3O,KAAK2O,QACfyiD,EAAG1mD,WAKH7K,MAAMyxD,OAAQ,CAChB,MAAMC,EAAe1xD,MAAMyxD,OAAOlzC,YAAY,SAC1CmzC,GAGFA,EAAa9qD,QAAQQ,GAAK0M,EAAE5R,IAAI3E,MAAMuW,EAAG1M,IAI7C,OAAOjH,MAOTixD,QAAU,WACR,MAAMnqD,EAAI9G,KACN8G,EAAE0qD,WAAa1qD,EAAE0qD,UAAUljD,UAG/BxH,EAAE0qD,UAAYV,EAAS5sD,OAAO4C,EAAE6hB,QAChC7hB,EAAE/E,IAAI+E,EAAE0qD,aAOVN,SAAW,WACT,MAAMpqD,EAAI9G,KACN8G,EAAE2qD,YAAc3qD,EAAE2qD,WAAWnjD,UAEjCxH,EAAE2qD,WAAaZ,EAAU3sD,OAAO4C,EAAE6hB,QAClC7hB,EAAE/E,IAAI+E,EAAE2qD,cAOVxtC,QAAU,SAAUJ,EAASE,EAAO3gB,GAClCpD,KAAK+B,IACHgvD,EAAc7sD,OAAOlE,KAAK2oB,OAAQ9E,EAASE,EAAO3gB,KAOtDiuD,cAAgB,WAEd,GAAIrxD,KAAK0xD,UACP,OAAO1xD,KAAK0xD,UAGd,IAAIC,EAAa,GAEjB,MAAMt6C,EAAQrX,KAAK2oB,OACnBtR,EAAMu6C,WAAWnrD,QAAQ1K,GAAK41D,EAAWx0D,KAAKpB,IAC9Csb,EAAMw6C,UAAUprD,QAAQ1K,GAAK41D,EAAWx0D,KAAKpB,IAG7C41D,EAAaA,EAAWntC,MACtB,SAAU7Q,EAAGlE,GACX,OAAIkE,EAAEkQ,QAAUpU,EAAEoU,SACR,EAEDlQ,EAAEkQ,QAAUpU,EAAEoU,QACd,EAEAlQ,EAAEoQ,MAAQtU,EAAEsU,OACX,EAEDpQ,EAAEoQ,MAAQtU,EAAEsU,MACZ,EAEF,KAGX,IAAI+tC,EAAW,GAef,OAZAH,EAAWlrD,QACT8C,GAEEuoD,EAAS30D,KAAK,CACZoM,EAAEsa,QAAU,IAAMta,EAAEwa,MACpBxa,EAAEsa,QACFta,EAAEwa,MACFxa,EAAEnG,QAIRpD,KAAK0xD,UAAYI,EACVA,OAkBb/3D,EAAO,QAAQ,CACb,cACA,cACD,SACE,SAAUoW,EAAiB4hD,GAG5B,MAAMpvD,EAAQ9C,MAAM6C,OACpBC,EAAI0d,SAAe1d,EAAI0d,UAAa,WAGpC,MAAM2xC,EAAe,CAAC,YAAa,UAAW,aAEpC5vD,SAKV,MAAO,CAML8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOlE,MAAMoE,MAAMiT,IAOnCjT,MAAQ,SAAUiT,GAChB,MAAMvQ,EAAG9G,KAKT,GAJA8G,EAAE7B,IAAM,KACR6B,EAAEmrD,cAAe,EAGb/0D,UAAUZ,OAAS,GAAnBY,MACAma,EAEF,MAAM,IAAI5Z,MAAM,sBA2ClB,IAAIsmB,EAaJ,OApDS1M,aAAiBsN,MACxB7d,EAAE7B,IAAOoS,EAGTA,EAAc,OAAIvQ,EAEduQ,EAAMwQ,aAAa,mBACrB/gB,EAAEorD,UAAY76C,EAAM0Q,aAAa,mBAGjCjhB,EAAEorD,UAAY76C,EAAM0Q,aAAa,kBAC/B,IACA1Q,EAAM0Q,aAAa,eACnB,IACA1Q,EAAM0Q,aAAa,gBAGvBjhB,EAAEqrD,QAAY96C,EAAM0Q,aAAa,iBAGjCjhB,EAAEsrD,UAAY/6C,EAAM0Q,aAAa,uBAAuB5rB,MAAM,MAO9D61D,EAAYvrD,SAAQ,SAASuf,GAC3BhmB,KAAKgmB,QAAwB3mB,IAAhBgY,EAAM2O,GAAsB3O,EAAM2O,QAAQ3mB,IACtDyH,GAGLA,EAAEurD,OAAS,CACTvpC,OAAS,GACTG,MAAS,GACTqpC,KAAS,IAKXxrD,EAAEsrD,UAAU3rD,SAAQ,SAASuf,GAG3B,IACEjC,EAAQjqB,EAAQ,mBAAmBoK,OAAO8hB,GAC1ChmB,KAAKqyD,OAAOtuC,EAAM3gB,MAAMjG,KAAK4mB,GAE/B,MAAOrlB,GACL,UAEDoI,GAEIA,GAMT8qD,SAAW,WACT,OAAO5xD,KAAKqyD,OAAOppC,OAOrBF,UAAY,WACV,OAAO/oB,KAAKqyD,OAAOvpC,QAOrB+oC,QAAU,WACR,OAAO7xD,KAAKqyD,OAAOC,MAMrBjoD,KAAO,WACL,MAAMvD,EAAI9G,KACV,GAAI8G,EAAEmrD,aACJ,OAAOnrD,EAGT,MAAM/B,EAAU+B,EAAE7B,IAGlB,GAAIF,MAAAA,EACF,OAGF,MAAMwtD,EAAUxtD,EAAQytD,cAAc,SAGtC,OAAKD,GAILzrD,EAAE0H,MAAQujD,EAAgB7tD,OAAO4C,GAEjCA,EAAE7B,IAAIyB,aACJI,EAAE0H,MAAMzJ,UACR+B,EAAE7B,IAAIutD,cAAc,UAItBD,EAAQ7rD,aACNI,EAAE0H,MAAM6O,QAAQtY,UAChBwtD,EAAQ1xD,YAGViG,EAAEmrD,cAAe,EACVnrD,QAlBP,GAwBFka,KAAO,WAGL,MAAMjc,EAAU/E,KAAKiF,IAGrB,GAAIF,MAAAA,EACF,OAAO,EAGT,GAAIA,EAAQlD,UAAUC,SAAS,UAC7B,OAAO,EAGTiD,EAAQlD,UAAUE,IAAI,UAEtB,MAAM6M,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAGNwL,EAAO1P,KAMb,OALA4O,EAAI7M,IAAIY,EAAI0d,SAAU,CAAC9O,IAAM,CAAC,cAAc,cAAc,WACxD7B,EAAKsO,cAEPjZ,EAAQ5C,YAAYyM,EAAI7J,WAEL1F,MAAfW,KAAKqK,QAWXooD,OAAS,WACHzyD,KAAKiF,IAAIpD,UAAUC,SAAS,UAC9B9B,KAAKge,WAELhe,KAAKghB,QAOThD,SAAW,WACThe,KAAKiF,IAAIpD,UAAUG,OAAO,WAO5B+C,QAAU,WACR,OAAO/E,KAAKiF,SAYlBlL,EAAO,aAAa,CAAC,SAAS,WAE5B,MAAO,CAKLmK,OAAS,SAAUa,GACjB,OAAOrK,OAAOwJ,OAAOlE,MAAMoE,MAAMW,IAKnCX,MAAQ,SAAUW,GAChB/E,KAAKiF,IAAMF,EAEX/E,KAAK0yD,WAAatwD,SAASC,cAAc,OACzCrC,KAAK0yD,WAAW9oD,aAAa,KAAM,QAKnC5J,KAAK2yD,QAAUvwD,SAASC,cAAc,OACtC,MAAM4E,EAAIjH,KAAK2yD,QACf1rD,EAAEpF,UAAUE,IAAI,OAAQ,UACxBkF,EAAEhF,KAAK,QACPgF,EAAE9E,YAAYnC,KAAK0yD,YACnBzrD,EAAEkC,MAAMO,OAAS,MACjBtH,SAASwD,qBAAqB,QAAQ,GAAGzD,YAAY8E,GAGrD,MAAMsN,EAAKvU,KAAK4yD,WAAWxtD,KAAKpF,MAIhC,OAHAJ,OAAOkK,iBAAiB,SAAUyK,GAClCvU,KAAKiF,IAAI6E,iBAAiB,UAAWyK,GACrCvU,KAAK4yD,aACE5yD,MAOT6yD,OAAS,WACP,OAAO7yD,KAAK2yD,SAUdG,UAAY,WACV,OAAO9yD,KAAK0yD,YAQd3tD,QAAU,WACR,OAAO/E,KAAKiF,KAQd1H,MAAQ,WACN,OAAOyC,KAAKiF,IAAI1H,OAOlBw1D,YAAc,WACZ,OAAO/yD,KAAK2yD,QAAQ9xD,WAAWmG,aAOjCa,MAAQ,WACN7H,KAAKiF,IAAI1H,MAAQ,IAOnB0T,OAAS,WAGP,OAFAjR,KAAK2yD,QAAQ9xD,WAAWmG,YAAchH,KAAKgzD,SAAS,GACpDhzD,KAAK0yD,WAAWvpD,MAAMgG,KAAOnP,KAAKizD,YAAc,KACzCjzD,MASTkzD,OAAS,SAAU3wD,GACjB,MAAM4wD,EAAenzD,KAAKgzD,SACpBzpD,EAAIvJ,KAAKiF,IAOf,OANAsE,EAAEhM,MAAQ41D,EAAa,GAAK5wD,EAAO4wD,EAAa,GAChD5pD,EAAE6pD,gBAAkBD,EAAa,GAAK5wD,GAAMjG,OAC5CiN,EAAE8pD,aAAe9pD,EAAE6pD,eAGnBpzD,KAAK2yD,QAAQ9xD,WAAWmG,YAAcmsD,EAAa,GAAK5wD,EACjDvC,MAOTszD,OAAS,SAAUC,GACjB,MAAM70D,EAAIsB,KAAKiF,IAIf,OAHAvG,EAAE00D,eAAiBG,EACnB70D,EAAE20D,aAAeE,EACjB70D,EAAEgM,QACK1K,KAAKiR,UAQd2hD,WAAa,WACX,MAAMY,EAAkBxzD,KAAKiF,IAAIiK,wBAC3BukD,EAAa7zD,OAAOoqD,iBAAiBhqD,KAAKiF,IAAK,MAE/CyuD,EACAtxD,SAASwD,qBAAqB,QAAQ,GAAGsJ,wBAGzCykD,EAAc3zD,KAAK2yD,QAAQxpD,MACjCwqD,EAAYxkD,KAAQ1G,SAAS+qD,EAAgBrkD,MAAQ,KACrDwkD,EAAYvqD,IAAQX,SAAS+qD,EAAgB94B,OAASg5B,EAAetqD,KAAO,KAC5EuqD,EAAYvkC,MAAQqkC,EAAWG,iBAAiB,SAGhDD,EAAYE,YAAkBJ,EAAWG,iBAAiB,gBAC1DD,EAAYG,WAAkBL,EAAWG,iBAAiB,eAC1DD,EAAYI,gBAAkBN,EAAWG,iBAAiB,qBAC1DD,EAAYK,gBAAkBP,EAAWG,iBAAiB,qBAC1DD,EAAYM,SAAkBR,EAAWG,iBAAiB,aAC1DD,EAAYO,WAAkBT,EAAWG,iBAAiB,gBAS5Dza,QAAU,WACR,OAAOn5C,KAAKgzD,SAAS,IAKvBC,UAAY,WACV,MAAM/F,EAAMltD,KAAK2yD,QAAQ9xD,WAAWqO,wBACpC,OAAOg+C,EAAIS,MAAQT,EAAI/9C,MASzB6jD,OAAS,SAAU1oC,GACjB,MAAM/gB,EAAIvJ,KAAKiF,IACT1H,EAAQgM,EAAEhM,MAMhB,OAHyB,IAArBL,UAAUZ,SACZguB,EAAQ/gB,EAAE6pD,gBAEL,IAAI1nD,MACTnO,EAAMO,UAAU,EAAGwsB,GACnB/sB,EAAMO,UAAUwsB,EAAO/sB,EAAMjB,cAWrCvC,EAAO,YAAY,CAAC,YAAa,SAAS,SAAU4T,GAClD,MAAO,CAKLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MACVoE,MAAMD,IAIVC,MAAQ,SAAUD,GAChB,QAAkB9E,IAAd8E,EAAO,SACM9E,IAAd8E,EAAO,GACT,MAAM,IAAI1G,MAAM,sBAWjB,OATAuC,KAAKoZ,MAAUjV,EAAO,GACtBnE,KAAK0E,QAAUP,EAAO,GACtBnE,KAAK4E,SAAW,IAAM5E,KAAKoZ,MAAM7X,cAE7B4C,EAAO7H,OAAS,IACnB0D,KAAKm0D,MAAQhwD,EAAO,GACpBnE,KAAK4E,UAAY,IAAM5E,KAAKm0D,MAAM5yD,eAG5BvB,MAMTuE,QAAU,SAAUA,GAIlB,OAHyB,IAArBrH,UAAUZ,SACb0D,KAAKwE,SAAWD,GAEVvE,KAAKwE,UAOdW,QAAU,SAAUzG,GAClB,IAAIuI,EAAIjH,KAAKkH,OAIbD,EAAEtJ,OAAO,IAET,IAAIk0B,EAAI5qB,EAAEmtD,OAGEviC,EAAEwiC,aACRnB,OAAOlzD,KAAK0E,SAASuM,SAE3BvS,EAAEqB,OAGF8xB,EAAEtkB,MAAK,IAMTlS,KAAO,WACL,OAAO2E,KAAKoZ,OAOd3U,OAAS,WACP,OAAOzE,KAAK0E,SAMd4vD,KAAO,WACL,OAAOt0D,KAAKm0D,OAOdpvD,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAGb,IAAIC,EAAK9C,SAASC,cAAc,WAEXhD,IAAjBW,KAAKmF,UACRD,EAAY,QAAIlF,KAAKmF,QAAQC,KAAKpF,OAInC,IAAI3E,EAAQ+G,SAASC,cAAc,QAMnC,GALAhH,EAAKiH,KAAKtC,KAAKoZ,OAEflU,EAAG/C,YAAY9G,QAGIgE,IAAfW,KAAKm0D,MAAqB,CAC7B,IAAIG,EAAOlyD,SAASC,cAAc,QAClCiyD,EAAKzyD,UAAUE,IAAI,QACnBuyD,EAAKhyD,KAAKtC,KAAKm0D,OACfjvD,EAAG/C,YAAYmyD,GAEhB,OAAOt0D,KAAKiF,IAAMC,OAOxBnL,EAAO,cAAc,CAAC,gBAAgB,SAAUuf,GAC9C,MAAO,CAKLpV,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOoV,GACpBjV,UAAUrE,MAAMoE,MAAMD,IAMzBgB,QAAU,SAAUzG,GAClB,MAAMuI,EAAIjH,KAAKkH,OACT3J,EAAQyC,KAAKzC,QACbs0B,EAAI5qB,EAAEmtD,OACZviC,EAAEwiC,aAAanB,OAAO31D,GACtBs0B,EAAEhtB,OAAO,MACToC,EAAEE,OAEFzI,EAAEqB,YAORhG,EAAO,mBAAmB,CAAC,mBAAoB,SAAS,SAAUw6D,GAChE,MAAO,CAKLrwD,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOqwD,GACpBlwD,UAAUrE,MAAMoE,SAMnBrC,IAAM,SAAU6F,GACd5H,KAAKiF,IAAIhD,KAAK,QAAQK,KAAKsF,EAAM,GAAK,MAEtC,IAAI0sD,EAAOt0D,KAAKiF,IAAIhD,KAAK,QACzBqyD,EAAKzyD,UAAUE,IAAI,QACnBuyD,EAAKhyD,KAAKsF,EAAM,GAAK,MACrB5H,KAAKiF,IAAI9C,YAAYmyD,QAW3Bv6D,EAAO,YAAY,CACjB,OACD,YACA,cACA,qBACE,SACDwU,EACAZ,EACA2L,EACAi7C,GAEA,MAAO,CAKLrwD,OAAS,SAAUkwD,EAAMjb,EAASh1C,GAChC,MAAMlJ,EAAMP,OAAOwJ,OAAOqK,GACtBlK,UAAUrE,MACVoE,MAAMD,EAAQ,CACbwJ,UAAYA,EACZ2L,YAAcA,EACdi7C,iBAAmBA,IAyBxB,OAvBAt5D,EAAIu5D,SAAWrb,EACfl+C,EAAIgK,IAAIpD,UAAUE,IAAI,QACtB9G,EAAIw5D,MAAQL,EAGZn5D,EAAI+Q,cAAe,EAEnB/Q,EAAI8J,UAAU+E,iBAAiB,QAAQ,SAAUpL,GAC/CsB,KAAKkH,KAAKC,UAIZlM,EAAI6S,OAAS,WACX,MAAM+jB,EAAI7xB,KAAKy0D,MACf5iC,EAAE6iC,YAAY3vD,UAAU2F,QACL,OAAfmnB,EAAEhtB,WACAgtB,EAAE8iC,OAAO9vD,QACXgtB,EAAE+iC,eAEJ/iC,EAAEhtB,OAAO,QAIN5J,GAOTm5D,KAAO,WACL,OAAOp0D,KAAKy0D,WAUlB16D,EAAO,uBAAuB,CAK5BmK,OAAS,SAAU2P,GACjB,OAAOnZ,OAAOwJ,OAAOlE,MAAMoE,MAAMyP,IAInCzP,MAAQ,SAAUyP,GAChB,IACE7T,KAAK+T,OAAS,IAAI3T,OAAOyT,GAE3B,MAAOnV,GAEL,YADAmB,MAAMsD,IAAI,EAAGzE,GAGf,OAAOsB,MAOTxD,KAAO,SAAU+F,GACf,GAAKvC,KAAK+T,OAAO+T,KAAKvlB,GAEtB,OAAOnC,OAAO6nB,MASlBluB,EAAO,aAAa,IAAG,WAErB,MAAO,CAKLmK,OAAS,SAAUb,GACjB,OAAO3I,OAAOwJ,OAAOlE,MAAMoE,MAAMf,IAInCe,MAAQ,SAAUf,GAChB,MAAMyD,EAAI9G,KAMV,OALA8G,EAAEwQ,MAAQ,QACVxQ,EAAEjC,QAAS,EACXiC,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAIkE,MAAMK,QAAU,OACtB1C,EAAE7B,IAAIpD,UAAUE,IAAI,QAAS,QACtB+E,GAOTyG,KAAO,SAAUlK,GACfrD,KAAK6E,QAAS,EACd,MAAMnG,EAAIsB,KAAKiF,IACfvG,EAAEsI,YAAc3D,EAChB3E,EAAEyK,MAAMK,QAAU,SAOpBrC,KAAO,WACL,QAAKnH,KAAK6E,SAEV7E,KAAKiF,IAAIkE,MAAMK,QAAU,OACzBxJ,KAAK6E,QAAS,GACP,IAOTE,QAAU,WACR,OAAO/E,KAAKiF,SA0BlBlL,EAAO,OAAO,CACZ,aACA,YACA,uBACA,aACA,SACC,SAAU86D,EACAtmD,EACAumD,EACAC,GAUX,MAAO,CAKL7wD,OAAS,SAAU0D,GACjB,OAAOlN,OAAOwJ,OAAOlE,MAAMoE,MAAMwD,IAKnCxD,MAAQ,SAAUwD,GAWhB,GAVAA,EAAQA,GAAS,GAGjB5H,KAAKoH,MAAU,GACfpH,KAAK20D,OAAUI,EAAW7wD,SAG1BlE,KAAKiI,QAAU,MAGVpI,MAAM2D,iBAET,YADAD,QAAQJ,IAAI,+BAOdtD,MAAMs5C,QAAUt5C,MAAMs5C,SACpB,yGAYF,MAAM6b,EAASptD,EAAkB,YAAKxF,SAAS8iB,eAAe,WAC9D,IAAK8vC,EACH,OAAO,KAGTh1D,KAAK00D,YAAcG,EAAW3wD,OAAO8wD,GAGrC,MAAMtlD,EAAO1P,KAEPod,EAAIpd,KAAK00D,YAAY5B,YAC3B11C,EAAEjb,YAAYnC,KAAK20D,OAAO5vD,WAC1BqY,EAAEtT,iBAAiB,SAAS,SAAUpL,GAC/BsB,KAAK6B,UAAUC,SAAS,WAC3B4N,EAAKnC,MAAK,MAKd,MAAM0nD,EAAoBj1D,KAAK00D,YAAY3vD,UAC3CkwD,EAAkBnrD,iBAAiB,QAAS9J,KAAKiR,OAAO7L,KAAKpF,OAC7Di1D,EAAkBnrD,iBAAiB,QAAS9J,KAAKiR,OAAO7L,KAAKpF,OAmC7D,OAzBAi1D,EAAkBnrD,iBAChB,UARU,SAAUpL,GACM,KAAtBqC,EAAerC,KACjBsB,KAAKuN,MAAK,GACV7O,EAAEqB,SAKaqF,KAAKpF,OAAO,GAI/Bi1D,EAAkBnrD,iBAChB,aACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAEFi1D,EAAkBnrD,iBAChB,WACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAEFi1D,EAAkBnrD,iBAChB,YACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAIFA,KAAKk1D,UAAYJ,EAAc5wD,OAC7B0D,EAAe,SAAK/H,MAAMs5C,SAErBn5C,MAOTq0D,WAAa,WACX,OAAOr0D,KAAK00D,aAOdS,MAAQ,SAAUC,EAAS/xD,GACzB,MAAMyD,EAAI9G,KACV,OAAyB,IAArB9C,UAAUZ,OACLwK,EAAE6tD,QAGP7tD,EAAE6tD,OAAO9vD,SAIbiC,EAAE4tD,YAAYpB,OAAO8B,GAIrBtuD,EAAE6tD,OAAOpnD,KAAKlK,GACdyD,EAAEjC,OAAOiC,EAAE6tD,SACJ,IAOT1jD,OAAS,WACPjR,KAAK00D,YAAYzjD,SACbjR,KAAK20D,OAAOxtD,QACdnH,KAAK6E,OAAO,OAOhBqC,KAAO,SAAUzC,GACf,QAA2BpF,IAAvBW,KAAKoH,MAAM3C,GAAuB,CAGpC,QAAuCpF,IAAnCQ,MAAM2D,iBAAiBiB,GACzB,OAGFzE,KAAKoH,MAAM3C,GAAU8J,EAAUrK,OAC7BlE,KAAMyE,EAAQ5E,MAAM2D,iBAAiBiB,IAKzC,OAAOzE,KAAKoH,MAAM3C,IAOpB4wD,YAAc,SAAUC,GACtB,MAAMC,EAAMD,OAAYj2D,EAAYW,KAAKkH,KAAK,KAG9C,IAAIiyC,EAAUn5C,KAAK00D,YAAYvb,UAE/B,YAAgB95C,IAAZ85C,GAA4C,IAAnBA,EAAQ78C,OAC5Bi5D,GAITpc,EAAUn5C,KAAKk1D,UAAU14D,KAAK28C,QAEd95C,IAAZ85C,GAA2C,GAAlBA,EAAQ78C,OAC5Bi5D,EAGFv1D,KAAKkH,KAAKiyC,IAAYoc,IAU/B1wD,OAAS,SAAU5J,GAGjB,GAAyB,IAArBiC,UAAUZ,OAAc,CAC1B,MAAM8gB,EAAIpd,KAAK00D,YAAY5B,YAGf,OAAR73D,GACFmiB,EAAEvb,UAAUE,IAAI,UAChB/B,KAAKiI,QAAUhN,IAKfmiB,EAAEvb,UAAUG,OAAO,UACnBhC,KAAKiI,QAAU,MAKnB,OAAOjI,KAAKiI,SAadsF,KAAO,SAAU+nD,GAMf,IAAIpuD,EACJ,GAJAlH,KAAKw1D,UAIDtuD,EAAOlH,KAAKq1D,YAAYC,GAAY,CAEtCt1D,KAAK6E,OAAOqC,GAEZ,IAAIxI,EAAIwI,EAAKnC,UAEb/E,KAAKiI,QAAQlD,UAAUiK,OACvBhP,KAAK00D,YAAY5B,YAAY3wD,YAAYzD,GAEzCwI,EAAKqG,OACLrG,EAAKwD,aAML1K,KAAK00D,YAAY3vD,UAAU2F,SAM/B+qD,WAAa,aAMbC,OAAS,WACP11D,KAAKw1D,UACLx1D,KAAK00D,YAAY3vD,UAAU2F,SAK7Bc,OAAS,SAAU9M,GACF,eAAXA,EAAE0E,KACJpD,KAAK8M,WAAapO,EAAEqO,QAAQ,GAAG3C,QAGb,aAAX1L,EAAE0E,KACTpD,KAAK8M,gBAAazN,EAGD,aAAVX,EAAE0E,OACJpD,KAAK8M,WAAa,GAAMpO,EAAEqO,QAAQ,GAAG3C,UACxCpK,KAAKuN,OACLvN,KAAK8M,gBAAazN,GAEpBX,EAAEqB,SAMNy1D,QAAU,WACc,OAAlBx1D,KAAK6E,WAGF7E,KAAK20D,OAAO9vD,OASf7E,KAAK40D,eANL50D,KAAK00D,YACF5B,YACAhyD,YAAYd,KAAKiI,QAAQlD,WAO9B/E,KAAK6E,OAAO,QAKhB+vD,aAAe,WACb50D,KAAK20D,OAAOxtD,OACZnH,KAAK6E,OAAO,WAclB9K,EAAO,UAAU,CAKfmK,OAAS,SAAU7I,EAAO,SACxB,MAAMJ,EAAMP,OAAOwJ,OAAOlE,MAI1B,OAHA/E,EAAIme,MAAQ/d,EAAKkG,cACjBtG,EAAI06D,MAAQ,GACZ16D,EAAIksB,SACGlsB,GAQT26D,IAAM,SAAU5/C,GACd,OAAOhW,KAAK21D,MAAM3/C,EAAIzU,gBAQxBsZ,IAAM,SAAU7E,EAAKzY,GACnByC,KAAK21D,MAAM3/C,GAAOzY,EAClByC,KAAK8a,UAOPpT,MAAQ,WACN1H,KAAK21D,MAAQ,GACbvzD,SAASyzD,OAAS71D,KAAKoZ,MAAQ,iBAKjC0B,OAAS,WACP1Y,SAASyzD,OAAS71D,KAAKoB,YAOzBA,SAAW,WAKT,OAAOpB,KAAKoZ,MAAQ,IAAMoxC,mBAAmBl5B,KAAKC,UAAUvxB,KAAK21D,QAAU,iBAO7ExuC,OAAS,WACP/kB,SAASyzD,OAAO15D,MAAM,KAAKsK,SACzB,SAAU1K,GACR,MAAM+5D,EAAO/5D,EAAEI,MAAM,KAErB,GADa25D,EAAK,GAAGzvD,OAAO9E,gBACfvB,KAAKoZ,WAAlB,CACC,GAAoB,IAAhB08C,EAAKx5D,QAAmC,IAAnBw5D,EAAK,GAAGx5D,OAC/B,OACD0D,KAAK21D,MAAQrkC,KAAKykC,MAAM3rC,mBAAmB0rC,EAAK,QAIpD91D,SAcNjG,EAAO,WAAW,CAAC,UAAU,cAAc,SAAS,SAAUi8D,EAAc7lD,GAG1E,MAAMxN,EAAQ9C,MAAM6C,OACpBC,EAAIkb,MAAQlb,EAAIkb,OAAS,QAEzB,MAAMzD,EAAIhY,SAEV,MAAO,CAML8B,OAAS,SAAUjJ,EAAIg7D,GACrB,OAAKh7D,EAEEP,OAAOwJ,OAAOlE,MAAMoE,MAAMnJ,EAAIg7D,GAD7B,MAMV7xD,MAAQ,SAAUnJ,EAAKg7D,GACrB,MAAMnvD,EAAI9G,KASV,GANC8G,EAAEovD,cADa72D,IAAZ42D,EACUD,EAAa9xD,SAGb+xD,EAGVh7D,EAAK,CAKP,GAJD6L,EAAE6X,MAAQ1jB,EACV6L,EAAEwjB,MAAQrvB,EAAI8sB,aAAa,SAGrBjhB,EAAEwjB,MACL,OAAO,KAEVrvB,EAAIk7D,gBAAgB,QAEpBl7D,EAAIkK,QAAU,WACZnF,KAAKuN,QACLnI,KAAK0B,GAGP,MAAMsvD,EAAMh8C,EAAE/X,cAAc,OAC5B+zD,EAAIxsD,aAAa,KAAM,YACvBwsD,EAAIjtD,MAAMK,QAAU,OACpB4Q,EAAExU,qBAAqB,QAAQ,GAAGzD,YAAYi0D,GAE9CtvD,EAAEuvD,QAAU,KACZvvD,EAAE7B,IAAMmxD,EAGRtvD,EAAEme,IAAU7K,EAAE8K,eAAe,YAC7Bpe,EAAEqe,GAAU/K,EAAE8K,eAAe,WAC7Bpe,EAAEwvD,QAAUl8C,EAAE8K,eAAe,kBAG9B,OAAOpe,GAOTyvD,SAAW,SAAU73D,GACnB,MAAMoI,EAAI9G,KACJw2D,EAAK93D,EAAEqpB,aAAa,cACpBzB,EAAK5nB,EAAEqpB,aAAa,uBACpB0uC,EAAK/3D,EAAEqpB,aAAa,qBAO1B,GALW,IAAP0uC,GAAmB,MAAPA,GAAqB,QAAPA,GAAuB,OAAPA,GACxC3vD,EAAE4vD,WACL5vD,EAAEwvD,QAAQK,SAAU,GAGnB92D,MAAM+2D,OACR/2D,MAAM+2D,OAAOC,YAAYvwC,QAGtB,GAAIxf,EAAEme,IAAK,CACd,IAAIzL,EAAQ9N,MAAMma,KAAK/e,EAAEme,IAAIsB,SAAS/N,KAAKyT,GAAKA,EAAE1uB,QAAU+oB,GACxD9M,IACFA,EAAM3B,UAAW,GAGjB/Q,EAAEqe,KACJre,EAAEqe,GAAG5nB,MAAQi5D,GAEf1vD,EAAEgwD,QAAQp4D,GACVoI,EAAEK,QAOJ4vD,YAAc,SAAU38C,GACtB1O,MAAMma,KAAKzL,EAAE48C,iBAAiB,yCAAyCvwD,QACrE1K,GACCA,EAAEoJ,QAAU,SAAUzG,GACpBsB,KAAKu2D,SAASv2D,KAAKtB,IACnB0G,KAAKpF,QAOZi3D,aAAe,SAAU78C,GACvB,MAAM1K,EAAO1P,KACb0L,MAAMma,KAAKzL,EAAEgF,uBAAuB,aAAa3Y,QAChD1K,GACGA,EAAEoJ,QAAU,WAEX,OADAuK,EAAKonD,QAAQ92D,KAAK+nB,aAAa,UACxB,KASdxa,KAAO,WACL,MAAMzG,EAAI9G,KACJ+E,EAAU+B,EAAE7B,IAClB,GAA8B,UAA1BF,EAAQoE,MAAMK,QAAlB,CAGA,GAAkB,OAAd1C,EAAEuvD,QAAkB,CACvBvvD,EAAEuvD,QAAUj8C,EAAE/X,cAAc,UAC5ByE,EAAEuvD,QAAQzsD,aACR,OACC9C,EAAEowD,WAAapwD,EAAEwjB,OAAS,kBAG5B,MAAM1b,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAGZ0K,EAAI7M,IAAIY,EAAIkb,MAAO,CAACtM,IAAM,CAAC,cAAc,WAAW,WAClDxM,EAAQoE,MAAMK,QAAU,UAG1BzE,EAAQ5C,YAAYyM,EAAI7J,WAczBA,EAAQ5C,YAAY2E,EAAEuvD,SAGvBtxD,EAAQoE,MAAMK,QAAU,UAO1BrC,KAAO,WACLnH,KAAKiF,IAAIkE,MAAMK,QAAU,QAQ3BstD,QAAU,SAAU77D,GAClB,IAAIk8D,EAAOl8D,EAEX,GAAmB,iBAARk8D,EAAkB,CAC5B,MAAM32C,EAAqB,OAAjBxgB,KAAKq2D,QAAmBz2D,OAAOw3D,OAAO,GAAGC,SAAWz3D,OAAOy3D,SAErEF,EAAO32C,EAAE82C,SAAW92C,EAAE+2C,OAEtB,IAAK,IAAIx7D,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAsB,YAAjBd,EAAIu8D,UAA2C,QAAjBv8D,EAAIu8D,WAAuBv8D,EAAI4sB,aAAa,MAAO,CACpFsvC,GAAQ,IAAMl8D,EAAI8sB,aAAa,MAC/B,MAIC,GAAY,QADb9sB,EAAMA,EAAI4K,YAEP,OAKR7F,KAAKk2D,SAASr7C,IAAI,UAAWs8C,IAO/BD,QAAU,WACR,OAAOl3D,KAAKk2D,SAASN,IAAI;;;;;;AAiB/B77D,EAAO,eAAe,IAAG,WACrB,aAEA,IAAI09D,EAAOC,EAASC,EAChBC,EAA8B,oBAAXh4D,QAA0BA,OAAOwC,SACpDy1D,GAAgBD,EAChBxgD,EAAMwgD,EAAYx1D,SAAW,KAC7B01D,EAAa,GASjB,SAASC,IACL,IAAIC,EAAYF,EAEZD,GAEIG,EAAU17D,SACVw7D,EAAa,GAbzB,SAAsBE,GAClB,IAAIj8D,EACJ,IAAKA,EAAI,EAAGA,EAAIi8D,EAAU17D,OAAQP,GAAK,EACnCi8D,EAAUj8D,GAAGqb,GAWT6gD,CAAaD,IAQzB,SAASE,IACAL,IACDA,GAAe,EACXF,GACAQ,cAAcR,GAGlBI,KAIR,GAAIH,EAAW,CACX,GAAIx1D,SAAS0H,iBAGT1H,SAAS0H,iBAAiB,mBAAoBouD,GAAY,GAC1Dt4D,OAAOkK,iBAAiB,OAAQouD,GAAY,QACzC,GAAIt4D,OAAOw4D,YAAa,CAC3Bx4D,OAAOw4D,YAAY,SAAUF,GAE7BR,EAAUt1D,SAASC,cAAc,OACjC,IACIo1D,EAAgC,OAAxB73D,OAAOy4D,aACjB,MAAO35D,IAKLg5D,EAAQY,UAAYb,GAAS73D,OAAO24D,WACpCZ,EAAmBa,aAAY,WAC3B,IACId,EAAQY,WACRJ,IACF,MAAOx5D,OACV,KAeiB,aAAxB0D,SAASq2D,YACTP,IAWR,SAASQ,EAAS35D,GAMd,OALI84D,EACA94D,EAASqY,GAET0gD,EAAW36D,KAAK4B,GAEb25D,EAkBX,OAfAA,EAAS/rC,QAAU,QAKnB+rC,EAASt5D,KAAO,SAAU/D,EAAMnB,EAAKy+D,EAAQp+D,GACrCA,EAAOq+D,QACPD,EAAO,MAEPD,EAASC,IAMVD,KAGX3+D,EAAO,WAAW,IAAG,WACnB,MAAO,CAGL,CAAC,SAAU,QAEX,CAAC,eAAgB,QAEjB,CAAC,cAAe,UAChB,CAAC,iBAAkB,QACnB,CAAC,cAAe,QAChB,CAAC,eAAgB,QACjB,CAAC,YAAa,QAEd,CAAC,WAAY,UACb,CAAC,cAAe,QAChB,CAAC,WAAY,QAGb,CAAC,YAAa,UACd,CAAC,WAAY,UACb,CAAC,WAAY,UACb,CAAC,UAAW,UAEZ,CAAC,UAAW,QAEZ,CAAC,WAAY,UAEb,CAAC,WAAY,QACb,CAAC,YAAa,UACd,CAAC,aAAc,UACf,CAAC,aAAc,UACf,CAAC,YAAa,UACd,CAAC,WAAY,UACb,CAAC,cAAe,UAChB,CAAC,cAAe,UAChB,CAAC,QAAS,YAKb,SAAU+xB,EAAQzsB,GAClB,aAEA,IACIw5D,EADAz2D,EAAW0pB,EAAO1pB,SAGtBy2D,EAAW,WAEV,IAKIC,EAAGC,EAAWC,EAAOC,EAAUC,EAAcC,EAAUC,EAAUC,EAASC,EAAUC,EAAazhD,EAAO0hD,EALxGC,EAAY,GACZC,EAAY,GACZC,GAAY,EACZ5/C,EAAqB,GAArBA,EAA8B,GAA9BA,EAAyC,GACzC6/C,EAAY,GA8kBhB,OAvkBAF,EAAU,CACTG,QAAU,CACTC,OAAS,kDACTC,OAAS,oGACTC,GAAS,sFACTC,OAAS,mGAEVniD,MAAU,wGACVoiD,QAAU,8CACV/2D,IAAU,gEAOXq2D,EAAqB,WACpB,IAAI1yD,EACA1D,EACA+2D,GAAc,EACdxwD,EAAcvH,EAASC,cAAc,eACrC+3D,EAAc,CACbC,iBAAqB,sBACrBC,cAAqB,gBACrBC,YAAqB,iBACrBC,WAAqB,iBAG1B,IAAK1zD,KAAKszD,EACT,QAhDJ,IAgDQzwD,EAAGR,MAAMrC,GAAkB,CAC9B1D,EAAYg3D,EAAYtzD,GACxBqzD,GAAY,EACZ,MAIF,MAAO,CACN/2D,KAAYA,EACZ+2D,UAAYA,IAUdrB,EAAI,SAAUl6D,GACb,OAAOwD,EAAS8iB,eAAetmB,IAshBzB,CACNu2D,MAAU,SAAU+E,EAASpuB,EAAI2uB,GAAkE,OAAtDhB,EAAUiB,OAAOR,EAAS,QAASpuB,EAAI,GAAI2uB,GAAkBz6D,MAC1G26D,QAAU,SAAUT,EAASpuB,EAAI2uB,GAAoE,OAAxDhB,EAAUiB,OAAOR,EAAS,UAAWpuB,EAAI,GAAI2uB,GAAkBz6D,MAC5GwmD,QAlhBDiT,EAAY,CAMXtJ,OAAS,CACR6J,GAAS,KACTC,OAAS,UAOV1V,MAAQ,IAMRqW,eAAgB,EAMhBC,YAAc,KAMdL,gBA5GH,EAqHGM,aAAe,SAAUhvB,GACxB,IAKIkuB,EAAIC,EAAQc,EAAQ/kD,EAAKnO,EALzBmzD,OAA8B,IAAVhC,EACpBiC,OAAkC,IAAdlC,EACpBmC,OAA8B,IAAVpjD,EACpB5D,EAAY,GACZ6X,EAAY/rB,KAIhBg6D,EAAK,SAAU50C,GAUd,YAToC,IAAzBA,EAAMllB,gBAAgCklB,EAAMllB,iBACvD66D,EAAO31C,QACc,IAAVtN,IAAuB5D,EAAM4D,EAAMva,OAC5B,mBAAPuuC,SACW,IAAVh0B,EACVg0B,GAAG,EAAM53B,GAEL43B,GAAG,KAEF,GAIRmuB,EAAS,SAAU70C,GAIlB,YAHoC,IAAzBA,EAAMllB,gBAAgCklB,EAAMllB,iBACvD66D,EAAO31C,GACW,mBAAP0mB,GAAmBA,GAAG,IAC1B,GAIRivB,EAAS,SAAU31C,GAClB2G,EAAK5kB,OACL4kB,EAAKovC,OAAO/4D,EAASuuD,KAAM,QAAS36C,GACpC+V,EAAKovC,OAAOlC,EAAU,QAASpxD,GAC3BmzD,GAAOjvC,EAAKovC,OAAOnC,EAAO,QAASgB,GACnCiB,GAAWlvC,EAAKovC,OAAOpC,EAAW,QAASkB,IAIhDjkD,EAAM,SAAUoP,GACf,IAAIpkB,EAAUokB,EAAMpkB,SACfA,IAAY+Y,IAAemhD,GAAcA,GAAYl6D,IAAY+Y,IAAaigD,EAAG50C,GAClFpkB,IAAY+Y,GAAYkhD,GAAWhB,EAAO70C,IAI/Cvd,EAAQ,SAAUud,GACb81C,EAAUpjD,EAAMpN,SACVuwD,GAAalvC,EAAK6uC,cAAe5B,EAAMtuD,QAC5CquD,EAAUruD,SAOhB1K,KAAKoF,KAAK6zD,EAAU,QAASpxD,GAC7B7H,KAAKoF,KAAK8zD,EAAc,QAASrxD,GAE7BmzD,GAAOh7D,KAAKoF,KAAK4zD,EAAO,QAASgB,GAEjCiB,GAAWj7D,KAAKoF,KAAK2zD,EAAW,QAASkB,GAE7Cj6D,KAAKoF,KAAKhD,EAASuuD,KAAM,QAAS36C,GAC7BhW,KAAKw6D,WAAWL,WACpBn6D,KAAKo7D,YAaPh2D,KAAO,SAAUuE,EAAIyb,EAAO0mB,GACQ,mBAAxBniC,EAAGG,iBACbH,EAAGG,iBAAiBsb,EAAO0mB,GAAI,GACrBniC,EAAGyuD,aACbzuD,EAAGyuD,YAAY,KAAOhzC,EAAO0mB,IAS/BuvB,aAAe,WACd,QAA8B,IAAnBvvC,EAAOwvC,QAAyB,CAC1C,IAAIvvC,EAAO/rB,KAIX,OAHA8rB,EAAOwvC,QAAU,SAAUj4D,EAAK8mB,EAAKoxC,GACpCxvC,EAAKyvC,MAAM,IAAMn4D,EAAM,YAAck4D,EAAO,OAASpxC,EAAM,IAAK,KAE1D,EAEP,OAAO,GAYTsxC,cAAgB,SAAUC,EAAWC,GACpC,OAAO37D,KAAK46D,cAAgBe,EAAUD,EAAYA,EAAYC,GAU/DC,MAAQ,SAAUvuD,GACjB,IAAIuZ,EAAU,GACVxjB,EAAUiK,EAAKjK,KACf82D,EAAU7sD,EAAK6sD,QACf2B,EAAUxuD,EAAKotD,UAAY,GAuB/B,OArBA7zC,GAAQ,gCACRA,GAAQ,uFAEsB,SAA1B6yC,EAAUoB,cAAwBj0C,GAAQ,oEAGjC,WAATxjB,IAAmBwjB,GAAQ,4BAE/BA,GAAQ,mCACRA,GAAQ8yC,EAAQQ,QAAQz9D,QAAQ,cAAey9D,GAElC,WAAT92D,IAAmBwjB,GAAQ8yC,EAAQ5hD,OAEvC8O,GAAQ8yC,EAAQG,QAAQC,OACxBlzC,GAAQ,aAEK,WAATxjB,IAAmBwjB,GAAQ,UAE/BA,GAAQ,mFACRA,GAAQ,SAEAxjB,GACR,IAAK,UAEJwjB,GADAA,EAAOA,EAAKnqB,QAAQ,cAAeuD,KAAKy7D,cAAc/B,EAAQG,QAAQI,OAAQP,EAAQG,QAAQG,MAClFv9D,QAAQ,SAAUuD,KAAKmwD,OAAO6J,IAAIv9D,QAAQ,aAAcuD,KAAKmwD,OAAO8J,QAChF,MACD,IAAK,SAEJrzC,GADAA,EAAOA,EAAKnqB,QAAQ,cAAeuD,KAAKy7D,cAAc/B,EAAQG,QAAQI,OAAQP,EAAQG,QAAQE,UAClFt9D,QAAQ,SAAUuD,KAAKmwD,OAAO6J,IAAIv9D,QAAQ,aAAcuD,KAAKmwD,OAAO8J,QAChF,MACD,IAAK,QAEJrzC,GADAA,EAAOA,EAAKnqB,QAAQ,cAAei9D,EAAQG,QAAQG,KACvCv9D,QAAQ,SAAUuD,KAAKmwD,OAAO6J,IAQ3C,OAFAV,EAAStd,UAAY,qBAAuB54C,EAAO,IAAMy4D,EACzDxC,EAAQrd,UAAa,iBACdp1B,GAWR7I,MAAQ,SAAU/X,EAAM08C,GAEvB,IAEIoZ,EAAaC,EAFbC,EAAStZ,IAASpI,MAAMoI,IAAUA,EAAO1iD,KAAKukD,MAC9Cx4B,EAAQ/rB,KAIZA,KAAKoF,KAAKY,EAAM,SAAS,WACxB81D,EAAY91D,MAIb+1D,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBAEN8rB,EAAKovC,OAAOn7D,KAAM+rB,EAAKyuC,WAAWp3D,KAAM24D,GAExCxC,EAAMz4D,YAAYd,MACbu5D,EAAMpxC,kBAAiBoxC,EAAMvd,WAAa,0BAIhD8f,EAAc,SAAUnyD,QAEL,IAAPA,GAAsBA,EAAG9D,aAAe0zD,IAE9CxtC,EAAKyuC,WAAWL,WACnBpuC,EAAK3mB,KAAKuE,EAAIoiB,EAAKyuC,WAAWp3D,KAAM24D,GACpCpyD,EAAGqyC,WAAa,uBAEhBud,EAAMz4D,YAAY6I,GACb4vD,EAAMpxC,kBAAiBoxC,EAAMvd,WAAa,4BAKrC,IAAT0G,GAEJnjD,YAAW,WAAcu8D,EAAY91D,KAAUg2D,IAchDtB,OAAS,SAAUR,EAAS92D,EAAM0oC,EAAImwB,EAAaxB,GAIlDrB,EAAWh3D,EAAS85D,cAGpB,IAAInsD,EAAQ,WACNwpD,GAA6B,OAApBA,EAAM4C,WAAwB9C,GAAiC,OAAtBA,EAAQ8C,WAC1DpsD,KAGN,GAAuB,iBAAZmqD,EAAsB,MAAM,IAAIz8D,MAAM,4BACjD,GAAoB,iBAAT2F,EAAmB,MAAM,IAAI3F,MAAM,yBAC9C,QAAkB,IAAPquC,GAAoC,mBAAPA,EAAmB,MAAM,IAAIruC,MAAM,yBAQ3E,OANAuC,KAAKqK,OACL0F,IAEA6pD,EAAMz8D,KAAK,CAAEiG,KAAMA,EAAM82D,QAASA,EAASn7D,SAAU+sC,EAAImwB,YAAaA,EAAaxB,SAAUA,IACxFd,GAAQ35D,KAAKo8D,QAEXp8D,MAURwmD,OAAS,SAAUpjD,GAClB,GAAoB,iBAATA,EAAmB,MAAM,IAAI3F,MAAM,gDAC9C,OAAO,SAAUy8D,EAASxX,GAEzB,OADA1iD,KAAKmD,IAAI+2D,EAAS92D,EAAMs/C,GACjB1iD,OASTmH,KAAO,WACN,IAAI40D,EACAhwC,EAAO/rB,KAEX45D,EAAMh9D,OAAO,EAAE,GAEXg9D,EAAMt9D,OAAS,EAAG0D,KAAKo8D,OAAM,IAEhCzC,GAAS,EAGToC,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBAEN8rB,EAAKovC,OAAO7B,EAAUvtC,EAAKyuC,WAAWp3D,KAAM24D,IAGzC/7D,KAAKw6D,WAAWL,WACnBn6D,KAAKoF,KAAKk0D,EAAUt5D,KAAKw6D,WAAWp3D,KAAM24D,GAC1CzC,EAAStd,UAAY,0CAErBsd,EAAStd,UAAY,2DAEtBqd,EAAQrd,UAAa,uCAGrBod,EAAS1uD,UAUXL,KAAO,WAENjI,EAASC,cAAc,OACvBD,EAASC,cAAc,WACvBD,EAASC,cAAc,WAEI,MAAvBy2D,EAAE,qBACLO,EAAUj3D,EAASC,cAAc,QACzBuH,aAAa,KAAM,kBAC3ByvD,EAAQrd,UAAY,uCACpB55C,EAASuuD,KAAKxuD,YAAYk3D,IAGN,MAAjBP,EAAE,cACLa,GAAS,EACTC,EAAQ,IACRN,EAAWl3D,EAASC,cAAc,YACzBuH,aAAa,KAAM,YAC5B0vD,EAAStd,UAAY,2BACrB55C,EAASuuD,KAAKxuD,YAAYm3D,IAGD,MAAtBR,EAAE,oBACLS,EAAQn3D,EAASC,cAAc,YACzBuH,aAAa,KAAM,iBACzB2vD,EAAMvd,UAAY,qCAClB55C,EAASuuD,KAAKxuD,YAAYo3D,IAK3Bn3D,EAASuuD,KAAK/mD,aAAa,WAAY,KAEvC5J,KAAKw6D,WAAahB,KAYnBr2D,IAAM,SAAU+2D,EAAS92D,EAAMs/C,GAG9B,IAAI3yC,EAAQ,WACPwpD,GAA6B,OAApBA,EAAM4C,WACdpsD,KAQN,OALA/P,KAAKqK,OACL0F,IAEAwpD,EAAMvd,UAAY,gBAClBh8C,KAAKq8D,OAAOnC,EAAS92D,EAAMs/C,GACpB1iD,MAcRq8D,OAAS,SAAUnC,EAAS92D,EAAMs/C,GACjC,IAAIv/C,EAAMf,EAASC,cAAc,WACjCc,EAAI64C,UAAY,gBAAmC,iBAAT54C,GAA8B,KAATA,EAAe,iBAAmBA,EAAO,IACxGD,EAAIoE,UAAY2yD,EAEhBX,EAAMp3D,YAAYgB,GAElB5D,YAAW,WAAa4D,EAAI64C,UAAY74C,EAAI64C,UAAY,uBAAyB,IACjFh8C,KAAK+d,MAAM5a,EAAKu/C,IAUjB7nC,IAAM,SAAU5d,GACf,IAAIgZ,EAEJ,GAAoB,iBAAThZ,GAAqBA,aAAgByO,MAAO,MAAM,IAAIjO,MAAM,0BAEvE,IAAKwY,KAAKhZ,EACLA,EAAKrC,eAAeqb,KACvBjW,KAAKiW,GAAKhZ,EAAKgZ,KAUlBmlD,SAAW,WACNtjD,GACHA,EAAMpN,QACNoN,EAAMwC,UAEF6+C,EAASzuD,SAQf0xD,MAAQ,SAAUE,GACjB,IAEIP,EAFA1uD,EAAOusD,EAAM,GACb7tC,EAAO/rB,KAIX25D,GAAS,EAEToC,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBACN8rB,EAAKqvC,WAELrvC,EAAKovC,OAAO7B,EAAUvtC,EAAKyuC,WAAWp3D,KAAM24D,IAGzC/7D,KAAKw6D,WAAWL,YAAcmC,GACjCt8D,KAAKoF,KAAKk0D,EAAUt5D,KAAKw6D,WAAWp3D,KAAM24D,GAG3CzC,EAAS/xD,UAAYvH,KAAK47D,MAAMvuD,GAEhC4rD,EAAYH,EAAE,uBACdI,EAAgBJ,EAAE,2BAClBE,EAAYF,EAAE,qBA7jBlB,EA8jBIC,EAAYD,EAAE,yBA9jBlB,EA+jBIK,EAAuC,WAA1BM,EAAUoB,YAA4B9B,EAAwC,SAA1BU,EAAUoB,YAA0B/B,EAAE,sBAAwBE,EAC/HlhD,EAAYghD,EAAE,uBAhkBlB,EAikBgBA,EAAE,uBAjkBlB,EAmkBoC,iBAArBzrD,EAAK4uD,aAAiD,KAArB5uD,EAAK4uD,cAAoBnkD,EAAMva,MAAQ8P,EAAK4uD,aACpFK,GAAWt8D,KAAKo7D,WACpBp7D,KAAK86D,aAAaztD,EAAKtO,WAYxBo8D,OAAS,SAAUxxD,EAAIyb,EAAO0mB,GACS,mBAA3BniC,EAAGY,oBACbZ,EAAGY,oBAAoB6a,EAAO0mB,GAAI,GACxBniC,EAAG4yD,aACb5yD,EAAG4yD,YAAY,KAAOn3C,EAAO0mB,MAQX0a,OACpBn8C,KAAUovD,EAAUpvD,KACpBlH,IAAU,SAAU+2D,EAAS92D,EAAMs/C,GAA4C,OAApC+W,EAAUt2D,IAAI+2D,EAAS92D,EAAMs/C,GAAc1iD,MACtFw8D,OAAU,SAAUtC,EAASpuB,EAAImwB,EAAaxB,GAA4E,OAAhEhB,EAAUiB,OAAOR,EAAS,SAAUpuB,EAAImwB,EAAaxB,GAAkBz6D,MACjIy8D,QAAU,SAAUvC,EAASxX,GAAiD,OAAzC+W,EAAUt2D,IAAI+2D,EAAS,UAAWxX,GAAc1iD,MACrFw7D,MAAU,SAAUtB,EAASxX,GAA+C,OAAvC+W,EAAUt2D,IAAI+2D,EAAS,QAASxX,GAAc1iD,MACnF6a,IAAU,SAAU5d,GAAQw8D,EAAU5+C,IAAI5d,IAC1CkzD,OAAUsJ,EAAUtJ,OACpB5jC,MAAUktC,EAAU4B,eAKA,mBAAXthE,EACVA,EAAO,eAAe,IAAI,WAAc,OAAO,IAAI8+D,UACd,IAApB/sC,EAAO4wC,WACxB5wC,EAAO4wC,SAAW,IAAI7D,GA7mBxB,CAgnBE74D,MAIFjG,EAAO,kBAAkB,CAAC,cAAc,SAAU4T,GAIhD,MAAO,CAMLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MAAMoE,MAAMD,IAO1BgB,QAAU,SAAUzG,GAClB,IAAIwI,EAAOlH,KAAKkH,OAChBA,EAAKC,OAELD,EAAKoT,OAAOta,KAAK28D,QACjBz1D,EAAK01D,YACLl+D,EAAEqB,QAOJuP,MAAQ,WACN,OAAOtP,KAAKuE,UAAUyC,iBAO5BjN,EACE,aAAa,CAAC,OAAQ,kBAAmB,SACzC,SAAUwU,EAAWsuD,GAEnB,MAAO,CACL34D,OAAS,SAAUa,GAElB,MAAMuV,EAASvV,EAAQa,qBAAqB,UAAU,GAErD,GAAe,OAAX0U,EACF,OAGH,MAAMrP,EAAO,GAIZS,MAAMma,KACJvL,EAAO1U,qBAAqB,WAC5Ba,SAAQ,SAAS4G,GAElB,MAAMyvD,EAAM,CACVzvD,EAAKrG,YACLqG,EAAK0a,aAAa,UAIhB1a,EAAKwa,aAAa,SACpBi1C,EAAI3/D,KAAKkQ,EAAK0a,aAAa,SAE7B9c,EAAK9N,KAAK2/D,MAIZ,MAAM7hE,EAAMP,OAAOwJ,OAAOqK,GAAWlK,UAAUrE,MACxCoE,MACE6G,EAAM,CACL0C,UAAYkvD,IAkCtB,OA9BA5hE,EAAIy3D,WAAa3tD,EACjB9J,EAAI8hE,QAAUziD,EACdA,EAAOnR,MAAMK,QAAU,OAGvBvO,EAAI+hE,OAAS/hE,EAAIy3D,WAAWzwD,KAAK,QACjChH,EAAI+hE,OAAO16D,KAAK,IAEfrH,EAAIy3D,WAAWvwD,YAAYlH,EAAI8J,WAGhC9J,EAAIy3D,WAAW5oD,iBAAiB,QAAS7O,EAAIgiE,aAAa73D,KAAKnK,IAG/DA,EAAIwQ,OAAOhF,QAAQ,CAAC/H,EAAE3C,IAAM2C,EAAEi+D,OAAS5gE,GAGvCd,EAAI8J,UAAU+E,iBAAiB,QAAQ,SAAUpL,GAC/CsB,KAAKkH,KAAKC,OACVnH,KAAKkH,KAAK01D,eAMZtiD,EAAOxQ,iBAAiB,SAAU,SAAUpL,GAC1CsB,KAAK48D,aACLx3D,KAAKnK,IAEPA,EAAI2hE,YACG3hE,GAMRqf,OAAS,SAAU1c,GACjB,MAAMkJ,EAAI9G,KAMX,OALI9C,UAAUZ,OAAS,IACrBwK,EAAEuT,UAAYzc,EACdkJ,EAAEi2D,QAAQG,cAAgBt/D,GAGrBkJ,EAAEuT,WAAavT,EAAEi2D,QAAQG,eAAiB,GAOlDrG,YAAc,SAAUsG,GACtB,MAAMr2D,EAAI9G,KACJo9D,EAAMt2D,EAAEi2D,QAAQx2C,QACtB,IAAK,IAAIxqB,EAAI,EAAGA,EAAIqhE,EAAI9gE,OAAQP,IAC/B,GAAIqhE,EAAIrhE,GAAGwB,OAAS4/D,EAAQ,CACzBr2D,EAAEK,OACFL,EAAEwT,OAAOve,GACT+K,EAAE81D,YACF,MAGJ,OAAO91D,GAOTm2D,aAAe,WACb,MAAMn2D,EAAI9G,KACX8G,EAAEk2D,OAAO7zD,MAAMK,QAAU,OACzB1C,EAAEyG,KAAKzG,EAAEuT,UAAYvT,EAAEi2D,QAAQG,eAC/Bp2D,EAAE4D,SAOHkyD,UAAY,WAGV,MAAM91D,EAAI9G,KACD8G,EAAEwT,SACZxT,EAAEk2D,OAAOh2D,YAAcF,EAAEuG,KACvBvG,EAAEwT,UACFhL,QACFxI,EAAEk2D,OAAO7zD,MAAMK,QAAU,cAM/B,SAAS9K,GAAG,oBAAoBD,QAAQC,EAAED,UAAUmB,OAAOy9D,KAAK3+D,EAAE,IAAI,mBAAmB3E,GAAQA,EAAO2F,KAAK3F,EAAO,+BAA+B,IAAG,WAAW,OAAO6F,OAAOy9D,SAA/K,EAAwL,SAAS3+D,GAAG,SAASJ,EAAEI,GAAG,OAAOA,EAAEjC,QAAQ,MAAM,SAASA,QAAQ,MAAM,QAAQA,QAAQ,MAAM,QAAQ,SAASqK,EAAEpI,GAAG,OAAOA,EAAE84D,SAASj2D,cAAc,SAAS+S,EAAE5V,EAAEJ,GAAG,IAAIwI,EAAEpI,GAAGA,EAAEopB,KAAKxpB,GAAG,OAAOwI,GAAG,GAAGA,EAAElJ,MAAgP,SAAS7B,EAAE2C,EAAEJ,GAAG,IAAIwI,EAAEwN,EAAE,GAAG,IAAIxN,KAAKpI,EAAE4V,EAAExN,GAAGpI,EAAEoI,GAAG,GAAGxI,EAAE,IAAIwI,KAAKxI,EAAEgW,EAAExN,GAAGxI,EAAEwI,GAAG,OAAOwN,EAAE,SAAS2X,EAAEvtB,GAAG,IAAIJ,EAAE,GAAG,OAAO,SAASgW,EAAE5V,EAAEiV,GAAG,IAAI,IAAI5X,EAAE2C,EAAEmC,WAAW9E,EAAEA,EAAEA,EAAE6pB,YAAY,GAAG7pB,EAAEmK,SAASyN,GAAG5X,EAAEgK,UAAUzJ,OAAO,GAAGP,EAAEmK,WAAW5H,EAAEnB,KAAK,CAACioB,MAAM,QAAQ5c,OAAOmL,EAAE/S,KAAK7E,IAAI4X,EAAEW,EAAEvY,EAAE4X,GAAG7M,EAAE/K,GAAGsb,MAAM,oBAAoB/Y,EAAEnB,KAAK,CAACioB,MAAM,OAAO5c,OAAOmL,EAAE/S,KAAK7E,KAAK,OAAO4X,EAA5O,CAA+OjV,EAAE,GAAGJ,EAAE,SAAS4tB,EAAExtB,EAAE4V,EAAEX,GAAG,SAAS5X,IAAI,OAAO2C,EAAEpC,QAAQgY,EAAEhY,OAAOoC,EAAE,GAAG8J,QAAQ8L,EAAE,GAAG9L,OAAO9J,EAAE,GAAG8J,OAAO8L,EAAE,GAAG9L,OAAO9J,EAAE4V,EAAE,SAASA,EAAE,GAAG8Q,MAAM1mB,EAAE4V,EAAE5V,EAAEpC,OAAOoC,EAAE4V,EAAE,SAAS2X,EAAEvtB,GAA0D8hB,GAAG,IAAI1Z,EAAEpI,GAAGgN,MAAM/Q,UAAUyB,IAAIjB,KAAKuD,EAAE4+D,YAA9F,SAAW5+D,GAAG,MAAM,IAAIA,EAAE84D,SAAS,KAAKl5D,EAAEI,EAAEnB,OAAO,OAAyDV,KAAK,IAAI,IAAI,SAASqvB,EAAExtB,GAAG8hB,GAAG,KAAK1Z,EAAEpI,GAAG,IAAI,SAAS0e,EAAE1e,IAAI,SAASA,EAAE0mB,MAAM6G,EAAEC,GAAGxtB,EAAEkC,MAAM,IAAI,IAAI2I,EAAE,EAAEiX,EAAE,GAAGniB,EAAE,GAAGK,EAAEpC,QAAQgY,EAAEhY,QAAQ,CAAC,IAAI+wB,EAAEtxB,IAAI,GAAGykB,GAAGliB,EAAEqV,EAAEtS,OAAOkI,EAAE8jB,EAAE,GAAG7kB,OAAOe,IAAIA,EAAE8jB,EAAE,GAAG7kB,OAAO6kB,GAAG3uB,EAAE,CAACL,EAAE2a,UAAUvS,QAAQylB,GAAG,GAAG9O,EAAEiQ,EAAEzwB,OAAO,EAAE,GAAG,IAAIywB,EAAEtxB,UAAUsxB,GAAG3uB,GAAG2uB,EAAE/wB,QAAQ+wB,EAAE,GAAG7kB,QAAQe,GAAGlL,EAAE2a,UAAUvS,QAAQwlB,OAAO,SAASoB,EAAE,GAAGjI,MAAM/mB,EAAElB,KAAKkwB,EAAE,GAAGzsB,MAAMvC,EAAEmiC,MAAMpjB,EAAEiQ,EAAEzwB,OAAO,EAAE,GAAG,IAAI,OAAO4jB,EAAEliB,EAAEqV,EAAEtS,OAAOkI,IAAI,SAAS6T,EAAE1e,GAAG,SAASJ,EAAEI,GAAG,OAAOA,GAAGA,EAAE2hC,QAAQ3hC,EAAE,SAASoI,EAAEA,EAAEwN,GAAG,OAAO,IAAIlU,OAAO9B,EAAEwI,GAAG,KAAKpI,EAAE6+D,GAAG,IAAI,KAAKjpD,EAAE,IAAI,MAAK,SAASA,EAAEX,EAAEsY,GAAG,IAAItY,EAAE6pD,SAAS,CAAC,GAAG7pD,EAAE6pD,UAAS,EAAG7pD,EAAEsC,EAAEtC,EAAEsC,GAAGtC,EAAE8pD,GAAG9pD,EAAEsC,EAAE,CAAC,IAAIiW,EAAE,GAAG9O,EAAE,SAAS9e,EAAEwI,GAAGpI,EAAE6+D,KAAKz2D,EAAEA,EAAEvF,eAAeuF,EAAE3K,MAAM,KAAKsK,SAAQ,SAAS/H,GAAG,IAAIoI,EAAEpI,EAAEvC,MAAM,KAAK+vB,EAAEplB,EAAE,IAAI,CAACxI,EAAEwI,EAAE,GAAGkT,OAAOlT,EAAE,IAAI,OAAM,iBAAiB6M,EAAEsC,EAAEmH,EAAE,UAAUzJ,EAAEsC,GAAGvb,OAAOqf,KAAKpG,EAAEsC,GAAGxP,SAAQ,SAAS/H,GAAG0e,EAAE1e,EAAEiV,EAAEsC,EAAEvX,OAAMiV,EAAEsC,EAAEiW,EAAEvY,EAAE+pD,GAAG52D,EAAE6M,EAAE6M,GAAG,WAAU,GAAIyL,IAAItY,EAAE8pD,KAAK9pD,EAAElE,EAAE,OAAOkE,EAAE8pD,GAAGthE,MAAM,KAAKU,KAAK,KAAK,QAAQ8W,EAAElE,IAAIkE,EAAElE,EAAE,SAASkE,EAAEgqD,GAAG72D,EAAE6M,EAAElE,GAAGkE,EAAEjV,GAAGiV,EAAEiqD,KAAKjqD,EAAEjV,EAAE,SAASiV,EAAEjV,IAAIiV,EAAEkqD,GAAG/2D,EAAE6M,EAAEjV,IAAIiV,EAAEmqD,GAAGx/D,EAAEqV,EAAEjV,IAAI,GAAGiV,EAAEiqD,IAAI3xC,EAAE6xC,KAAKnqD,EAAEmqD,KAAKnqD,EAAEjV,EAAE,IAAI,IAAIutB,EAAE6xC,KAAKnqD,EAAE5X,IAAI4X,EAAEoqD,GAAGj3D,EAAE6M,EAAE5X,SAAI,IAAS4X,EAAEW,IAAIX,EAAEW,EAAE,GAAGX,EAAEyJ,IAAIzJ,EAAEyJ,EAAE,IAAI,IAAI7T,EAAE,GAAGoK,EAAEyJ,EAAE3W,SAAQ,SAAS/H,GAAGA,EAAEqF,EAAErF,EAAEqF,EAAE0C,SAAQ,SAASnI,GAAGiL,EAAEpM,KAAKpB,EAAE2C,EAAEJ,OAAMiL,EAAEpM,KAAK,QAAQuB,EAAEiV,EAAEjV,MAAKiV,EAAEyJ,EAAE7T,EAAEoK,EAAEyJ,EAAE3W,SAAQ,SAAS/H,GAAG4V,EAAE5V,EAAEiV,MAAKA,EAAEqqD,QAAQ1pD,EAAEX,EAAEqqD,OAAO/xC,GAAG,IAAIzL,EAAE7M,EAAEyJ,EAAEhhB,KAAI,SAASsC,GAAG,OAAOA,EAAE++D,GAAG,QAAQ/+D,EAAE+Q,EAAE,QAAQ/Q,EAAE+Q,KAAI9S,OAAO,CAACgX,EAAEmqD,GAAGnqD,EAAE5X,IAAIK,IAAIkC,GAAG6a,OAAOigC,SAASzlC,EAAE7M,EAAE0Z,EAAElkB,OAAOwK,EAAE0Z,EAAE3jB,KAAK,MAAK,GAAI,CAACirB,KAAK,WAAW,OAAO,QAAQxT,CAAE5V,GAAG,SAAS6K,EAAE7K,EAAEoI,EAAE6M,EAAE5X,GAAG,SAASkwB,EAAEvtB,EAAEJ,GAAG,IAAI,IAAIwI,EAAE,EAAEA,EAAExI,EAAE8e,EAAE9gB,OAAOwK,IAAI,GAAGwN,EAAEhW,EAAE8e,EAAEtW,GAAG62D,GAAGj/D,GAAG,OAAOJ,EAAE8e,EAAEtW,GAAG,SAASolB,EAAExtB,EAAEJ,GAAG,GAAGgW,EAAE5V,EAAEm/D,GAAGv/D,GAAG,CAAC,KAAKI,EAAEu/D,YAAYv/D,EAAE4R,QAAQ5R,EAAEA,EAAE4R,OAAO,OAAO5R,EAAE,OAAOA,EAAEk/D,GAAG1xC,EAAExtB,EAAE4R,OAAOhS,QAAG,EAAO,SAASD,EAAEK,EAAEJ,GAAG,OAAOqV,GAAGW,EAAEhW,EAAEy/D,GAAGr/D,GAAG,SAAS2uB,EAAE3uB,EAAEJ,GAAG,IAAIwI,EAAEo3D,EAAEX,GAAGj/D,EAAE,GAAGiD,cAAcjD,EAAE,GAAG,OAAOI,EAAEuX,EAAErb,eAAekM,IAAIpI,EAAEuX,EAAEnP,GAAG,SAAStI,EAAEE,EAAEJ,EAAEwI,EAAEwN,GAAG,IAAyBvY,EAAE,iBAArBuY,EAAE,GAAG8b,EAAE+tC,aAAiD,OAAOpiE,GAAG2C,EAAE,MAAOJ,GAAlCwI,EAAE,GAAG,WAA0b,SAAS2I,IAAI,YAAO,IAAS2uD,EAAEC,GAAnN,WAAa,GAAGD,EAAEC,KAAKnwC,EAAEkwC,EAAEC,IAAI,OAAO//D,EAAE4xB,GAAG,IAAIxxB,EAAE0/D,EAAEC,GAAG90D,EAAE60D,EAAEC,GAAGnuC,GAAE,EAAGouC,EAAEF,EAAEC,KAAK79C,EAAE0P,GAAG,OAAOkuC,EAAE9pD,EAAE,IAAIiqD,GAAG7/D,EAAE4V,GAAG,cAAc8pD,EAAEI,kBAAkBF,EAAEF,EAAEC,IAAI3/D,EAAE0K,KAAK5K,EAAEE,EAAE+/D,SAAS//D,EAAEnB,OAAM,GAAG,GAAsCs0B,GAA3b,WAAa,IAAIusC,EAAEnoD,EAAE,OAAO3X,EAAE4xB,GAAG,IAAIxxB,EAAE,GAAGoI,EAAE,EAAEs3D,EAAEV,GAAG/hE,UAAU,EAAE,IAAI,IAAI2Y,EAAE8pD,EAAEV,GAAG51C,KAAKoI,GAAG5b,GAAG,CAAC5V,GAAGJ,EAAE4xB,EAAE7uB,OAAOyF,EAAEwN,EAAE1W,MAAMkJ,IAAI,IAAI6M,EAAE0Z,EAAE+wC,EAAE9pD,GAAGX,GAAG4qD,GAAG5qD,EAAE,GAAGjV,GAAGF,EAAEmV,EAAE,GAAGrV,EAAEgW,EAAE,MAAM5V,GAAGJ,EAAEgW,EAAE,IAAIxN,EAAEs3D,EAAEV,GAAG/hE,UAAU2Y,EAAE8pD,EAAEV,GAAG51C,KAAKoI,GAAG,OAAOxxB,EAAEJ,EAAE4xB,EAAE7uB,OAAOyF,IAA8NsT,GAAI,SAASrW,EAAErF,EAAEoI,GAAG,IAAIwN,EAAE5V,EAAEggE,GAAGlgE,EAAEE,EAAEggE,GAAG,IAAG,GAAI,GAAGhgE,EAAEigE,IAAI1oD,GAAG3B,EAAE4b,EAAE,IAAIxxB,EAAEkgE,IAAI3oD,GAAG3X,EAAEwI,GAAGwN,EAAE4b,EAAE,KAAKja,GAAG3B,EAAE4b,EAAEppB,GAAGs3D,EAAE1jE,OAAOwJ,OAAOxF,EAAE,CAAC4R,OAAO,CAAC/S,MAAM6gE,KAAK,SAASn3D,EAAEvI,EAAEoI,GAAG,GAAGopB,GAAGxxB,OAAE,IAASoI,EAAE,OAAOmP,GAAGxG,IAAI,EAAE,IAAI6E,EAAE2X,EAAEnlB,EAAEs3D,GAAG,GAAG9pD,EAAE,OAAO2B,GAAGxG,IAAI1L,EAAEuQ,EAAExN,GAAGwN,EAAEqqD,GAAG,EAAE73D,EAAExK,OAAO,IAAIqX,EAAEuY,EAAEkyC,EAAEt3D,GAAG,GAAG6M,EAAE,CAAC,IAAI5X,EAAEqiE,EAAEriE,EAAE8iE,IAAI9iE,EAAE+iE,KAAK5uC,GAAGppB,GAAGmP,GAAGxG,IAAI,GAAG2uD,EAAEM,KAAKzoD,GAAG,WAAWsoD,GAAGH,EAAE9pD,EAAE8pD,EAAEA,EAAE9tD,aAAa8tD,GAAGzqD,EAAErD,QAAQ,OAAOvU,EAAE+iE,KAAK7oD,GAAG3X,EAAEwI,IAAIopB,EAAE,GAAGvc,EAAEqqD,QAAQj6D,EAAE4P,EAAEqqD,OAAO,IAAIjiE,EAAE8iE,GAAG,EAAE/3D,EAAExK,OAAO,GAAG+B,EAAEyI,EAAEs3D,GAAG,MAAM,IAAI3gE,MAAM,mBAAmBqJ,EAAE,gBAAgBs3D,EAAEM,IAAI,aAAa,KAAK,OAAOxuC,GAAGppB,EAAEA,EAAExK,QAAQ,EAAE,IAAI4hE,EAAEa,EAAErgE,GAAG,IAAIw/D,EAAE,MAAM,IAAIzgE,MAAM,sBAAsBiB,EAAE,KAAK0e,EAAE8gD,GAAG,IAAIc,EAAEZ,EAAEriE,GAAGmiE,EAAEI,EAAE,GAAGroD,EAAE,GAAG,IAAI+oD,EAAEZ,EAAEY,GAAGd,EAAEc,EAAEA,EAAE1uD,OAAO0uD,EAAEN,KAAKzoD,EAAEzX,EAAEwgE,EAAEN,GAAG,IAAG,GAAIzoD,GAAG,IAAIia,EAAE,GAAGquC,EAAE,EAAE,IAAI,IAAI,IAAIU,EAAEjjE,EAAEkjE,EAAE,EAAQd,EAAEt3D,EAAEnL,UAAUujE,EAAED,EAAEb,EAAEt3D,EAAEghB,KAAKhhB,IAAY9K,EAAEiL,EAAEH,EAAEzF,OAAO69D,EAAED,EAAErhE,MAAMshE,GAAGD,EAAE,IAAIC,EAAED,EAAErhE,MAAM5B,EAAE,IAAIiL,EAAEH,EAAEzF,OAAO69D,IAAIF,EAAEZ,EAAEY,EAAE1uD,OAAO0uD,EAAEA,EAAE1uD,OAAO0uD,EAAEN,KAAKzoD,GAAG,WAAW,MAAM,CAAC3B,EAAEiqD,EAAEhhE,MAAM0Y,EAAEwoD,SAAS//D,EAAE0K,IAAIg1D,GAAG,MAAMe,GAAG,IAAI,GAAGA,EAAEjF,QAAQr8D,QAAQ,WAAW,MAAM,CAACyW,EAAE,EAAE/W,MAAMe,EAAEwI,IAAI,MAAMq4D,GAAG,SAAS3+C,EAAE9hB,EAAEoI,GAAGA,EAAEA,GAAGspB,EAAEgvC,WAAW1kE,OAAOqf,KAAKmU,GAAG,IAAI5Z,EAAE,CAACA,EAAE,EAAE/W,MAAMe,EAAEI,IAAIiV,EAAEW,EAAE,OAAOxN,EAAEL,SAAQ,SAASnI,GAAG,GAAGygE,EAAEzgE,GAAG,CAAC,IAAIwI,EAAEyC,EAAEjL,EAAEI,GAAE,GAAIoI,EAAE23D,SAASngE,EAAEwI,EAAEwN,EAAEX,EAAEW,IAAIX,EAAE7M,GAAGA,EAAEwN,EAAEA,EAAEA,IAAIX,EAAEW,EAAEA,EAAExN,OAAM6M,EAAE8qD,WAAWnqD,EAAE+qD,YAAY1rD,GAAGW,EAAE,SAASjW,EAAEK,GAAG,OAAO0xB,EAAEkvC,aAAa5gE,EAAEA,EAAEjC,QAAQ,sBAAqB,SAASiC,EAAEJ,GAAG,OAAOA,EAAE7B,QAAQ,MAAM2zB,EAAEkvC,gBAAelvC,EAAEmvC,QAAQ7gE,EAAEA,EAAEjC,QAAQ,MAAM,SAASiC,EAA2I,SAASF,EAAEE,GAAG,IAAIJ,EAA1kJ,SAAWI,GAAG,IAAIJ,GAAGI,EAAEs9C,UAAU,KAAKt9C,EAAEmH,WAAWnH,EAAEmH,WAAWm2C,UAAU,KAAK7/C,MAAM,OAAO,OAAOmC,EAAEA,EAAElC,KAAI,SAASsC,GAAG,OAAOA,EAAEjC,QAAQ,gBAAgB,QAAQ0c,QAAO,SAASza,GAAG,OAAOqgE,EAAErgE,IAAI,6BAA6BlC,KAAKkC,MAAK,GAAq2IiV,CAAEjV,GAAG,IAAI,6BAA6BlC,KAAK8B,GAAG,CAAC,IAAIwI,EAAEspB,EAAEmvC,OAAOz4D,EAAE1E,SAASsnD,gBAAgB,+BAA+B,QAASniD,UAAU7I,EAAE6I,UAAU9K,QAAQ,MAAM,IAAIA,QAAQ,cAAc,MAAOqK,EAAEpI,EAAE,IAAI4V,EAAExN,EAAEE,YAAYjL,EAAEuC,EAAEiL,EAAEjL,EAAEgW,GAAE,GAAIkM,EAAElM,GAAG8I,EAAE6O,EAAEnlB,GAAG,GAAGsW,EAAE9gB,OAAO,CAAC,IAAIkC,EAAE4D,SAASsnD,gBAAgB,+BAA+B,OAAOlrD,EAAE+I,UAAUxL,EAAEwB,MAAMxB,EAAEwB,MAAM2uB,EAAE9O,EAAE6O,EAAEztB,GAAG8V,GAAGvY,EAAEwB,MAAMc,EAAEtC,EAAEwB,OAAOmB,EAAE6I,UAAUxL,EAAEwB,MAAMmB,EAAEs9C,UAAxjB,SAAWt9C,EAAEJ,EAAEwI,GAAG,IAAIwN,EAAEhW,EAAE4/D,EAAE5/D,GAAGwI,EAAE6M,EAAE,CAACjV,EAAE2H,QAAQ,OAAO3H,EAAE2Y,MAAM,aAAa1D,EAAExW,KAAK,SAAS,IAAIuB,EAAEb,QAAQyW,IAAIX,EAAExW,KAAKmX,GAAGX,EAAE9W,KAAK,KAAKwJ,OAAgcgnB,CAAE3uB,EAAEs9C,UAAU19C,EAAEvC,EAAE0iE,UAAU//D,EAAEy9B,OAAO,CAACsiC,SAAS1iE,EAAE0iE,SAASlqD,GAAGxY,EAAEuY,GAAGvY,EAAEsjE,cAAc3gE,EAAE2gE,YAAY,CAACZ,SAAS1iE,EAAEsjE,YAAYZ,SAASlqD,GAAGxY,EAAEsjE,YAAY/qD,KAA4B,SAASud,IAAI,IAAIA,EAAE2tC,OAAO,CAAC3tC,EAAE2tC,QAAO,EAAG,IAAI9gE,EAAE0D,SAAS40D,iBAAiB,YAAYtrD,MAAM/Q,UAAU8L,QAAQtL,KAAKuD,EAAEF,IAA8M,SAASugE,EAAErgE,GAAG,OAAOwvB,EAAExvB,IAAIwvB,EAAEgwC,EAAEx/D,IAAI,IAAI0xB,EAAE,CAAC+tC,YAAY,QAAQmB,WAAW,KAAKC,OAAM,EAAGH,eAAU,GAAQlxC,EAAE,GAAGgwC,EAAE,GAAG,OAAOx/D,EAAE2G,UAAUkE,EAAE7K,EAAE+gE,cAAcj/C,EAAE9hB,EAAEghE,UAAUrhE,EAAEK,EAAEihE,eAAenhE,EAAEE,EAAEkhE,UAAphB,SAAWlhE,GAAG0xB,EAAEr0B,EAAEq0B,EAAE1xB,IAA4gBA,EAAEmhE,iBAAiBhuC,EAAEnzB,EAAEohE,uBAA1a,WAAah2D,iBAAiB,mBAAmB+nB,GAAE,GAAI/nB,iBAAiB,OAAO+nB,GAAE,IAAkXnzB,EAAEqhE,iBAAhX,SAAWzhE,EAAEwI,GAAG,IAAIwN,EAAE4Z,EAAE5vB,GAAGwI,EAAEpI,GAAG4V,EAAE0rD,SAAS1rD,EAAE0rD,QAAQv5D,SAAQ,SAAS/H,GAAGw/D,EAAEx/D,GAAGJ,MAAqTI,EAAEuhE,cAAnT,WAAa,OAAOvlE,OAAOqf,KAAKmU,IAAmSxvB,EAAEwhE,YAAYnB,EAAErgE,EAAEyhE,QAAQpkE,EAAE2C,EAAE0hE,GAAG,eAAe1hE,EAAE2hE,IAAI,gBAAgB3hE,EAAE4hE,GAAG,oBAAoB5hE,EAAE6hE,IAAI,kEAAkE7hE,EAAE8hE,IAAI,eAAe9hE,EAAE+hE,IAAI,+IAA+I/hE,EAAEgiE,GAAG,CAACjxD,EAAE,eAAe6E,EAAE,GAAG5V,EAAEiiE,IAAI,CAACjC,GAAG,SAASjvD,EAAE,IAAI/Q,EAAE,IAAI3C,EAAE,MAAMqhB,EAAE,CAAC1e,EAAEgiE,KAAKhiE,EAAEkiE,IAAI,CAAClC,GAAG,SAASjvD,EAAE,IAAI/Q,EAAE,IAAI3C,EAAE,MAAMqhB,EAAE,CAAC1e,EAAEgiE,KAAKhiE,EAAEmiE,IAAI,CAACpxD,EAAE,mHAAmH/Q,EAAEugE,EAAE,SAAS3gE,EAAEwI,EAAEwN,GAAG,IAAIX,EAAEjV,EAAEyhE,QAAQ,CAACzB,GAAG,UAAUjvD,EAAEnR,EAAEI,EAAEoI,EAAEsW,EAAE,IAAI9I,GAAG,IAAI,OAAOX,EAAEyJ,EAAEjgB,KAAKuB,EAAEmiE,KAAKltD,GAAGjV,EAAEoiE,KAAKpiE,EAAEugE,EAAE,KAAK,KAAKvgE,EAAEqiE,KAAKriE,EAAEugE,EAAE,OAAO,QAAQvgE,EAAEsiE,IAAItiE,EAAEugE,EAAE,IAAI,KAAKvgE,EAAEuiE,GAAG,CAACvC,GAAG,SAASjvD,EAAE/Q,EAAE4hE,GAAGhsD,EAAE,GAAG5V,EAAEwiE,IAAI,CAACxC,GAAG,SAASjvD,EAAE/Q,EAAE6hE,IAAIjsD,EAAE,GAAG5V,EAAEyiE,IAAI,CAACzC,GAAG,SAASjvD,EAAE/Q,EAAE8hE,IAAIlsD,EAAE,GAAG5V,EAAE0iE,MAAM,CAAC1C,GAAG,SAASjvD,EAAE/Q,EAAE4hE,GAAG,kGAAkGhsD,EAAE,GAAG5V,EAAE2iE,GAAG,CAAC3C,GAAG,SAASjvD,EAAE,KAAK/Q,EAAE,aAAa3C,EAAE,KAAKqhB,EAAE,CAAC1e,EAAEgiE,GAAG,CAACjxD,EAAE,KAAK/Q,EAAE,KAAK4V,EAAE,EAAE8I,EAAE,CAAC1e,EAAEgiE,OAAOhiE,EAAE4iE,GAAG,CAAC5C,GAAG,QAAQjvD,EAAE/Q,EAAE0hE,GAAG9rD,EAAE,GAAG5V,EAAE6iE,IAAI,CAAC7C,GAAG,QAAQjvD,EAAE/Q,EAAE2hE,IAAI/rD,EAAE,GAAG5V,KAAI2+D,KAAK0C,iBAAiB,QAAO,SAASrhE,GAAG,IAAIoI,EAAE,CAAC06D,QAAQ,mBAAmBzlE,EAAE,CAAC2C,EAAEkiE,IAAIliE,EAAEwiE,KAAK1gD,EAAE,CAACk+C,GAAG,QAAQhgE,EAAE,IAAIk/D,IAAG,EAAGkB,IAAG,EAAG1hD,EAAErhB,EAAEka,EAAEnP,GAAGsW,EAAE,CAAC3N,EAAE,IAAI/Q,EAAE,IAAI0e,EAAE,CAAC,CAACshD,GAAG,YAAYjvD,EAAE,QAAQ/Q,EAAE,aAAakgE,IAAG,EAAGE,IAAG,EAAG1hD,EAAE,CAAC1e,EAAEgiE,IAAI3kE,EAAE,MAAMiiE,OAAOx9C,IAAIzkB,EAAE,OAAOuC,EAAE,CAACmR,EAAE,MAAM/Q,EAAE,MAAM0e,EAAE,CAAC1e,EAAEyhE,QAAQ3/C,EAAE,CAACk+C,GAAG,QAAQ3iE,EAAE,OAAO,OAAOA,EAAEa,OAAOb,EAAEO,OAAO,EAAE8gB,EAAE9e,GAAG,CAAC8e,EAAErhB,EAAEka,EAAEnP,EAAE/K,EAAE,UAG3jPhC,EAAO,yBAAyB,CAC9B,OACA,iCACC,SAAUmkB,GACX,MAAO,CACLha,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOga,GAClB9Z,MAAMiL,GACNhL,UAAUrE,OAMfuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAM8iD,EAAKr/D,SAASC,cAAc,OAClCo/D,EAAG73D,aAAa,KAAM,cAEtB,MAAM83D,EAAUD,EAAGx/D,KAAK,OAUxB,OARAy/D,EAAQp/D,KACNgvB,KAAKC,UAAU1xB,MAAM8hE,YAAc,GAAI,KAAM,OAI/CtE,KAAKsC,eAAe+B,GAEpB1hE,KAAK2e,MAAQ8iD,EACNA,OAYb1nE,EAAO,eAAe,CACpB,QACA,2BACC,SAAUwlB,EAAYqiD,GAEvB,MAAMxnD,EAAIhY,SAGJO,EAAM9C,MAAM6C,OAClBC,EAAIkf,aAAelf,EAAIkf,cAAgB,mBACvClf,EAAImf,QAAenf,EAAImf,SAAgB,kBAEvC,MAAM+/C,EAAQ,CAAC,OAAQ,QAAQ,UAE/B,MAAO,CACL39D,OAAS,SAAU49D,GACjB,OAAOpnE,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,WAAWC,UAAUrE,MAAMoE,MAAM09D,IAI3E19D,MAAQ,SAAU09D,GAgBhB,OAfA9hE,KAAK+hE,QAAUD,EAGXjiE,MAAMyxD,SAGRzxD,MAAMyxD,OACHlzC,YAAY,UACZ3X,QAAQ1K,GAAKiE,KAAKqd,QAAQtb,IAAI3E,MAAM4C,KAAKqd,QAASthB,IAErD8D,MAAMyxD,OAAO0Q,iBAAiB,WAGhChiE,KAAKsd,SAAU,EAERtd,MAOTiiE,YAAc,WAGZ,MAAMC,EAAWliE,KAAKqd,QAAQtb,IAC5BY,EAAImf,QACJ,CAACvQ,IAAM,CAAC,UAAU,iBAClB,WAEE,MAAMzK,EAAI9G,KAGN8G,EAAEq7D,KAAOr7D,EAAEq7D,IAAI7zD,QACjBxH,EAAEq7D,IAAIpkD,SAIRjX,EAAEq7D,IAAMP,EAAY19D,SAGpB4C,EAAEq7D,IAAIlkD,QAAU,kBACPje,KAAK+hE,QAAY,IACxB38D,KAAK0B,GAEPA,EAAEi7D,QAAY,IAAI,EAClBj7D,EAAE/E,IAAI+E,EAAEq7D,SAKRniE,KAAK+hE,QAAY,IACnBG,EAASvlD,SAObylD,eAAiB,WAIfpiE,KAAKqd,QAAQtb,IAAIY,EAAIkf,aAAc,CAACtQ,IAAM,CAAC,QAAQ,QAAQ,iBAAiB,SAAU7S,GACpF,IAAI2jE,EAAOjoD,EAAEo4C,cAAc,gBAAgB3wD,UAE3CggE,EAAMrpD,MAAK,SAASqsB,EAAO9oC,GACzB,GAAIsmE,EAAKvgE,SAAS,SAAW+iC,GAAQ,CACnC,MAAMvmC,EAAKvC,GAAK,EAAI,EAAIA,EAAE,EACpBumE,EAAKhkE,GAAK,EAAI,EAAIA,EAAE,EAI1B,OAHA+jE,EAAKrgE,OAAO,SAAW6iC,GACvBw9B,EAAKtgE,IAAI,SAAW8/D,EAAMvjE,IAC1B0B,KAAK2O,OAAOlN,YAAYogE,EAAMvjE,GAAIujE,EAAMS,KACjC,KAERtiE,cAaXjG,EAAO,cAAc,CACnB,UACC,SAAUwlB,GAEDnd,SAGEvC,MAAM6C,OAElB,MAAO,CACLwB,OAAS,SAAU49D,GACjB,OAAOpnE,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,UAAUC,UAAUrE,MAAMoE,MAAM09D,IAI1E19D,MAAQ,SAAU09D,GAChB9hE,KAAK+hE,QAAUD,EACf,MAAMnuD,EAAI3T,KAAKqd,QAaf,OAVIxd,MAAMyxD,SAGRzxD,MAAMyxD,OACHlzC,YAAY,SACZ3X,QAAQ1K,GAAK4X,EAAE5R,IAAI3E,MAAMuW,EAAG5X,IAE/B8D,MAAMyxD,OAAO0Q,iBAAiB,UAGzBhiE,UAYb,SAAU3B,GACN,GAAuB,iBAAZI,SAA0C,oBAAXE,OACtCA,OAAOF,QAAUJ,IAGjBM,OAAOF,QAAQ8jE,QAAU,WAGvB,OAFAh/D,QAAQi/D,KAAK,sGAENnkE,IAAIjB,MAAM4C,KAAM9C,iBAEtB,GAAsB,mBAAXnD,GAAyBA,EAAO2F,IAC9C3F,EAAO,YAAY,GAAIsE,OACpB,EAEmB,oBAAXuB,OACHA,OACqB,oBAAXksB,OACVA,OACmB,oBAATC,KACVA,KAEA/rB,MAENuiE,QAAUlkE,KAvBpB,EAyBG,WASD,SAASokE,EAAQxnE,GACf+E,KAAK0iE,eAAiBznE,EACtB+E,KAAK2iE,YAAc,GAEnB3iE,KAAK4iE,SAAW,CAEdC,UAAW,cAEXC,UAAW,cAEXC,UAAW,OAEXC,UAAW,OAEXC,UAAU,EAEVC,UAAU,EAEVC,gBAAiB,SAEjBC,aAAc,GAEdC,eAAgB,GAEhBC,WAAW,EAEXC,oBAAoB,EAEpBC,iBAAiB,EAEjBC,oBAAoB,EAEpBC,aAAa,EAEbC,aAAa,EAEbC,cAAc,EAEdC,iBAAiB,EAMjBr9C,SAAU,UAEVs9C,cAAe,GAEfC,eAAgB,GAEhBC,mBAAoB,CAAC,SAAU,MAAO,QAAS,QAE/CC,oBAAoB,EAEpBC,qBAAsB,GAEtBC,aAAc,aAEdC,gBAAiB,SAEjBC,eAAe,EAEfC,YAAa,kBAajB,SAASC,EAAiBC,EAAWxyD,GACnC,IAAIyyD,EAAgBD,EAAUxN,iBAAiB,iBAC3C0N,EAAa,GAEjB,GAAI1kE,KAAK4iE,SAAS+B,MAEhBC,EAAS5kE,KAAK4iE,SAAS+B,MAAO,SAAUjf,GACtC,IAAImf,EAAcC,EAAapf,GAY/B,GATAmf,EAAYnf,KAAOgf,EAAWpoE,OAAS,EAGF,iBAAzBuoE,EAAmB,UAE7BA,EAAY9/D,QAAU3C,SAASowD,cAAcqS,EAAY9/D,eAItB,IAAzB8/D,EAAmB,SAA6C,OAAxBA,EAAY9/D,QAAkB,CAChF,IAAIggE,EAAuB3iE,SAASowD,cAAc,2BAErB,OAAzBuS,KACFA,EAAuB3iE,SAASC,cAAc,QACzB25C,UAAY,yBAEjC55C,SAASuuD,KAAKxuD,YAAY4iE,IAG5BF,EAAY9/D,QAAWggE,EACvBF,EAAY54D,SAAW,WAGzB44D,EAAYr+C,SAAWq+C,EAAYr+C,UAAYxmB,KAAK4iE,SAASp8C,cAEb,IAApCq+C,EAA8B,qBACxCA,EAAYZ,mBAAqBjkE,KAAK4iE,SAASqB,oBAGrB,OAAxBY,EAAY9/D,SACd2/D,EAAWvnE,KAAK0nE,IAElBz/D,KAAKpF,WAEF,CAEL,IACIikE,EAGJ,GAJiBQ,EAAcnoE,OAId,EACf,OAAO,EAGTsoE,EAASH,EAAe,SAAUO,GAIhC,KAAIhzD,GAAUgzD,EAAej9C,aAAa,sBAAwB/V,IAK7B,SAAjCgzD,EAAe77D,MAAMK,QAAzB,CAIA,IAAIk8C,EAAOj9C,SAASu8D,EAAej9C,aAAa,aAAc,IAG5Dk8C,OADuE,IAA7De,EAAej9C,aAAa,8BACfi9C,EAAej9C,aAAa,4BAE9B/nB,KAAK4iE,SAASqB,mBAGjCve,EAAO,IACTgf,EAAWhf,EAAO,GAAK,CACrB3gD,QAASigE,EACTC,MAAOD,EAAej9C,aAAa,cACnC29B,KAAMj9C,SAASu8D,EAAej9C,aAAa,aAAc,IACzDq7C,aAAc4B,EAAej9C,aAAa,qBAC1Cs7C,eAAgB2B,EAAej9C,aAAa,uBAC5C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,gBACxE38C,SAAUw+C,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASp8C,SACxEy9C,mBAAoBA,MAGxB7+D,KAAKpF,OAIP,IAAIklE,EAAW,EAEfN,EAASH,EAAe,SAAUO,GAIhC,KAAIhzD,GAAUgzD,EAAej9C,aAAa,sBAAwB/V,IAIjB,OAA7CgzD,EAAej9C,aAAa,aAAuB,CAErD,UACsC,IAAzB28C,EAAWQ,IAGpBA,IAKFjB,OADuE,IAA7De,EAAej9C,aAAa,8BACfi9C,EAAej9C,aAAa,4BAE9B/nB,KAAK4iE,SAASqB,mBAGrCS,EAAWQ,GAAY,CACrBngE,QAASigE,EACTC,MAAOD,EAAej9C,aAAa,cACnC29B,KAAMwf,EAAW,EACjB9B,aAAc4B,EAAej9C,aAAa,qBAC1Cs7C,eAAgB2B,EAAej9C,aAAa,uBAC5C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,gBACxE38C,SAAUw+C,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASp8C,SACxEy9C,mBAAoBA,KAGxB7+D,KAAKpF,OAKT,IADA,IAAImlE,EAAiB,GACZC,EAAI,EAAGA,EAAIV,EAAWpoE,OAAQ8oE,IACjCV,EAAWU,IAEbD,EAAehoE,KAAKunE,EAAWU,IAyBnC,OArBAV,EAAaS,GAGF3gD,MAAK,SAAU7Q,EAAGlE,GAC3B,OAAOkE,EAAE+xC,KAAOj2C,EAAEi2C,QAIpB1lD,KAAK2iE,YAAc+B,EAGhBW,EAAiBlqE,KAAK6E,KAAMwkE,KAE7Bc,EAAUnqE,KAAK6E,MAEXA,KAAK4iE,SAASa,oBAChB8B,EAASC,GAAG5lE,OAAQ,UAAW6lE,EAAYzlE,MAAM,GAGnDulE,EAASC,GAAG5lE,OAAQ,SAAU8lE,EAAW1lE,MAAM,KAE1C,EAGT,SAAS0lE,IACP1lE,KAAK2lE,QAAQxqE,KAAK6E,MAqBpB,SAASylE,EAAY/mE,GACnB,IAAIytB,EAAmB,OAAXztB,EAAEytB,KAAiBztB,EAAEknE,MAAQlnE,EAAEytB,KAO3C,GAJa,OAATA,IACFA,EAAuB,OAAfztB,EAAEuC,SAAqBvC,EAAEsC,QAAUtC,EAAEuC,UAGjC,WAATkrB,GAA8B,KAATA,IAA4C,IAA5BnsB,KAAK4iE,SAASU,WAIjD,GAAa,cAATn3C,GAAiC,KAATA,EAEjC05C,EAAc1qE,KAAK6E,WACd,GAAa,eAATmsB,GAAkC,KAATA,EAElCm5C,EAAUnqE,KAAK6E,WACV,GAAa,UAATmsB,GAA6B,KAATA,EAAa,CAE1C,IAAI7H,EAAS5lB,EAAE4lB,QAAU5lB,EAAEonE,WACvBxhD,GAAUA,EAAO03B,UAAU3kC,MAAM,sBAEnCwuD,EAAc1qE,KAAK6E,MACVskB,GAAUA,EAAO03B,UAAU3kC,MAAM,uBAEtCrX,KAAK2iE,YAAYrmE,OAAS,IAAM0D,KAAK+lE,cAAyD,mBAAjC/lE,KAA2B,wBACxFA,KAAKgmE,uBAAuB7qE,KAAK6E,MAGrCimE,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,iBAClBp+C,GAAUA,EAAOyD,aAAa,mBAEvCzD,EAAO3H,QAGP2oD,EAAUnqE,KAAK6E,MAIdtB,EAAEwB,eACHxB,EAAEwB,iBAEFxB,EAAEwnE,aAAc,QAhClBD,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,gBA0C/B,SAASoC,EAAanuB,GAClB,GAAe,OAAXA,GAAuC,iBAAb,QAAsD,IAArBA,EAAe,SAC5E,OAAOA,EAET,IAAIqV,EAAO,GACX,IAAK,IAAIh2C,KAAO2gC,OACgB,IAAnB/2C,OAAa,QAAqB+2C,EAAO3gC,aAAgBpW,OAAOD,OACzEqsD,EAAKh2C,GAAO2gC,EAAO3gC,GAEnBg2C,EAAKh2C,GAAO8uD,EAAanuB,EAAO3gC,IAGpC,OAAOg2C,EAQX,SAASma,EAAUzgB,GAEjB1lD,KAAK+lE,aAAergB,EAAO,OACO,IAAtB1lD,KAAgB,aAC1BslE,EAAUnqE,KAAK6E,MAUnB,SAASomE,EAAgB1gB,GACvB1lD,KAAKqmE,mBAAqB3gB,OACQ,IAAtB1lD,KAAgB,aAC1BslE,EAAUnqE,KAAK6E,MAUnB,SAASslE,IACPtlE,KAAKsmE,WAAa,eAEuB,IAA7BtmE,KAAuB,oBACjC4kE,EAAS5kE,KAAK2iE,YAAa,SAAUt1D,EAAMtR,GACrCsR,EAAKq4C,OAAS1lD,KAAKqmE,qBACrBrmE,KAAK+lE,aAAehqE,EAAI,EACxBiE,KAAKqmE,wBAAqBhnE,IAE5B+F,KAAKpF,YAG0B,IAAvBA,KAAiB,aAC3BA,KAAK+lE,aAAe,IAElB/lE,KAAK+lE,aAGT,IAAIb,EAAWllE,KAAK2iE,YAAY3iE,KAAK+lE,cACjCQ,GAAe,EAOnB,YALiD,IAArCvmE,KAA+B,6BACzCumE,EAAevmE,KAAKwmE,2BAA2BrrE,KAAK6E,KAAMklE,EAASngE,WAIhD,IAAjBwhE,KACAvmE,KAAK+lE,cACA,GAGJ/lE,KAAK2iE,YAAkB,QAAK3iE,KAAK+lE,cAGS,mBAAjC/lE,KAA2B,wBACrCA,KAAKgmE,uBAAuB7qE,KAAK6E,WAEnCimE,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,sBAI7B+D,EAAatrE,KAAK6E,KAAMklE,GAS1B,SAASW,IAGP,GAFA7lE,KAAKsmE,WAAa,WAEQ,IAAtBtmE,KAAK+lE,aACP,OAAO,IAGP/lE,KAAK+lE,aAEP,IAAIb,EAAWllE,KAAK2iE,YAAY3iE,KAAK+lE,cACjCQ,GAAe,EAOnB,QALiD,IAArCvmE,KAA+B,6BACzCumE,EAAevmE,KAAKwmE,2BAA2BrrE,KAAK6E,KAAMklE,EAASngE,WAIhD,IAAjBwhE,EAEF,QADEvmE,KAAK+lE,cACA,EAGTU,EAAatrE,KAAK6E,KAAMklE,GAO1B,SAASwB,IAOP,GALAC,EAAwBxrE,KAAK6E,KAAMoC,SAASowD,cAAc,yBAC1DmU,EAAwBxrE,KAAK6E,KAAMoC,SAASowD,cAAc,mCAC1DmU,EAAwBxrE,KAAK6E,KAAMoC,SAASowD,cAAc,qCAGjCnzD,IAAtBW,KAAK+lE,cAAoD,OAAtB/lE,KAAK+lE,aAAuB,CAChE,IAAIa,EAAuBxkE,SAASowD,cAAc,8BAChDqU,EAAuBzkE,SAASowD,cAAc,kBAC9CsU,EAAuB1kE,SAASowD,cAAc,oBAChDuU,EAAc5rE,KAAK6E,KAAMA,KAAK2iE,YAAY3iE,KAAK+lE,cAAchhE,QAAS+hE,EAAqBD,EAAeD,GAK5G,OADAI,EAAc7rE,KAAK6E,MACZA,KAWT,SAASimE,EAAWgB,EAAeC,GACjC,IAAIC,GAAe,EAWnB,QANsC9nE,IAAlCW,KAAKonE,2BACPD,EAAennE,KAAKonE,yBAAyBjsE,KAAK6E,OAK/CknE,IAA0B,IAAjBC,EAAd,CAGA,IAAIE,EAAgBJ,EAAcjQ,iBAAiB,oBAE/CqQ,GAAiBA,EAAc/qE,QACjCsoE,EAASyC,EAAe,SAAUC,GAChCA,EAAan+D,MAAMo+D,QAAU,EAC7B3nE,OAAOL,WAAW,WACZS,KAAK6F,YACP7F,KAAK6F,WAAW/E,YAAYd,OAE9BoF,KAAKkiE,GAAe,MACtBliE,KAAKpF,OAIT,IAAIwnE,EAAcP,EAAczU,cAAc,wBAC1CgV,GACFA,EAAY3hE,WAAW/E,YAAY0mE,GAGrC,IAAIC,EAAiBR,EAAczU,cAAc,kCAC7CiV,GACFA,EAAe5hE,WAAW/E,YAAY2mE,GAIxC,IAAIC,EAA0BT,EAAczU,cAAc,+BACtDkV,GACFA,EAAwB7hE,WAAW/E,YAAY4mE,GAIjD,IAAIC,EAAkBvlE,SAASowD,cAAc,2BACzCmV,GACFA,EAAgB9hE,WAAW/E,YAAY6mE,GAGzCC,IAIAhD,EADiBxiE,SAAS40D,iBAAiB,uBACtB,SAAU1mD,GAC7Bu3D,EAAav3D,EAAQ,yBAIvBi1D,EAASh9D,IAAI3I,OAAQ,UAAW6lE,EAAYzlE,MAAM,GAClDulE,EAASh9D,IAAI3I,OAAQ,SAAU8lE,EAAW1lE,MAAM,QAGhBX,IAA5BW,KAAK8nE,oBACP9nE,KAAK8nE,mBAAmB3sE,KAAK6E,MAI/BA,KAAK+lE,kBAAe1mE,GActB,SAAS0nE,EAAcE,EAAec,EAAcC,EAAYC,EAAmBC,GACjF,IACIC,EACAC,EACAC,EACAC,EACAC,EALAC,EAAkB,GAyBtB,GAlBAN,EAAWA,IAAY,EAGvBH,EAAa5+D,MAAMC,IAAa,KAChC2+D,EAAa5+D,MAAMwkD,MAAa,KAChCoa,EAAa5+D,MAAMuxB,OAAa,KAChCqtC,EAAa5+D,MAAMgG,KAAa,KAChC44D,EAAa5+D,MAAM2qD,WAAa,KAChCiU,EAAa5+D,MAAMs/D,UAAa,KAEhCT,EAAW7+D,MAAMK,QAAU,UAEvB,MAAM,IACRy+D,EAAkB9+D,MAAMC,IAAO,KAC/B6+D,EAAkB9+D,MAAMgG,KAAO,MAI5BnP,KAAK2iE,YAAY3iE,KAAK+lE,cA2B3B,OAtBEyC,EAD2C,iBAD7CL,EAAiBnoE,KAAK2iE,YAAY3iE,KAAK+lE,eACA,aACnBoC,EAAe/E,aAEfpjE,KAAK4iE,SAASQ,aAGlC2E,EAAa/rB,WAAa,mBAAqBwsB,GAAiB/rE,QAAQ,aAAc,IACtFsrE,EAAan+D,aAAa,OAAQ,UAKH,cAH/B2+D,EAAyBvoE,KAAK2iE,YAAY3iE,KAAK+lE,cAAc95D,YAI3Ds8D,EAAyBG,EAAuBvtE,KAAK6E,KAAMinE,EAAec,EAAcQ,IAI1FF,EAAgBM,EAAW1B,GAC3BmB,EAAgBO,EAAWZ,GAC3BO,EAAgBM,IAEhBC,EAAUd,EAAc,WAAaQ,GAE7BA,GACN,IAAK,oBACHP,EAAWhsB,UAAiB,6BAE5B,IAAI8sB,EAAyB,EAC7BC,EAAWV,EAAcS,EAAwBV,EAAeL,GAChEA,EAAa5+D,MAAMuxB,OAAa2tC,EAAa3+D,OAAU,GAAM,KAC7D,MAEF,IAAK,qBACHs+D,EAAWhsB,UAAiB,8BAE5B,IAAIgtB,EAA6BX,EAAaj5C,MAAQ,EAAIg5C,EAAch5C,MAAQ,EAG5E84C,IACFc,GAA8B,GAG5BD,EAAWV,EAAcW,EAA4BZ,EAAeL,KACtEA,EAAa5+D,MAAMwkD,MAAQ,KAC3Bsb,EAAYZ,EAAcW,EAA4BZ,EAAeE,EAAYP,IAEnFA,EAAa5+D,MAAMuxB,OAAU2tC,EAAa3+D,OAAS,GAAM,KACzD,MAEF,IAAK,mBAEL,IAAK,MACHs+D,EAAWhsB,UAAY,uBAIvBitB,EAAYZ,EAFY,EAAa,EAAI,GAEQD,EAAeE,EAAYP,GAC5EA,EAAa5+D,MAAMuxB,OAAU2tC,EAAa3+D,OAAU,GAAM,KAC1D,MACF,IAAK,QACHq+D,EAAa5+D,MAAMgG,KAAQk5D,EAAaj5C,MAAQ,GAAM,KAClDi5C,EAAaj/D,IAAMg/D,EAAc1+D,OAAS4+D,EAAW5+D,QAGvDs+D,EAAWhsB,UAAY,4BACvB+rB,EAAa5+D,MAAMC,IAAM,KAAOg/D,EAAc1+D,OAAS2+D,EAAa3+D,OAAS,IAAM,MAEnFs+D,EAAWhsB,UAAY,qBAEzB,MACF,IAAK,OACEksB,IAA8C,IAAlCloE,KAAK4iE,SAASY,kBAC7BuE,EAAa5+D,MAAMC,IAAM,QAGvBi/D,EAAaj/D,IAAMg/D,EAAc1+D,OAAS4+D,EAAW5+D,QAGvDq+D,EAAa5+D,MAAMC,IAAM,KAAOg/D,EAAc1+D,OAAS2+D,EAAa3+D,OAAS,IAAM,KACnFs+D,EAAWhsB,UAAY,8BAEvBgsB,EAAWhsB,UAAY,sBAEzB+rB,EAAa5+D,MAAMwkD,MAAS0a,EAAaj5C,MAAQ,GAAM,KAEvD,MACF,IAAK,WACH44C,EAAW7+D,MAAMK,QAAU,OAG3Bu+D,EAAa5+D,MAAMgG,KAAS,MAC5B44D,EAAa5+D,MAAMC,IAAS,MAC5B2+D,EAAa5+D,MAAM2qD,WAAa,IAAOsU,EAAch5C,MAAQ,EAAM,KACnE24C,EAAa5+D,MAAMs/D,UAAa,IAAOL,EAAc1+D,OAAS,EAAK,KAE/D,MAAM,IACRu+D,EAAkB9+D,MAAMgG,KAAO,KAAQi5D,EAAch5C,MAAQ,EAAK,IAAM,KACxE64C,EAAkB9+D,MAAMC,IAAO,KAAQg/D,EAAc1+D,OAAS,EAAK,IAAM,MAG3E,MACF,IAAK,uBACHs+D,EAAWhsB,UAAiB,0BAG5B+sB,EAAWV,EADXS,EAAyB,EACwBV,EAAeL,GAChEA,EAAa5+D,MAAMC,IAAUi/D,EAAa3+D,OAAU,GAAM,KAC1D,MAEF,IAAK,wBACHs+D,EAAWhsB,UAAiB,2BAE5BgtB,EAA6BX,EAAaj5C,MAAQ,EAAIg5C,EAAch5C,MAAQ,EAGxE84C,IACFc,GAA8B,GAG5BD,EAAWV,EAAcW,EAA4BZ,EAAeL,KACtEA,EAAa5+D,MAAMwkD,MAAQ,KAC3Bsb,EAAYZ,EAAcW,EAA4BZ,EAAeE,EAAYP,IAEnFA,EAAa5+D,MAAMC,IAAOi/D,EAAa3+D,OAAS,GAAM,KACtD,MAMF,QACEs+D,EAAWhsB,UAAY,oBAGvBitB,EAAYZ,EADY,EACyBD,EAAeE,EAAYP,GAC5EA,EAAa5+D,MAAMC,IAAUi/D,EAAa3+D,OAAU,GAAM,MAShE,SAASu/D,EAAYZ,EAAca,EAAuBd,EAAeE,EAAYP,GACnF,OAAIM,EAAal5D,KAAO+5D,EAAwBd,EAAch5C,MAAQk5C,EAAWl5C,OAE/E24C,EAAa5+D,MAAMgG,KAAQm5D,EAAWl5C,MAAQg5C,EAAch5C,MAAQi5C,EAAal5D,KAAQ,MAClF,IAET44D,EAAa5+D,MAAMgG,KAAO+5D,EAAwB,MAC3C,GAQT,SAASH,EAAWV,EAAcS,EAAwBV,EAAeL,GACvE,OAAIM,EAAal5D,KAAOk5D,EAAaj5C,MAAQ05C,EAAyBV,EAAch5C,MAAQ,GAE1F24C,EAAa5+D,MAAMgG,MAASk5D,EAAal5D,KAAQ,MAC1C,IAET44D,EAAa5+D,MAAMwkD,MAAQmb,EAAyB,MAC7C,GAYT,SAASJ,EAAuBzB,EAAec,EAAcoB,GAG3D,IAAIC,EAAoBppE,KAAK4iE,SAASoB,mBAAmBlpE,QAErDwtE,EAAaM,IACbS,EAAgBV,EAAWZ,GAAcr+D,OAAS,GAClD4/D,EAAeX,EAAWZ,GAAc34C,MAAQ,GAChDm6C,EAAoBtC,EAAc/3D,wBAIlCs6D,EAAqB,WAOrBD,EAAkB7uC,OAAS2uC,EAAgBA,EAAgBf,EAAW5+D,QACxE+/D,EAAaL,EAAmB,UAI9BG,EAAkBngE,IAAMigE,EAAgB,GAC1CI,EAAaL,EAAmB,OAI9BG,EAAkB5b,MAAQ2b,EAAehB,EAAWl5C,OACtDq6C,EAAaL,EAAmB,SAI9BG,EAAkBp6D,KAAOm6D,EAAe,GAC1CG,EAAaL,EAAmB,QAIlC,IAAkC7iE,EAC5BmjE,EADFC,GAEmB,KADjBD,GAD4BnjE,EAO/B4iE,GAA0B,IANLtrE,QAAQ,MAGrB0I,EAAIlF,OAAOqoE,GAEb,GA0BT,OAtBIP,IAGFA,EAAyBA,EAAuBhtE,MAAM,KAAK,IAGzDitE,EAAkB9sE,SAIlBktE,EAH6B,SAA3BL,GACAC,EAAkBvrE,QAAQsrE,IAA2B,EAElCA,EAGAC,EAAkB,KAKY,IAAnD,CAAC,MAAO,UAAUvrE,QAAQ2rE,KAC5BA,GAcJ,SAAkC9b,EAAY4b,EAAchB,EAAYqB,GACtE,IAAIC,EAAmBN,EAAe,EACpCO,EAAW92C,KAAKsF,IAAIiwC,EAAWl5C,MAAOxvB,OAAOiJ,OAAOumB,OACpD06C,EAAqB,CAAC,gBAAiB,kBAAmB,kBAC1DC,EAAsB,GAIpBF,EAAWnc,EAAa4b,GAC1BG,EAAaK,EAAoB,kBAK/Bpc,EAAakc,GACfC,EAAWnc,EAAakc,IACxBH,EAAaK,EAAoB,mBAK/Bpc,EAAa4b,GACfG,EAAaK,EAAoB,kBAM/BC,EAHAD,EAAmBxtE,QACiC,IAAlDwtE,EAAmBjsE,QAAQ8rE,GAEPA,EAGAG,EAAmB,GAMrB,kBAGxB,OAAOC,EAtDiBC,CAAwBT,EAAkBp6D,KAAMm6D,EAAchB,EAAYqB,IAG3FH,EA4DT,SAASC,EAAaQ,EAAaC,GAC7BD,EAAYpsE,QAAQqsE,IAAmB,GACzCD,EAAYrtE,OAAOqtE,EAAYpsE,QAAQqsE,GAAiB,GAW5D,SAASvD,EAAwBa,GAC/B,GAAIA,EAAa,CAEf,IAAKxnE,KAAK2iE,YAAY3iE,KAAK+lE,cAAe,OAE1C,IAAIf,EAAkBhlE,KAAK2iE,YAAY3iE,KAAK+lE,cACxCoE,EAAkBxB,EAAW3D,EAAejgE,SAC5CqlE,EAAqBpqE,KAAK4iE,SAASsB,qBAKnCmG,EAASrF,EAAejgE,SAC1B8jE,EAAUrB,EAAa,wBAEvBK,EAAaL,EAAa,wBAGI,aAA5BxC,EAAe/4D,WACjBm+D,EAAqB,GAIvB5C,EAAYr+D,MAAMmhE,QAAU,WAAaH,EAAgB/6C,MAASg7C,GAAtC,eACmBD,EAAgBzgE,OAAS0gE,GAD5C,YAEmBD,EAAgB/gE,IAASghE,EAAqB,GAFjE,aAGmBD,EAAgBh7D,KAASi7D,EAAqB,GAAO,OAWxG,SAASG,IACP,IAAI7C,EAA0BtlE,SAASowD,cAAc,+BAErB,OAA5BkV,KACFA,EAA0BtlE,SAASC,cAAc,QACzB25C,UAAY,6BACpCh8C,KAAK0iE,eAAevgE,YAAYulE,IAGlCf,EAAwBxrE,KAAK6E,KAAM0nE,GASrC,SAAS8C,EAAmBpd,GAC1BA,EAAOxjD,aAAa,OAAQ,UAC5BwjD,EAAOqd,SAAW,EAUpB,SAAShE,EAAaQ,QACuB,IAA/BjnE,KAAyB,sBACnCA,KAAK0qE,qBAAqBvvE,KAAK6E,KAAMinE,EAAcliE,SAGrD,IAII4lE,EACAC,EACAC,EACAC,EAPA/+C,EAAO/rB,KACP+qE,EAAiB3oE,SAASowD,cAAc,wBACxCwY,EAAoB5oE,SAASowD,cAAc,kCAC3C6Q,EAAiB,sBAerB,GAR8C,iBAAlC4D,EAA4B,iBACtC5D,GAAmB,IAAM4D,EAAc5D,gBAGK,iBAAlCrjE,KAAK4iE,SAAuB,iBACtCS,GAAmB,IAAMrjE,KAAK4iE,SAASS,gBAGlB,OAAnB0H,EAAyB,CAC3B,IAAInE,EAAuBoE,EAAkBxY,cAAc,8BACvDyY,EAAuBD,EAAkBxY,cAAc,wBACvDqU,EAAuBmE,EAAkBxY,cAAc,kBACvDsU,EAAuBkE,EAAkBxY,cAAc,oBAY3D,GAVAqY,EAAuBG,EAAkBxY,cAAc,uBACvDoY,EAAuBI,EAAkBxY,cAAc,uBACvDmY,EAAuBK,EAAkBxY,cAAc,uBAGvDuY,EAAe/uB,UAAYqnB,EAE3ByD,EAAoB39D,MAAMo+D,QAAU,EACpCT,EAAoB39D,MAAMK,QAAU,OAEP,OAAzBo9D,EAA+B,CACjC,IAAIsE,EAAgBlrE,KAAK2iE,YAAasE,EAAcvhB,KAAO,GAAK,EAAIuhB,EAAcvhB,KAAO,EAAI,IAEvE,OAAlBwlB,GAA+C,YAApBlrE,KAAKsmE,YAAuD,aAA3B4E,EAAcj/D,UAAiD,aAApBjM,KAAKsmE,YAAwD,aAA3BW,EAAch7D,YACzJ26D,EAAqBz9D,MAAMo+D,QAAU,IAKzCuD,EAAeK,EAAkBlE,EAAcliE,YAE1B3C,SAASuuD,MAE5Bya,EAAuBN,EAAc7D,EAAcliE,SAIrD4hE,EAAwBxrE,KAAK4wB,EAAMg/C,GACnCpE,EAAwBxrE,KAAK4wB,EAAMi/C,GAInCpG,EADiBxiE,SAAS40D,iBAAiB,uBACtB,SAAU1mD,GAC7Bu3D,EAAav3D,EAAQ,yBAIvBs3D,IAGI77C,EAAKs/C,uBACPzrE,OAAO+5C,aAAa5tB,EAAKs/C,uBAG3Bt/C,EAAKs/C,sBAAwBzrE,OAAOL,YAAW,WAEhB,OAAzBqnE,IACFA,EAAqBr/D,UAAY0/D,EAAcvhB,MAGjDulB,EAAgB1jE,UAAY0/D,EAAchC,MAE1C6B,EAAoB39D,MAAMK,QAAU,QACpCu9D,EAAc5rE,KAAK4wB,EAAMk7C,EAAcliE,QAAS+hE,EAAqBD,EAAeD,GAGhF76C,EAAK62C,SAASe,cACdqH,EAAkBxY,cAAc,kCAAkCxW,UAAY,GAC9EgvB,EAAkBxY,cAAc,4CAA8CyU,EAAcvhB,KAAO,MAAM1J,UAAY,UAEzHgvB,EAAkBxY,cAAc,0CAA0CrpD,MAAMmhE,QAAU,SAAWgB,EAAanwE,KAAK4wB,GAAQ,KAC/Hi/C,EAAkBxY,cAAc,0CAA0C5oD,aAAa,gBAAiB0hE,EAAanwE,KAAK4wB,IAG1H+6C,EAAoB39D,MAAMo+D,QAAU,EAChCX,IAAsBA,EAAqBz9D,MAAMo+D,QAAU,GAG3D,MAAOsD,GAAmE,uBAAuBruE,KAAKquE,EAAkB7uB,WAE1H6uB,EAAkBngE,QACT,MAAOigE,GAEhBA,EAAkBjgE,QAIpB6gE,EAAUpwE,KAAK4wB,EAAMk7C,EAAczgD,SAAUygD,EAAegE,KAC3D,SAGE,CACL,IAAIzD,EAAoBplE,SAASC,cAAc,OAC3ColE,EAAoBrlE,SAASC,cAAc,OAC3C2lE,EAAoB5lE,SAASC,cAAc,OAC3C0lE,EAAoB3lE,SAASC,cAAc,OAC3CmpE,EAAoBppE,SAASC,cAAc,OAC3CopE,EAAoBrpE,SAASC,cAAc,OAC3CqpE,EAAoBtpE,SAASC,cAAc,OAC3CspE,EAAoBvpE,SAASC,cAAc,OAE/CmlE,EAAYxrB,UAAYqnB,EACxBoE,EAAezrB,UAAY,iCAG3B8uB,EAAeK,EAAkBlE,EAAcliE,YAE1B3C,SAASuuD,MAE5Bya,EAAuBN,EAAc7D,EAAcliE,SAIrD4hE,EAAwBxrE,KAAK4wB,EAAMy7C,GACnCb,EAAwBxrE,KAAK4wB,EAAM07C,GAGnCznE,KAAK0iE,eAAevgE,YAAYqlE,GAChCxnE,KAAK0iE,eAAevgE,YAAYslE,GAEhCO,EAAWhsB,UAAY,gBAEvBwvB,EAAiBxvB,UAAY,sBAC7BwvB,EAAiBjkE,UAAY0/D,EAAchC,MAE3CwG,EAAazvB,UAAY,mBAES,IAA9Bh8C,KAAK4iE,SAASe,cAChB8H,EAAatiE,MAAMK,QAAU,QAG/B,IAAIoiE,EAAcxpE,SAASC,cAAc,MACzCupE,EAAYhiE,aAAa,OAAQ,WAEjC,IAAIiiE,EAAc,WACd9/C,EAAK+/C,SAAS9rE,KAAK+nB,aAAa,qBAGpC68C,EAAS5kE,KAAK2iE,aAAa,SAAUt1D,EAAMtR,GACzC,IAAIgwE,EAAa3pE,SAASC,cAAc,MACpC2pE,EAAa5pE,SAASC,cAAc,KAExC0pE,EAAQniE,aAAa,OAAQ,gBAC7BoiE,EAAWpiE,aAAa,OAAQ,OAEhCoiE,EAAW7mE,QAAU0mE,EAEjB9vE,IAAOkrE,EAAcvhB,KAAK,IAC5BsmB,EAAWhwB,UAAY,UAGzBwuB,EAAmBwB,GACnBA,EAAWzkE,UAAY,SACvBykE,EAAWpiE,aAAa,kBAAmByD,EAAKq4C,MAEhDqmB,EAAQ5pE,YAAY6pE,GACpBJ,EAAYzpE,YAAY4pE,MAG1BN,EAAatpE,YAAYypE,GAEzBF,EAAc1vB,UAAY,oBAES,IAA/Bh8C,KAAK4iE,SAASgB,eAChB8H,EAAcviE,MAAMK,QAAU,QAEhC,IAAIyiE,EAAc7pE,SAASC,cAAc,OACzC4pE,EAAYjwB,UAAY,sBACxBiwB,EAAYriE,aAAa,OAAQ,YACjCqiE,EAAYriE,aAAa,gBAAiB,GAC1CqiE,EAAYriE,aAAa,gBAAiB,KAC1CqiE,EAAYriE,aAAa,gBAAiB0hE,EAAanwE,KAAK6E,OAC5DisE,EAAY9iE,MAAMmhE,QAAU,SAAWgB,EAAanwE,KAAK6E,MAAQ,KAEjE0rE,EAAcvpE,YAAY8pE,GAE1BN,EAAa3vB,UAAY,0BACS,IAA9Bh8C,KAAK4iE,SAASc,cAChBiI,EAAaxiE,MAAMK,QAAU,QAG/Bu+D,EAAa/rB,UAAY,kBACzB+rB,EAAa5lE,YAAYqpE,GACzBzD,EAAa5lE,YAAYspE,GACzB1D,EAAa5lE,YAAYupE,GAGzB,IAAIzD,EAAoB7lE,SAASC,cAAc,SACT,IAAlCrC,KAAK4iE,SAASY,kBAChByE,EAAkBjsB,UAAY,4BAC9BisB,EAAkB1gE,UAAY0/D,EAAcvhB,KAC5C+hB,EAAetlE,YAAY8lE,IAG7BF,EAAa5lE,YAAY6lE,GACzBP,EAAetlE,YAAY4lE,IAG3B4C,EAAoBvoE,SAASC,cAAc,MAEzB8C,QAAU,WACtB4mB,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cACvCT,EAAUnqE,KAAK4wB,IAInBy+C,EAAmBG,GACnBA,EAAkBpjE,UAAYvH,KAAK4iE,SAASC,WAG5C+H,EAAoBxoE,SAASC,cAAc,MAEzB8C,QAAU,WACA,IAAtB4mB,EAAKg6C,cACPF,EAAc1qE,KAAK4wB,IAIvBy+C,EAAmBI,GACnBA,EAAkBrjE,UAAYvH,KAAK4iE,SAASE,WAG5C+H,EAAoBzoE,SAASC,cAAc,MACzB25C,UAAYh8C,KAAK4iE,SAAS0B,YAAc,uBAC1DkG,EAAmBK,GACnBA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,UAE5C8H,EAAkB1lE,QAAU,WACtB4mB,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cAAyD,mBAAjCh6C,EAA2B,wBAC1FA,EAAKi6C,uBAAuB7qE,KAAK4wB,GAG/BA,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cAAqD,mBAA7Bh6C,EAAuB,oBACtFA,EAAK+7C,mBAAmB3sE,KAAK4wB,GAGS,mBAA7BA,EAAuB,oBAChCA,EAAKmgD,mBAAmB/wE,KAAK4wB,GAG/Bk6C,EAAW9qE,KAAK4wB,EAAMA,EAAK22C,iBAG7BiJ,EAAaxpE,YAAY0oE,GAGrB7qE,KAAK2iE,YAAYrmE,OAAS,IAC5BqvE,EAAaxpE,YAAYyoE,GACzBe,EAAaxpE,YAAYwoE,IAG3B5C,EAAa5lE,YAAYwpE,GAGzB5E,EAAc5rE,KAAK4wB,EAAMk7C,EAAcliE,QAASgjE,EAAcC,EAAYC,GAG1EsD,EAAUpwE,KAAK6E,KAAMinE,EAAczgD,SAAUygD,EAAec,GAM9D,IAAIL,EAA0B37C,EAAK22C,eAAelQ,cAAc,+BAC5DkV,GACFA,EAAwB7hE,WAAW/E,YAAY4mE,GAI7CT,EAAchD,oBAChBsG,EAAoBpvE,KAAK4wB,GAID,IAAtB/rB,KAAK+lE,cAAsB/lE,KAAK2iE,YAAYrmE,OAAS,GACnD,MAAOuuE,IACTA,EAAkB7uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOqG,IACTA,EAAkB3uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,wBAG7B,IAA3BtkE,KAAK4iE,SAASK,UACZ,MAAO2H,IACTA,EAAkB5uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,sCAExD,MAAOqG,GACT9B,EAAU8B,EAAmB,uBAG3B,MAAOC,IACTA,EAAkB5uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,wCAI1D,MAAOuG,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,YAErC/iE,KAAK2iE,YAAYrmE,OAAS,IAAM0D,KAAK+lE,cAA4C,IAA5B/lE,KAAK2iE,YAAYrmE,QAE3E,MAAOuuE,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASI,UAE5C6F,EAAUgC,EAAmB,uBAE3B,MAAOD,IACTA,EAAkB5uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,wBAG7B,IAA3BtkE,KAAK4iE,SAASM,UACZ,MAAOyH,IACTA,EAAkB3uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,sCAExD,MAAOsG,GACT/B,EAAU+B,EAAmB,uBAG3B,MAAOD,IACTA,EAAkB3uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,0CAK1D,MAAOuG,IACTA,EAAkB7uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOsG,IACTA,EAAkB5uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOqG,IACTA,EAAkB3uB,UAAYh8C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOuG,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,YAIhD6H,EAAkBhhE,aAAa,OAAQ,UACvC+gE,EAAkB/gE,aAAa,OAAQ,UACvCihE,EAAkBjhE,aAAa,OAAQ,UAGnC,MAAO+gE,GACTA,EAAkBjgE,QAuEtB,SAAyBu8D,GACvB,IAAIkF,EAGJ,GAAIlF,EAAcliE,mBAAmBqnE,WAGnC,IAFAD,EAAYlF,EAAcliE,QAAQc,WAEU,OAArCohE,EAAcliE,QAAQc,YACtBsmE,EAAU3mD,SAA+C,SAApC2mD,EAAU3mD,QAAQjkB,eAEJ,QAApC4qE,EAAU3mD,QAAQjkB,eACpBsnE,EAAUsD,EAAW,gDAGvBA,EAAYA,EAAUtmE,WAI1BgjE,EAAU5B,EAAcliE,QAAS,uBAEjC,IAAIsnE,EAAyBC,EAAcrF,EAAcliE,QAAS,YACnC,aAA3BsnE,GAC2B,aAA3BA,GAC2B,UAA3BA,GAEFxD,EAAU5B,EAAcliE,QAAS,4BAGnConE,EAAYlF,EAAcliE,QAAQc,WAClC,KAAqB,OAAdsmE,GACAA,EAAU3mD,SAA+C,SAApC2mD,EAAU3mD,QAAQjkB,eADnB,CAKzB,IAAIgrE,EAASD,EAAcH,EAAW,WAClC5E,EAAUjgB,WAAWglB,EAAcH,EAAW,YAC9Cn/B,EAAYs/B,EAAcH,EAAW,cAAgBG,EAAcH,EAAW,sBAAwBG,EAAcH,EAAW,mBAAqBG,EAAcH,EAAW,kBAAoBG,EAAcH,EAAW,iBAC1N,SAAS3vE,KAAK+vE,IAAWhF,EAAU,GAAoB,SAAdv6B,QAAsC3tC,IAAd2tC,IACnE67B,EAAUsD,EAAW,qBAGvBA,EAAYA,EAAUtmE,YA7GxB2mE,CAAgBvF,QAEgC,IAApCjnE,KAA8B,2BACxCA,KAAKysE,0BAA0BtxE,KAAK6E,KAAMinE,EAAcliE,SAa5D,SAASwmE,EAAU/kD,EAAUygD,EAAec,GAE1C,IAAIt8B,EADJ,GAAiB,QAAbjlB,IAGCxmB,KAAK4iE,SAASiB,kBAGjBp4B,EADe,YAAbjlB,EACKuhD,EAAa74D,wBAEb+3D,EAAcliE,QAAQmK,yBAoVjC,SAA4BvF,GAC1B,IAAI8hC,EAAO9hC,EAAGuF,wBAEd,OACEu8B,EAAKriC,KAAO,GACZqiC,EAAKt8B,MAAQ,GACZs8B,EAAK/Q,OAAO,IAAO96B,OAAO8sE,aAC3BjhC,EAAKkiB,OAAS/tD,OAAO+sE,WAxVlBC,CAAmB3F,EAAcliE,WAAU,CAC9C,IAAI8nE,EAAYjE,IAAcl/D,OACpB+hC,EAAK/Q,QAAU+Q,EAAK/Q,OAAS+Q,EAAKriC,KAMlC,GAAK69D,EAAcliE,QAAQmF,aAAe2iE,EAClDjtE,OAAOktE,SAAS,EAAGrhC,EAAKriC,KAAQyjE,EAAY,EAAOphC,EAAK/hC,OAAS,GAAM1J,KAAK4iE,SAASkB,eAIrFlkE,OAAOktE,SAAS,EAAGrhC,EAAKriC,KAAQyjE,EAAY,EAAOphC,EAAK/hC,OAAS,GAAM1J,KAAK4iE,SAASkB,gBAW3F,SAAS8D,IAGPhD,EAFWxiE,SAAS40D,iBAAiB,yBAEtB,SAAU+V,GACvBlF,EAAakF,EAAK,yBAiEtB,SAASnI,EAAS1+C,EAAK8mD,EAAYC,GAEjC,GAAI/mD,EACF,IAAK,IAAInqB,EAAI,EAAGyK,EAAM0f,EAAI5pB,OAAQP,EAAIyK,EAAKzK,IACzCixE,EAAW9mD,EAAInqB,GAAIA,GAIK,mBAAlB,GACRkxE,IAYJ,IACMlzD,EADFmzD,GACEnzD,EAAO,GACJ,SAAgB9e,EAAK+a,GAc1B,OARA+D,EAHA/D,EAAMA,GAAO,iBAGD+D,EAAK/D,IAAQ,OAGR3W,IAAbpE,EAAI+a,KAEN/a,EAAI+a,GAAO+D,EAAK/D,MAGX/a,EAAI+a,KAYXuvD,EAuEK,IAtEP,WACE,IAAI4H,EAAa,gBAWjBntE,KAAKotE,IAAM,SAAUnyE,EAAKmI,EAAMiqE,EAAUl0B,GACxC,OAAO/1C,EAAO8pE,EAAOG,IAAal0B,EAAU,IAAM+zB,EAAO/zB,GAAW,KAatEn5C,KAAKwlE,GAAK,SAAUvqE,EAAKmI,EAAMiqE,EAAUl0B,EAASm0B,GAChD,IAAI1uE,EAAKoB,KAAKotE,IAAIhwE,MAAM4C,KAAM9C,WAC1BqwE,EAAU,SAAU7uE,GAClB,OAAO2uE,EAASlyE,KAAKg+C,GAAWl+C,EAAKyD,GAAKkB,OAAOwlB,QAGnD,qBAAsBnqB,EACxBA,EAAI6O,iBAAiB1G,EAAMmqE,EAASD,GAC3B,gBAAiBryE,GAC1BA,EAAIm9D,YAAY,KAAOh1D,EAAMmqE,GAG/BtyE,EAAIkyE,GAAclyE,EAAIkyE,IAAe,GACrClyE,EAAIkyE,GAAYvuE,GAAM2uE,GAaxBvtE,KAAKuI,IAAM,SAAUtN,EAAKmI,EAAMiqE,EAAUl0B,EAASm0B,GACjD,IAAI1uE,EAAKoB,KAAKotE,IAAIhwE,MAAM4C,KAAM9C,WAC1BqwE,EAAUtyE,EAAIkyE,IAAelyE,EAAIkyE,GAAYvuE,GAE5C2uE,IAID,wBAAyBtyE,EAC3BA,EAAIsP,oBAAoBnH,EAAMmqE,EAASD,GAC9B,gBAAiBryE,GAC1BA,EAAIshE,YAAY,KAAOn5D,EAAMmqE,GAG/BtyE,EAAIkyE,GAAYvuE,GAAM,QAgB5B,SAASiqE,EAAU9jE,EAASi3C,GAC1B,GAAIj3C,aAAmBqnE,WAAY,CAEjC,IAAIoB,EAAMzoE,EAAQgjB,aAAa,UAAY,GAE3ChjB,EAAQ6E,aAAa,QAAS4jE,EAAM,IAAMxxB,OACrC,CACL,QAA0B38C,IAAtB0F,EAAQlD,UAGV+iE,EADc5oB,EAAU7/C,MAAM,MACZ,SAAUoV,GAC1BxM,EAAQlD,UAAUE,IAAKwP,WAEfxM,EAAQi3C,UAAU3kC,MAAO2kC,KAEnCj3C,EAAQi3C,WAAa,IAAMA,IAcjC,SAAS6rB,EAAa9iE,EAAS0oE,GAC7B,GAAI1oE,aAAmBqnE,WAAY,CACjC,IAAIoB,EAAMzoE,EAAQgjB,aAAa,UAAY,GAE3ChjB,EAAQ6E,aAAa,QAAS4jE,EAAI/wE,QAAQgxE,EAAgB,IAAIhxE,QAAQ,aAAc,UAEpFsI,EAAQi3C,UAAYj3C,EAAQi3C,UAAUv/C,QAAQgxE,EAAgB,IAAIhxE,QAAQ,aAAc,IAc5F,SAAS6vE,EAAevnE,EAAS2oE,GAC/B,IAAIC,EAAY,GAQhB,OAPI5oE,EAAQ6oE,aACVD,EAAY5oE,EAAQ6oE,aAAaF,GACxBtrE,SAASyrE,aAAezrE,SAASyrE,YAAY7jB,mBACtD2jB,EAAYvrE,SAASyrE,YAAY7jB,iBAAiBjlD,EAAS,MAAM6uD,iBAAiB8Z,IAIhFC,GAAaA,EAAUpsE,YAClBosE,EAAUpsE,cAEVosE,EAYX,SAAStD,EAAUtlE,GACjB,IAAIvG,EAAIuG,EAAQc,WAEhB,SAAKrH,GAAoB,SAAfA,EAAEg5D,YAI+B,UAAvC8U,EAAcvnE,EAAS,aAIpBslE,EAAS7rE,IAWlB,SAASoqE,IACP,QAA0BvpE,IAAtBO,OAAO+sE,WACT,MAAO,CAAEv9C,MAAOxvB,OAAO+sE,WAAYjjE,OAAQ9J,OAAO8sE,aAElD,IAAIoB,EAAI1rE,SAAS2rE,gBACjB,MAAO,CAAE3+C,MAAO0+C,EAAEE,YAAatkE,OAAQokE,EAAE5jE,cA8B7C,SAASm7D,EAAiBb,GACxB,IAAI8C,EAAellE,SAASC,cAAc,OACtC4rE,EAAY,GACZliD,EAAO/rB,KAMX,GAHAsnE,EAAatrB,UAAY,kBAGpBwoB,EAAUh/C,SAA+C,SAApCg/C,EAAUh/C,QAAQjkB,cAGrC,CAEL,IAAI4oE,EAAkBxB,EAAWnE,GAC7B2F,IACF8D,GAAa,UAAY9D,EAAgB/6C,MAAQ,cAAgB+6C,EAAgBzgE,OAAS,WAAaygE,EAAgB/gE,IAAM,YAAc+gE,EAAgBh7D,KAAO,MAClKm4D,EAAan+D,MAAMmhE,QAAU2D,QAP/BA,GAAa,sDACb3G,EAAan+D,MAAMmhE,QAAU2D,EAuB/B,OAbAzJ,EAAUriE,YAAYmlE,GAEtBA,EAAaniE,QAAU,YACoB,IAArC4mB,EAAK62C,SAASW,oBAChB0C,EAAW9qE,KAAK4wB,EAAMy4C,IAI1B5kE,OAAOL,YAAW,WAChB0uE,GAAa,YAAcliD,EAAK62C,SAASmB,eAAe3iE,WAAa,IACrEkmE,EAAan+D,MAAMmhE,QAAU2D,IAC5B,KAEI,EAST,SAASC,IACP,IAAIC,EAAU/rE,SAASowD,cAAc,0BAErC,GAAI2b,EAAS,CACX,IAAIzoB,EAAOyoB,EAAQpmD,aAAa,aAEhC,OADAomD,EAAQtoE,WAAW/E,YAAYqtE,GACxBzoB,GAWX,SAAS0oB,EAAe5J,GAItB,GAFAxkE,KAAK2iE,YAAc,GAEf3iE,KAAK4iE,SAASyL,MAChBzJ,EAAS5kE,KAAK4iE,SAASyL,MAAO,SAAUja,GACtC,IAAIyQ,EAAcC,EAAa1Q,GAEK,iBAAzByQ,EAAmB,UAE5BA,EAAY9/D,QAAU3C,SAASowD,cAAcqS,EAAY9/D,UAG3D8/D,EAAYV,aAAeU,EAAYV,cAAgBnkE,KAAK4iE,SAASuB,aACrEU,EAAYR,cAAgBQ,EAAYR,eAAiBrkE,KAAK4iE,SAASyB,cAE3C,OAAxBQ,EAAY9/D,SACd/E,KAAK2iE,YAAYxlE,KAAK0nE,IAExBz/D,KAAKpF,WACF,CACL,IAAIquE,EAAQ7J,EAAUxN,iBAAiB,gBAEvC,IAAKqX,IAAUA,EAAM/xE,OACnB,OAAO,EAITsoE,EAASyJ,EAAO,SAAUrJ,GAExB,IAAIX,EAAgBW,EAAej9C,aAAa,sBAG9Cs8C,EADEA,EACiC,SAAlBA,EAEDrkE,KAAK4iE,SAASyB,cAGhCrkE,KAAK2iE,YAAYxlE,KAAK,CACpB4H,QAASigE,EACT5Q,KAAM4Q,EAAej9C,aAAa,aAClCo8C,aAAca,EAAej9C,aAAa,sBAAwB/nB,KAAK4iE,SAASuB,aAChFE,cAAeA,EACfjB,aAAc4B,EAAej9C,aAAa,qBAC1C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,mBAE1E/9D,KAAKpF,OAGTsuE,EAAUnzE,KAAK6E,MAMfulE,EAASC,GAAGpjE,SAAU,QAAS8rE,EAAoBluE,MAAM,GACzDulE,EAASC,GAAG5lE,OAAQ,SAAUonE,EAAehnE,MAAM,GASrD,SAASgnE,IACPpC,EAAS5kE,KAAK2iE,YAAa,SAAUt1D,QACA,IAAxBA,EAAkB,eAI7BkhE,EAAmBpzE,KAAK6E,KAAMqN,EAAK82D,aAAc92D,EAAKtI,QAASsI,EAAK45D,gBACpE7hE,KAAKpF,OAST,SAASwuE,EAAsBC,GAC7B,IAAIC,EAAetsE,SAASowD,cAAc,kBAC1C,OAAO,EAAiBkc,EAAa1X,iBAAiByX,GAAY,GASpE,SAASE,EAAUC,GACjB,IAAIxa,EAAOoa,EAAsB,4BAA8BI,EAAS,MAAM,GAE9EV,EAAmB/yE,KAAK6E,MAEpBo0D,GACFyU,EAAUzU,EAAM,yBAIuB,IAA7Bp0D,KAAuB,oBACjCA,KAAK6uE,mBAAmB1zE,KAAK6E,KAAM4uE,GAUvC,SAASE,IAGPlK,EAFY4J,EAAsB,iBAElB,SAAUpa,GACxBua,EAAUxzE,KAAK6E,KAAMo0D,EAAKrsC,aAAa,eACvC3iB,KAAKpF,OAST,SAAS+uE,IACP,IAAIV,EAAQG,EAAsB,iBAE9BH,GAASA,EAAM/xE,OACjBsoE,EAASyJ,EAAO,SAAUja,GACxB4a,EAAU7zE,KAAK6E,KAAMo0D,EAAKrsC,aAAa,eACvC3iB,KAAKpF,OAEPouE,EAAejzE,KAAK6E,KAAMA,KAAK0iE,gBAUnC,SAASsM,EAAUJ,GACjB,IAAIxa,EAAOoa,EAAsB,4BAA8BI,EAAS,MAAM,GAE1Exa,GACFyT,EAAazT,EAAM,qBAWvB,SAAS6a,IAGPrK,EAFY4J,EAAsB,iBAElB,SAAUpa,GACxB8a,EAAY/zE,KAAK6E,KAAMo0D,EAAKrsC,aAAa,eACzC3iB,KAAKpF,OAWT,SAASkvE,EAAYN,GACnB,IAAIxa,EAAOoa,EAAsB,4BAA8BI,EAAS,MAAM,GAE1Exa,GACFA,EAAKvuD,WAAW/E,YAAYszD,GAUhC,SAASka,IACP,IAAIviD,EAAO/rB,KAEP0uE,EAAetsE,SAASowD,cAAc,kBAErB,OAAjBkc,KACFA,EAAetsE,SAASC,cAAc,QACzB25C,UAAY,iBAyB3B4oB,EAAS5kE,KAAK2iE,YAAa,SAASt1D,EAAMtR,GAExC,IAAIqG,SAASowD,cAAc,4BAA8Bz2D,EAAI,MAA7D,CAIA,IAAIq4D,EAAOhyD,SAASC,cAAc,KAClCmoE,EAAmBpW,GAEnBA,EAAKjvD,QAzBY,SAAUpJ,GAC3B,OAAO,SAAS2C,GACd,IAAIywE,EAAMzwE,GAAQkB,OAAOwlB,MAErB+pD,EAAIlvE,iBACNkvE,EAAIlvE,kBAGmB,OAArBkvE,EAAIC,eACND,EAAIC,cAAe,GAGrBC,EAAgBl0E,KAAK4wB,EAAMhwB,IAaduzE,CAAavzE,GAE5Bq4D,EAAKpY,UAAY,eAEZ3uC,EAAKg3D,eACRwE,EAAUzU,EAAM,wBAIdiW,EAASh9D,EAAKtI,UAChB8jE,EAAUzU,EAAM,qBAGlB,IAAImb,EAAUntE,SAASC,cAAc,OACrCktE,EAAQvzB,UAAY,mBACpB,IAAIwzB,EAAYptE,SAASC,cAAc,OACvCmtE,EAAUxzB,UAAY,qBAEtBoY,EAAKjyD,YAAYotE,GACjBnb,EAAKjyD,YAAYqtE,GACjBpb,EAAKxqD,aAAa,YAAa7N,GAI/BsR,EAAK45D,cAAgB55D,EAAKtI,QAC1BsI,EAAKtI,QAAUqvD,EAGfma,EAAmBpzE,KAAK6E,KAAMqN,EAAK82D,aAAc/P,EAAM/mD,EAAK45D,eAE5DyH,EAAavsE,YAAYiyD,KACzBhvD,KAAKpF,OAGPoC,SAASuuD,KAAKxuD,YAAYusE,QAGgB,IAA9B1uE,KAAwB,qBAClCA,KAAKyvE,oBAAoBt0E,KAAK6E,MAalC,SAASuuE,EAAmBtiE,EAAUmoD,EAAMrvD,GAE1C,IAAIyD,EAASmgE,EAAWxtE,KAAK6E,KAAM+E,GAKnC,OAAQkH,GACN,QACA,IAAK,WACHmoD,EAAKjrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCilD,EAAKjrD,MAAMC,IAAMZ,EAAOY,IAAM,KAC9B,MACF,IAAK,YACHgrD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MAX5B,GAWiD,KAC7DglC,EAAKjrD,MAAMC,IAAMZ,EAAOY,IAAM,KAC9B,MACF,IAAK,cACHgrD,EAAKjrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCilD,EAAKjrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAfzB,GAegD,KAC7D,MACF,IAAK,eACH0qD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MAnB5B,GAmBiD,KAC7DglC,EAAKjrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAnBzB,GAmBgD,KAC7D,MACF,IAAK,cACH0qD,EAAKjrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCilD,EAAKjrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OAvB1B,IAuBiD,EAAK,KACnE,MACF,IAAK,eACH0qD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MA3B5B,GA2BiD,KAC7DglC,EAAKjrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OA3B1B,IA2BiD,EAAK,KACnE,MACF,IAAK,gBACH0qD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MA/B7B,IA+BkD,EAAK,KACnEglC,EAAKjrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OA/B1B,IA+BiD,EAAK,KACnE,MACF,IAAK,gBACH0qD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MAnC7B,IAmCkD,EAAK,KACnEglC,EAAKjrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAnCzB,GAmCgD,KAC7D,MACF,IAAK,aACH0qD,EAAKjrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MAvC7B,IAuCkD,EAAK,KACnEglC,EAAKjrD,MAAMC,IAAMZ,EAAOY,IAAM,MAYpC,SAASimE,EAAgBT,GACvB,IAAIc,EAActtE,SAASowD,cAAc,4BAA8Boc,EAAS,MAC5EvhE,EAAOrN,KAAK2iE,YAAYiM,QAGa,IAA7B5uE,KAAuB,oBACjCA,KAAK2vE,mBAAmBx0E,KAAK6E,KAAM0vE,EAAariE,EAAMuhE,GAIxD,IAAIgB,EAAc1B,EAAmB/yE,KAAK6E,MAG1C,GAAIyI,SAASmnE,EAAa,MAAQhB,EAAlC,CAIA,IAAI7G,EAAe3lE,SAASC,cAAc,OACtCmpE,EAAmBppE,SAASC,cAAc,OAC1C2lE,EAAa5lE,SAASC,cAAc,OACpColE,EAAiBrlE,SAASC,cAAc,OAE5C0lE,EAAa/rB,UAAY,kBAEzB+rB,EAAa5iE,QAAU,SAAUzG,GAE3BA,EAAEuB,gBACJvB,EAAEuB,kBAIFvB,EAAE0wE,cAAe,GAIrB5D,EAAiBxvB,UAAY,sBAE7B,IAAI6zB,EAAiBztE,SAASC,cAAc,KAC5CwtE,EAAetoE,UAAY8F,EAAK+mD,KAEhC,IAAI0b,EAAc1tE,SAASC,cAAc,KACzCytE,EAAY9zB,UAAYh8C,KAAK4iE,SAAS0B,YACtCwL,EAAYlmE,aAAa,OAAQ,UACjCkmE,EAAYvoE,UAAYvH,KAAK4iE,SAASwB,gBACtC0L,EAAY3qE,QAAUwpE,EAAUvpE,KAAKpF,KAAM4uE,GAE3CpD,EAAiBrpE,YAAY0tE,GAC7BrE,EAAiBrpE,YAAY2tE,GAE7B9H,EAAWhsB,UAAY,gBACvB+rB,EAAa5lE,YAAY6lE,GAEzBD,EAAa5lE,YAAYqpE,GAGzBxrE,KAAK+lE,aAAe2J,EAAY3nD,aAAa,aAG7C0/C,EAAezrB,UAAY,sDAC3ByrB,EAAe79D,aAAa,YAAa8lE,EAAY3nD,aAAa,cAClE4+C,EAAwBxrE,KAAK6E,KAAMynE,GAEnCA,EAAetlE,YAAY4lE,GAC3B3lE,SAASuuD,KAAKxuD,YAAYslE,GAG1BV,EAAc5rE,KAAK6E,KAAM0vE,EAAa3H,EAAcC,EAAY,MAAM,IAYxE,SAASW,EAAW5jE,GAClB,IAAI4rD,EAAOvuD,SAASuuD,KAChBof,EAAQ3tE,SAAS2rE,gBACjB5R,EAAYv8D,OAAOowE,aAAeD,EAAM5T,WAAaxL,EAAKwL,UAC1DjS,EAAatqD,OAAOqwE,aAAeF,EAAM7lB,YAAcyG,EAAKzG,WAC5D95B,EAAIrrB,EAAQmK,wBAChB,MAAO,CACL9F,IAAKgnB,EAAEhnB,IAAM+yD,EACb/sC,MAAOgB,EAAEhB,MACT1lB,OAAQ0mB,EAAE1mB,OACVyF,KAAMihB,EAAEjhB,KAAO+6C,GAWnB,SAASihB,EAAiBpmE,GACxB,IAAIoE,EAAQvJ,OAAOoqD,iBAAiBjlD,GAChCmrE,EAA0C,aAAnB/mE,EAAM8C,SAC7BkkE,EAAgB,gBAEpB,GAAuB,UAAnBhnE,EAAM8C,SAAsB,OAAO7J,SAASuuD,KAEhD,IAAK,IAAIrgD,EAASvL,EAAUuL,EAASA,EAAO8/D,eAE1C,GADAjnE,EAAQvJ,OAAOoqD,iBAAiB15C,KAC5B4/D,GAA0C,WAAnB/mE,EAAM8C,WAG7BkkE,EAAc3zE,KAAK2M,EAAMknE,SAAWlnE,EAAMmnE,UAAYnnE,EAAMonE,WAAY,OAAOjgE,EAGrF,OAAOlO,SAASuuD,KAUlB,SAASya,EAAwB96D,EAAQvL,GACvCuL,EAAO6rD,UAAYp3D,EAAQyrE,UAAYlgE,EAAOkgE,UAUhD,SAASlF,IAGP,OADkB7iE,SAAUzI,KAAK+lE,aAAe,EAAI,IAC7B/lE,KAAK2iE,YAAYrmE,OAAU,IAmBpD,IAAIimE,EAAU,SAAUiC,GACtB,IAAIiM,EAEJ,GAA2B,iBAAhB,EAETA,EAAW,IAAIhO,EAAQ+B,QAElB,GAA2B,iBAAhB,EAA0B,CAE1C,IAAIyC,EAAgB7kE,SAASowD,cAAcgS,GAE3C,IAAIyC,EAGF,MAAM,IAAIxpE,MAAM,4CAFhBgzE,EAAW,IAAIhO,EAAQwE,QAKzBwJ,EAAW,IAAIhO,EAAQrgE,SAASuuD,MAOlC,OAFA4R,EAAQmO,UAAWxD,EAAOuD,EAAU,qBAAwBA,EAErDA,GAiMT,OAxLAlO,EAAQ51C,QAvwEM,QA+wEd41C,EAAQmO,UAAY,GAGpBnO,EAAQz2B,GAAK22B,EAAQ9nE,UAAY,CAC/Bs5C,MAAO,WACL,OAAO,IAAIwuB,EAAQziE,OAErB2wE,UAAW,SAASC,EAAQrzE,GAE1B,OADAyC,KAAK4iE,SAASgO,GAAUrzE,EACjByC,MAET6wE,WAAY,SAAStqD,GAEnB,OADAvmB,KAAK4iE,SA7DT,SAAuBkO,EAAKC,GAC1B,IACEC,EADEC,EAAO,GAEX,IAAKD,KAAYF,EAAQG,EAAKD,GAAYF,EAAKE,GAC/C,IAAKA,KAAYD,EAAQE,EAAKD,GAAYD,EAAKC,GAC/C,OAAOC,EAwDWC,CAAclxE,KAAK4iE,SAAUr8C,GACtCvmB,MAETsqB,MAAO,SAAUtY,GAEf,OADAuyD,EAAiBppE,KAAK6E,KAAMA,KAAK0iE,eAAgB1wD,GAC1ChS,MAET8rE,SAAU,SAASpmB,GAEjB,OADAygB,EAAUhrE,KAAK6E,KAAM0lD,GACd1lD,MAETmxE,QAAS,SAAS5qD,GAOhB,OANKvmB,KAAK4iE,SAAS+B,QACjB3kE,KAAK4iE,SAAS+B,MAAQ,IAGxB3kE,KAAK4iE,SAAS+B,MAAMxnE,KAAKopB,GAElBvmB,MAEToxE,SAAU,SAASzM,GACjB,GAAKA,EAAMroE,OAAX,CAEA,IAAI,IAAIsB,EAAQ,EAAGA,EAAQ+mE,EAAMroE,OAAQsB,IACvCoC,KAAKmxE,QAAQxM,EAAM/mE,IAGrB,OAAOoC,OAETqxE,eAAgB,SAAS3rB,GAGvB,OAFA0gB,EAAgBjrE,KAAK6E,KAAM0lD,GAEpB1lD,MAETklE,SAAU,WAER,OADAI,EAAUnqE,KAAK6E,MACRA,MAETsxE,aAAc,WAEZ,OADAzL,EAAc1qE,KAAK6E,MACZA,MAETuxE,KAAM,SAASrK,GAEb,OADAjB,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,eAAgBwE,GACpClnE,MAET2lE,QAAS,WAEP,OADAe,EAASvrE,KAAK6E,MACPA,MAETwxE,eAAgB,SAASC,GACvB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,2DAElB,OAJEuC,KAAKwmE,2BAA6BiL,EAI7BzxE,MAET0xE,SAAU,SAASD,GACjB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,sDAElB,OAJEuC,KAAK0qE,qBAAuB+G,EAIvBzxE,MAET2xE,cAAe,SAASF,GACtB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKysE,0BAA4BgF,EAI5BzxE,MAET4xE,WAAY,SAASH,GACnB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,wDAElB,OAJEuC,KAAKgmE,uBAAyByL,EAIzBzxE,MAET6xE,aAAc,SAASJ,GACrB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKyvE,oBAAsBgC,EAItBzxE,MAET8xE,YAAa,SAASL,GACpB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,yDAElB,OAJEuC,KAAK2vE,mBAAqB8B,EAIrBzxE,MAET+xE,YAAa,SAASN,GACpB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,yDAElB,OAJEuC,KAAK6uE,mBAAqB4C,EAIrBzxE,MAETgyE,OAAQ,SAASP,GACf,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,oDAElB,OAJEuC,KAAK8nE,mBAAqB2J,EAIrBzxE,MAETiyE,OAAQ,SAASR,GACf,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,oDAElB,OAJEuC,KAAKksE,mBAAqBuF,EAIrBzxE,MAETkyE,aAAc,SAAST,GACrB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKonE,yBAA2BqK,EAI3BzxE,MAETmyE,SAAU,WAER,OADA/D,EAAejzE,KAAK6E,KAAMA,KAAK0iE,gBACxB1iE,MAEToyE,SAAU,SAAUxD,GAElB,OADAD,EAAUxzE,KAAK6E,KAAM4uE,GACd5uE,MAETqyE,UAAW,WAET,OADAvD,EAAW3zE,KAAK6E,MACTA,MAETsyE,SAAU,SAAU1D,GAElB,OADAI,EAAU7zE,KAAK6E,KAAM4uE,GACd5uE,MAETuyE,UAAW,WAET,OADAxD,EAAW5zE,KAAK6E,MACTA,MAETwyE,YAAa,WAEX,OADAvD,EAAa9zE,KAAK6E,MACXA,MAETyyE,WAAY,SAAU7D,GAEpB,OADAM,EAAY/zE,KAAK6E,KAAM4uE,GAChB5uE,MAET0yE,eAAgB,SAAU9D,GAExB,OADAS,EAAgBl0E,KAAK6E,KAAM4uE,GACpB5uE,OAIJuiE,KAUTxoE,EAAO,aAAa,CAAC,YAAa,KAAM,OAAQ,OAAQ,SAAU,gBAC3D,SAAS44E,EAAYtxD,EAASuxD,EAAWrkE,EAAWwJ,EAAUW,GAGnE,MAAM/V,EAAQ9C,MAAM6C,OAGpBC,EAAIuf,WAAavf,EAAIuf,YAAc,QACnCvf,EAAIwf,WAAaxf,EAAIwf,YAAc,OACnCxf,EAAIyf,WAAazf,EAAIyf,YAAc,OACnCzf,EAAI0f,WAAa1f,EAAI0f,YAAc,OACnC1f,EAAI2f,iBAAmB3f,EAAI2f,kBAAoB,SAG/C3f,EAAI4f,UAAY5f,EAAI4f,WAAa,+LAGjC5f,EAAI6f,WAAa7f,EAAI6f,YAAc,0DAA6D7f,EAAI2e,cAAgB,KACpH3e,EAAI8f,eAAiB9f,EAAI8f,gBAAkB,oBAC3C9f,EAAI+f,cAAiB/f,EAAI+f,eAAiB,iGAC1C/f,EAAIggB,YAAchgB,EAAIggB,aAAe,gBACrChgB,EAAIigB,YAAcjgB,EAAIigB,aAAe,2BACrCjgB,EAAIkgB,aAAelgB,EAAIkgB,cAAgB,0CACvClgB,EAAImgB,aAAengB,EAAImgB,cAAgB,mBACvCngB,EAAIogB,aAAepgB,EAAIogB,cAAe,qFACtCpgB,EAAIsgB,UAAYtgB,EAAIsgB,WAAa,oCACjCtgB,EAAIqgB,aAAergB,EAAIqgB,cAAgB,8DACvCrgB,EAAIugB,YAAcvgB,EAAIugB,aAAe,mBAGrCvgB,EAAIwgB,UAAYxgB,EAAIwgB,WAAa,mCACjCxgB,EAAIygB,aAAezgB,EAAIygB,cAAiB,6CACxCzgB,EAAI0gB,cAAgB1gB,EAAI0gB,eAAiB,UACzC1gB,EAAI2gB,eAAkB3gB,EAAI2gB,gBAAkB,sBAC5C3gB,EAAI4gB,cAAgB5gB,EAAI4gB,eAAiB,WACzC5gB,EAAI6gB,YAAc7gB,EAAI6gB,aAAe,+BACrC7gB,EAAI8gB,WAAa9gB,EAAI8gB,YAAc,uCACnC9gB,EAAI+gB,WAAa/gB,EAAI+gB,YAAc,8BACnC/gB,EAAIghB,UAAYhhB,EAAIghB,WAAa,+DACjChhB,EAAIihB,cAAgBjhB,EAAIihB,eAAiB,uBAGzC,IAAIivD,EAAW,CACX9P,UAAapgE,EAAIuf,WACjB4gD,UAAangE,EAAIwf,WACjB0gD,UAAalgE,EAAIyf,WACjB4gD,UAAargE,EAAI0f,WACjBmhD,iBAAmB,GAInBsP,EAAe,CACfnP,aAAe,EACfI,eAAkB,GAClBR,oBAAsB,EACtBU,oBAAsB,EACtBf,UAAY,EACZD,UAAY,GAGhB,IAAI8P,EAAM3wE,SAEV,MAAM,CAKJ4wE,cAAc,SAASC,GACrB,IAAIhO,EAAQ0N,IACZ1N,EAAM4L,WAAWgC,GACjB5N,EAAM0L,UAAU,eAAgB,iBAMhC1L,EAAM0L,UAAU,YAAahuE,EAAI2f,kBACjC2iD,EAAM4L,WAAWiC,GAGdG,IACDF,EAAME,GAGIF,EAAIvgB,cAAc,YACxBj1D,MAAM,GAIZ,IAAI21E,EAAO,CACT,CACEjO,MAAOtiE,EAAI4f,WAEb,CACExd,QAAS,WACTkgE,MAAOtiE,EAAI6f,WACXvW,SAAU,UAEZ,CACElH,QAAS,QACTkgE,MAAOtiE,EAAI8f,eACXxW,SAAU,UAEZ,CACElH,QAASguE,EAAIvgB,cAAc,sBAC3ByS,MAAOtiE,EAAI+f,cACXzW,SAAU,UAEZ,CACElH,QAAQ,aACRkgE,MAAOtiE,EAAIggB,YACX1W,SAAU,UAEZ,CACElH,QAAQ,WACRkgE,MAAOtiE,EAAIigB,YACX3W,SAAU,UAEZ,CACElH,QAASguE,EAAIvgB,cAAc,cAC3ByS,MAAOtiE,EAAIkgB,aACX5W,SAAU,QAEZ,CACElH,QAASguE,EAAIvgB,cAAc,cAC3ByS,MAAOtiE,EAAImgB,aACX7W,SAAU,UAEZ,CACElH,QAASguE,EAAIvgB,cAAc,aAAa3sD,WACxCo/D,MAAOtiE,EAAIogB,aACX9W,SAAU,UAEZ,CACElH,QAAQ,WACRkgE,MAAOtiE,EAAIqgB,aACX/W,SAAU,UAEZ,CACElH,QAAQ,iBACRkgE,MAAOtiE,EAAIsgB,UACXhX,SAAU,UAEZ,CACElH,QAAS,WACTkgE,MAAOtiE,EAAIugB,YACXjX,SAAU,WA8Ed,OAzEAg5D,EAAM4L,WAAW,CAAClM,MAAOuO,IACzBlzE,KAAKmzE,YAAYD,EAAOjO,GAGxBA,EAAMuM,gBAAe,SAAS4B,GAC5B,OAAOA,EAAgBx0E,IACvB,IAAK,UAMDw0E,EAAgB71E,MAAQoF,EAAI2e,cAC9B,MACF,IAAK,UACH+xD,MAAQN,EAAIvgB,cAAc,cAC1B8gB,IAAMP,EAAIvgB,cAAc,YACxB3yD,MAAMkR,QAAQ3T,MAAMyC,MAAMqV,GAAGhD,QAE7BrS,MAAMqV,GAAGtC,SAASjQ,EAAI4e,cACjB+xD,IAAI9gB,cAAc,aACrB6gB,MAAM12D,QAINsoD,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,cACjDyS,EAAMtC,YAAY,GAAG12D,SAAW,QAMpC,GAAwB,GAArBjM,KAAK+lE,aAAkB,CACVgN,EAAIvgB,cAAc,cACxB71C,QACRsoD,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,cACjDyS,EAAMtC,YAAY,GAAG12D,SAAW,aAIpCg5D,EAAMiN,cAAa,WACZryE,MAAM0zE,KAAK1uE,UAAYhF,MAAM0zE,KAAK1uE,SAAS+G,UAC5C/L,MAAM0zE,KAAK7d,YAIjBuP,EAAMyM,UAAS,SAASzK,GAEtB,OAAOjnE,KAAK+lE,cAEZ,KAAK,EACAlmE,MAAM0zE,KAAK1uE,UACdhF,MAAM0zE,KAAK7d,SAEX,MACF,KAAK,EACH71D,MAAM0zE,KAAKhmE,MAAK,GAChB1N,MAAM0zE,KAAK1uE,SAAS+G,UAAW,EAC/Bq5D,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,mBACjDyS,EAAMtC,YAAY,GAAG12D,SAAW8mE,EAAIvgB,cAAc,UAClD,MACF,KAAK,EACH3yD,MAAM0zE,KAAK7d,aAMfuP,EAAM2M,YAAW,WACf/xE,MAAMo2D,QAAQp7C,IAAI,QAAQ,GAC1Bk4D,EAAI7tD,eAAe,WAAWvI,WAGzBsoD,GAKTuO,cAAe,SAASP,GAEtB,IAAIQ,EAAQd,IACZc,EAAM5C,WAAWiC,GAGdG,IACDF,EAAME,GAER,IAAIS,EAAU,CAEZ,CACE3uE,QAAS,UACTkgE,MAAOtiE,EAAIwgB,UACXlX,SAAU,QAGZ,CACElH,QAASguE,EAAIvgB,cAAc,qBAC3ByS,MAAOtiE,EAAIygB,aACXnX,SAAU,UAGZ,CACElH,QAASguE,EAAIvgB,cAAc,qBAC3ByS,MAAOtiE,EAAI0gB,cACXpX,SAAU,UAGZ,CACElH,QAASguE,EAAIvgB,cAAc,wBAC3ByS,MAAOtiE,EAAI2gB,eACXrX,SAAU,UAGZ,CACElH,QAASguE,EAAIvgB,cAAc,mBAC3ByS,MAAOtiE,EAAI4gB,cACXtX,SAAU,QAGZ,CACElH,QAASguE,EAAIvgB,cAAc,mBAC3ByS,MAAOtiE,EAAI6gB,YACXvX,SAAU,UAGZ,CACElH,QAASguE,EAAIvgB,cAAc,oBAC3ByS,MAAOtiE,EAAI8gB,WACXxX,SAAU,QAGZ,CACElH,QAASguE,EAAIvgB,cAAc,SAC3ByS,MAAOtiE,EAAI+gB,WACXzX,SAAU,UAGZ,CACElH,QAASguE,EAAIvgB,cAAc,mBAC3ByS,MAAOtiE,EAAIghB,UACX1X,SAAU,UAGZ,CACEg5D,MAAOtiE,EAAIihB,gBAuDf,OAnDE6vD,EAAM5C,WAAW,CAAClM,MAAM+O,IACxBD,EAAM5C,WAAWgC,GAEjBY,EAAMvB,cAAa,WACjBryE,MAAMo2D,QAAQp7C,IAAI,QAAQ,MAG5B44D,EAAM9C,UAAU,mBAAmB,GACnC8C,EAAM9C,UAAU,WAAW,WAC3B3wE,KAAKmzE,YAAYO,EAASD,GAG1BA,EAAMjC,gBAAe,SAAS4B,GA0B9B,GAxBwB,GAArBpzE,KAAK+lE,cACNlmE,MAAMo2D,QAAQp7C,IAAI,QAAQ,GAGJ,GAArB7a,KAAK+lE,eACNgN,EAAIvgB,cAAc,qBAAqB71C,QACvC82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,wBACjDihB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGV,GAArBjM,KAAK+lE,eACNgN,EAAIvgB,cAAc,cAAc71C,QAChC82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,mBACjDihB,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,mBACjDihB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGV,GAArBjM,KAAK+lE,eACJgN,EAAIvgB,cAAc,SAAS71C,QAC3B82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,oBACjDihB,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,SACjDihB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGZ,GAArBjM,KAAK+lE,aAAkB,CACxBgN,EAAIvgB,cAAc,SAAS71C,QAC3B,IAAI0pC,EAAWjkD,SAAS40D,iBAAiB,sBAAsB,GAAGA,iBAAiB,MACnF,IAAI,IAAIj7D,EAAI,EAAIA,EAAIsqD,EAAQ/pD,OAAQP,IAClC,GAAIsqD,EAAQtqD,GAAG0oB,WAAa9hB,EAAI6e,eAAgB,CAC9C6kC,EAAQtqD,GAAG4gB,QACX,MAGJ82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIvgB,cAAc,uBAI9CihB,GAKTN,YAAa,SAASxO,EAAOgP,GAE3B,IAAIC,EAASjP,EACTkP,EAAQF,EACZE,EAAMC,UAAYF,EAAOt3E,OAGzBu3E,EAAME,WAAa,GAEnB,IAAI,IAAIh4E,EAAI,EAAGA,EAAG63E,EAAOt3E,OAAQP,IACjC83E,EAAME,WAAW52E,KAAKy2E,EAAO73E,GAAGkpE,YAStClrE,EAAO,iBAAiB,IAAG,WAIzB,IAAIi6E,EAAU,CACZC,QAAY,EACZC,aAAiB,EACjBC,MAAS,EACTC,oCAAsC,EACtCC,UAAc,GAGhB,MAAO,CACLnwE,OAAS,SAAUqL,GACjB,OAAO7U,OAAOwJ,OAAOlE,MAAMoE,MAAMmL,IAInCnL,MAAQ,SAAUmL,GAChB,KAAKA,GAASA,EAAW,MAAMA,EAAU,KAAMA,EAAS,IACtD,MAAM9R,MAAM,4BAEduC,KAAK3E,KAAOkU,EAAW,KACvBvP,KAAKsD,IAAMiM,EAAU,IACrBvP,KAAKpB,GAAK2Q,EAAS,GACnBvP,KAAKs0D,KAAO/kD,EAAW,KACvB,IAAI+kE,EAAQ,IAAIC,IACZC,EAAOjlE,EAAkB,YAqB7B,OApBIilE,GAAQ9oE,MAAMghC,QAAQ8nC,IACxBA,EAAK/tE,SAAQ,SAAUjI,GACjBA,KAAKw1E,EACPM,EAAMvyE,IAAIvD,GAGVqB,MAAMsD,IAAI,EAAG,uCAKnBnD,KAAKs0E,MAAQA,EAGRt0E,KAAK+d,QACR/d,KAAK+d,MAAQ,WACX/d,KAAKy0E,iBAIFz0E,MAMTZ,KAAO,WACL,GAAIY,KAAK00E,MACP,OAAO10E,KAAK00E,MAEd,GAAgC,UAA5B90E,OAAOy3D,SAASsd,UAC4B,GAA5C30E,KAAKsD,IAAI/B,cAAc1D,QAAQ,UAEjC,YADAgC,MAAMsD,IAAI,EAAG,gCAKf,IAAIzE,EAAI0D,SAASC,cAAc,UAU/B,OATA3D,EAAEkL,aAAa,oBAAoB,QACnClL,EAAEkL,aAAa,cAAe,GAE9BlL,EAAEkL,aAAa,UAAW8B,MAAMma,KAAK7lB,KAAKs0E,OAAO9vD,OAAOpoB,KAAI,SAASL,GAAI,MAAO,SAASA,KAAKc,KAAK,MACnG6B,EAAEyK,MAAMO,OAAS,MACjBhL,EAAEkL,aAAa,OAAQ5J,KAAKpB,IAC5BF,EAAEkL,aAAa,MAAO5J,KAAKsD,KAE3BtD,KAAK00E,MAAQh2E,EACNA,GAMTk2E,QAAU,SAAUx6D,GACLpa,KAAKZ,OACXy1E,cAAcC,YACnB16D,EACA,MASJq6D,aAAe,WACb,IAAI/1E,EAAIsB,KAAK00E,MACTh2E,GAAKA,EAAEmH,YACTnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAK00E,MAAQ,UAgBnB36E,EAAO,gBAAgB,CAAC,OAAO,iBAAiB,SAAS,SAAUmkB,EAAW62D,GAE5E,MAAO,CAKL7wE,OAAS,SAAUqL,GACjB,OAAO7U,OAAOwJ,OAAOga,GAAW9Z,MAAM,CAAC,WAAWC,UAAU0wE,GAAc3wE,MAAMmL,GAAMlL,UAAUrE,MAAMoE,SAIxGA,MAAQ,WAEN,OADApE,KAAKg1E,UAAW,EACTh1E,MAMTuN,KAAO,WAEL,GAAIvN,KAAK00E,MAGP,OAFI10E,KAAKiF,KACPjF,KAAKiF,IAAIpD,UAAUE,IAAI,QAClB/B,KAAK00E,MAGd,IAAIz5E,EAAM+E,KAAKZ,OAoBf,OAnBAY,KAAK00E,MAAM7yE,UAAUE,IAAI,SAAU,QACnC9G,EAAI2O,aAAa,UAAW,QAO5B5J,KAAKqd,QAAQtb,IACX/B,KAAK3E,KAAM,CAACkW,IAAM,CAAC,cAAe,WAAY,SAAU7S,GAGtD,IAAIwU,EAAMlT,KAAK3E,UACGgE,IAAdW,KAAKs0D,OACPphD,GAAO,OAASlT,KAAKs0D,MAEvB10D,OAAOu1D,MAAMjiD,IACf9N,KAAKpF,OAEA/E,GAITg6E,OAAS,SAAU1lE,GACjBvP,KAAKuN,OAAOpE,MAAMO,OAAS6F,EAAK7F,OAAS,MAK3CuU,QAAU,WACJje,KAAKk1E,OACPl1E,KAAKk1E,KAAKC,cAAcn1E,KAAKpB,IAC7BoB,KAAKk1E,UAAO71E,QAsBpBtF,EAAO,QAAQ,IAAG,WAChB,MAAO,CAKLmK,OAAS,SAAU3G,GACjB,OAAO7C,OAAOwJ,OAAOlE,MAAMoE,MAAM7G,IAKnC6G,MAAQ,SAAU+iC,GAChB,MAAMrgC,EAAI9G,KAYV,OAXA8G,EAAEsuE,OAAS,GACG/1E,MAAV8nC,EACFrgC,EAAEqgC,OAAS,EAAC,GAAM,GAEXz7B,MAAMghC,QAAQvF,GACrBrgC,EAAEqgC,OAASA,EAGXrgC,EAAEqgC,OAAS,CAACA,GAEdrgC,EAAEvJ,MAAQuJ,EAAEqgC,OAAO,GACZrgC,GAOTmJ,UAAY,SAAUhV,GAGhBA,EAAIL,eAAe,aACrBoF,KAAKo1E,OAAOj4E,KAAKlC,GACjBA,EAAI+U,SAAShQ,KAAKzC,QAElBgG,QAAQJ,IAAI,UAAYlI,EAAM,8BASlC4f,IAAM,SAAUtd,GACVA,GAASyC,KAAKzC,QAChByC,KAAKzC,MAAQA,EACbyC,KAAKo1E,OAAO3uE,QAAQ1K,GAAKA,EAAEiU,SAASzS,MAQxCq4D,IAAM,WACJ,OAAO51D,KAAKzC,OAOd83E,WAAa,WACX,OAAOr1E,KAAKo1E,OAAO94E,QAOrBoL,MAAQ,WACN,OAAO1H,KAAKo1E,OAAS,IAQvBllE,KAAO,WACL,IAAIvD,EAAO,EACX,IAAK,IAAI5Q,EAAI,EAAGA,EAAIiE,KAAKmnC,OAAO7qC,OAAS,EAAGP,IAC1C,GAAIiE,KAAKzC,OAASyC,KAAKmnC,OAAOprC,GAAI,CAChC4Q,EAAO5Q,EAAE,EACT,MAGJiE,KAAK6a,IAAI7a,KAAKmnC,OAAOx6B,SAgB3B5S,EAAO,gBAAgB,CAAC,gBAAiB,iBAAkB,QAAS,SAAS,SAAUu7E,EAAaP,EAAcQ,GAEhH11E,MAAM21E,MAAQ31E,MAAM21E,OAAS,GAI7B,IAAIC,EAAW,GACXC,EAAW,GAQX7b,EAAU,CACZxiD,MAAQ,IAKNs+D,EAAgB,CAClBC,MAAQ,GACRz5C,OAAS,IAUP05C,EAAS,GAQb,MAAO,CAKL3xE,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAM7BA,MAAQ,WACN,OAAOpE,MAqCT81E,SAAW,SAAU76E,GAInB,IAAII,EAAOJ,EAAU,KAErB,IAAKI,EACH,MAAM,IAAIoC,MAAM,0BAElB,IAAI62D,EAAOr5D,EAAU,KAGjBiD,EAASw3E,EAAQr6E,GAAQ,CAC3BA,KAAOA,EACPi5D,KAAOA,EACPyhB,MAAQ96E,EAAW,MACnB+6E,QAAU,GACVP,SAAW,IAGb,GAA4B,iBAAjBx6E,EAAW,MACpB,MAAM,IAAIwC,MAAM,kCAGlB,IAAIiS,EAAO1P,KACX/E,EAAW,MAAEwL,SAAQ,SAASwvE,GAE5B,GAAqB,iBAAVA,EACT,MAAM,IAAIx4E,MAAM,oCAGlB,IAAI6R,EAAQ2mE,EAAa,MACrBznE,EAAQynE,EAAa,MACrBC,EAAUD,EAAe,QACzBE,EAAOF,EAAY,KAEvB,IAAKznE,IAAWqrD,EAAQrrD,KAAUmnE,EAAcnnE,GAC9C,MAAM,IAAI/Q,MAAM,+BAGlB,GAAKy4E,EAAgB,QACI,aAArBA,EAAgB,QACK,aAArBA,EAAgB,QAkFf,GAAyB,UAArBA,EAAgB,OAAe,CAOtC,IAAIpmE,EAAQylE,EAAWrxE,OAAO,EAAC,GAAM,IAIrCrE,MAAM21E,MAAMhnE,GAAO6O,QAAQxN,UAAUP,EAAO,CAACiC,IAAM,CAAC,UAAWzB,GAG/D,IAAIlR,EAAKoB,KAAKo2E,WAAW,CACvB/6E,KAASA,EAGTiI,IAAQ4yE,EAAkB,SAC1BG,YAAgBH,EAAqB,cAKnCI,EAAUb,EAAS72E,GACV03E,EAAQl3E,OAIdm3E,OAAS,WACd,IAAIC,EAAa,CACfxmE,SAAW,SAAUkE,GACnBoiE,EAAQ1B,QAAQ,CACdnwE,OAAQ,QACRuR,IAAMkgE,EAAe,MACrB34E,MAAQ2W,MAMdpE,EAAMG,UAAUumE,IAGlBt4E,EAAiB,SAAEf,KAAKyB,QA9HY,CAEpC,IAAI4Q,EAAK,SAAU9Q,GAQjB,GAAI,UAAWsB,KAAK2O,QAAU3O,KAAK2O,OAAOmB,MAAMulE,aAAe,EAAG,CAEhE,IAAI9rE,EAAIvJ,KAAK2O,OAAOmB,MAGpB,GAAI2lE,EAASz1E,KAAK2O,OAAiB,UAEjC,YADApF,EAAE2G,OAQF3G,EAAE7B,QACF6B,EAAEsR,KAAI,GAKV,IAAIjc,EAAK8Q,EAAK+mE,UAAUz2E,KAAM,CAC5B3E,KAAQA,EACRiI,IAAO4yE,EAAkB,SACzBG,YAAeH,EAAqB,YACpC5hB,KAAOA,IAETp2D,EAAgB,QAAEf,KAAKyB,GAGnB,UAAWoB,KAAK2O,SAClB3O,KAAK2O,OAAiB,SAAI/P,EAC1BoB,KAAK2O,OAAOmB,MAAMG,UAAU,CAC1BD,SAAW,SAAUzS,GAEN,GAATA,EACFk4E,EAAS72E,GAAIof,WAGby3D,EAAS72E,GAAI2O,YASnBtS,EAAM,CAACsW,IAAM0kE,EAAe,QAAGE,KAAQA,GAEvCD,EAAgB,QAA0B,aAArBA,EAAgB,SAGvCj7E,EAAW,MAAIs6E,EAAWrxE,OAAO,EAAC,GAAM,KAItC21D,EAAQrrD,GACVqrD,EAAQrrD,GAAOrR,KAAK,CAACmS,EAAOrU,EAAKuU,IAI1B3P,MAAM21E,MAAMhnE,GACnB3O,MAAM21E,MAAMhnE,GAAO6O,QAAQtb,IAAIuN,EAAOrU,EAAKuU,GAK3CmmE,EAAcnnE,GAAOrR,KAAK,CAACmS,EAAOrU,EAAKuU,OAmD1CxP,OAML02E,gBAAkB,SAAU73E,EAAK5D,KAQjCmjB,YAAc,SAAU/iB,GACtB,OAAqBgE,MAAjBw6D,EAAQx+D,GACHw+D,EAAQx+D,GACiBgE,MAAvBs2E,EAAct6E,GAChBs6E,EAAct6E,GAEhB,IAMT2mE,iBAAmB,SAAU3mE,GACNgE,MAAjBw6D,EAAQx+D,GACVw+D,EAAQx+D,GAAQ,GACgBgE,MAAvBs2E,EAAct6E,KACvBs6E,EAAct6E,GAAQ,KAK1Bs7E,cAAgB,WAsBd,OAnBK32E,KAAK42E,YAKR52E,KAAK42E,UAAY52E,KAAK62E,YAAYzxE,KAAKpF,MACvCJ,OAAOkK,iBAAiB,UAAW9J,KAAK42E,WAGxC52E,KAAK82E,OAASl3E,OAAO44D,aAAY,WAC/B,IAAK,IAAIz8D,EAAI,EAAGA,EAAI85E,EAAOv5E,OAAQP,IAC7B85E,EAAO95E,MAtRH,MAuRN85E,EAAO95E,GAvRD,OA0RT,MAIE,MAAQiE,KAAK+2E,aAMtBX,WAAa,SAAU7mE,GACrB,IAAKA,EAAU,IACb,OAEF,IAAI3Q,EAAKoB,KAAK22E,gBAEdpnE,EAAS,GAAI3Q,EAGb,IAAI03E,EAAUvB,EAAa7wE,OAAOqL,GAUlC,OARAkmE,EAAS72E,GAAM03E,EACfT,EAAOj3E,GAhTO,IAmTdoB,KAAK+E,UAAU5C,YACbm0E,EAAQl3E,QAGHR,GAQT63E,UAAY,SAAUjoE,EAAOe,GAG3B,IAAI3Q,EAAKoB,KAAK22E,gBAEdpnE,EAAS,GAAI3Q,EAGb,IAAIo4E,EAAS1B,EAAYpxE,OAAOqL,GAWhC,OARAkmE,EAAS72E,GAAMo4E,EACfnB,EAAOj3E,GA3UO,IA6Udo4E,EAAO9B,KAAOl1E,KAGdwO,EAAMzM,IAAIi1E,GAEHp4E,GAOT03E,QAAU,SAAU13E,GAClB,OAAO62E,EAAS72E,IAOlBi4E,YAAc,SAAUn4E,GAEtB,IAAI0b,EAAI1b,EAAE6Q,KAIV,IAAK6K,EACH,OAKF,IAAIxb,EAAKwb,EAAY,SAGrB,IAAKxb,EACH,OAGF,IAAI03E,EAAUb,EAAS72E,GAGvB,GAAK03E,EAAL,CAIA,GAAIT,EAAOj3E,KAAQ,EAcjB,OAXAiB,MAAMsD,IAAI,EAAG,+BAAgCmzE,EAAQhzE,KAMrDtD,KAAKm1E,cAAcmB,EAAQ13E,SAG3B03E,EAAQv4D,QAMV,OAAQ3D,EAAE3V,QACV,IAAK,SACC6xE,EAAQtB,UACVsB,EAAQrB,OAAO76D,GACjB,MAGF,IAAK,MACHva,MAAMsD,IAAIiX,EAAE+R,KAAM/R,EAAE/W,IAAMizE,EAAQhzE,KAClC,MAGF,IAAK,OACejE,MAAdQ,MAAMo3E,OACK,OAAT78D,EAAE88D,IACJr3E,MAAMo3E,KAAKj1E,OAAOoY,EAAEk8D,SAEpBz2E,MAAMo3E,KAAKhlE,OAAOmI,EAAEk8D,UAGxB,MAGF,IAAK,MAGH,GAAa,MAATl8D,EAAEpE,SACqB3W,IAArBQ,MAAM8hE,aACRvnD,EAAS,MAAIva,MAAM8hE,iBAKlB,GAAa,aAATvnD,EAAEpE,IAAoB,CAC7B,IAAIoB,EAAMhV,SACN2B,EAAIqW,EAAS,MAAI,GAErB,IAAIzQ,GACAA,EAAKyN,EAAI8N,eAAe,cAC1BnhB,EAAK,EAAI4F,EAAGpM,QAEVoM,EAAKyN,EAAI8N,eAAe,eAC1BnhB,EAAM,GAAI4F,EAAGpM,QAEXoM,EAAK9J,MAAMqV,MACbnR,EAAM,GAAI4F,EAAG6I,gBAKZ,GAAa,cAAT4H,EAAEpE,IAAqB,CAG9B,IAAIxX,EAAI,IAAI24E,gBAAgBv3E,OAAOy3D,SAASE,QAC5C,IAAIxzD,EAAIqW,EAAS,MAAI,GACrBrW,EAAK,EAAIvF,EAAEo3D,IAAI,KACf7xD,EAAM,GAAIvF,EAAEo3D,IAAI,MAChB7xD,EAAM,GAAIvF,EAAEo3D,IAAI,OAKhBx7C,EAAEgzD,KACJkJ,EAAQ1B,QAAQx6D,KAQpB+6D,cAAgB,SAAUv2E,UACjBi3E,EAAOj3E,GAGV62E,EAAS72E,IAAO62E,EAAS72E,GAAI61E,eAC/BgB,EAAS72E,GAAI61E,sBAGNgB,EAAS72E,IAMgB,GAA9BlE,OAAOqf,KAAK87D,GAAQv5E,QACtB0D,KAAKo3E,mBAITL,UAAY,WACV,OAzq0BN,SAAmBvwE,GACjB,MAAM0f,EAAM,IAAImxD,YAAY7wE,GAAO,IAAM,GAEzC,OADA5G,OAAO03E,OAAOC,gBAAgBrxD,GACvBxa,MAAMma,KAAKK,EAAKhlB,GAAUrE,KAAK,IAsq0B3B26E,CAAS,KAIlBJ,gBAAkB,WAChBx3E,OAAOu4D,cAAcn4D,KAAK82E,QAC1B92E,KAAK82E,YAASz3E,EACdO,OAAO2K,oBAAoB,UAAWvK,KAAK42E,WAC3C52E,KAAK42E,eAAYv3E,GAMnB0F,QAAU,WAKR,OAJK/E,KAAKiF,MACRjF,KAAKiF,IAAM7C,SAASC,cAAc,OAClCrC,KAAKiF,IAAI2E,aAAa,KAAM,aAEvB5J,KAAKiF,KAIduH,QAAU,WAaR,GAZAqpE,EAAS,GACTn7E,OAAOqf,KAAK07D,GAAUhvE,QACpB8C,GAAKksE,EAASlsE,GAAGwU,SAEnB03D,EAAW,GACX/6E,OAAOqf,KAAK8/C,GAASpzD,QACnBgJ,GAAKoqD,EAAQpqD,GAAK,IAEpB/U,OAAOqf,KAAK47D,GAAelvE,QACzBgJ,GAAKkmE,EAAclmE,GAAK,IAGtBzP,KAAKiF,IAAK,CACZ,IAAIvG,EAAIsB,KAAKiF,IACTvG,EAAEmH,YACJnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAKiF,IAAM,KAGbjF,KAAKo3E,uBAaXr9E,EAAO,OAAO,IAAG,WACf,MAAM09E,EAAY,IAAIr3E,OAAO,eAG7B,SAASs3E,EAAUpB,GAEjB,OADAA,EAAUA,EAAQjwE,QACNgR,MAAMogE,GACTnB,EAEF,KAGT,MAAO,CAKLpyE,OAAS,WACP,MAAMjJ,EAAMP,OAAOwJ,OAAOlE,MAE1B,OADA/E,EAAI08E,MAAQ,GACL18E,GAOTgX,OAAS,SAAUqkE,IACjBA,EAAUoB,EAASpB,MAEjBt2E,KAAK23E,MAAMx6E,KAAKm5E,GAChBt2E,KAAKsH,YAQTgW,QAAU,SAAUg5D,IAClBA,EAAUoB,EAASpB,MAEjBt2E,KAAK23E,MAAMl3D,QAAQ61D,GACnBt2E,KAAKsH,YAQTtF,OAAS,SAAUs0E,GACjB,MAAMv6E,EAAIiE,KAAK23E,MAAM95E,QAAQy4E,IACnB,GAANv6E,IACFiE,KAAK23E,MAAM/6E,OAAOb,EAAG,GACrBiE,KAAKsH,YAQT8gC,KAAO,WACL,OAAOpoC,KAAK23E,MAAMr7E,QAOpB8E,SAAW,WACT,OAAOpB,KAAK23E,MAAM96E,KAAK,MAOzByK,QAAU,WACM,MAAVtH,KAAKtB,GACPsB,KAAKtB,EAAEkL,aAAa,QAAS5J,KAAKoB,aAQtC2D,QAAU,WACR,IAAIrG,EAAIsB,KAAKtB,EAOb,OANS,MAALA,IACFA,EAAIsB,KAAKtB,EAAI0D,SAASC,cAAc,SACpC3D,EAAEkL,aAAa,OAAO,QACtBlL,EAAEkL,aAAa,OAAO,QACtBlL,EAAEmD,UAAUE,IAAI,SAEXrD,OAOb3E,EAAO,MAAM,CAAC,SAAS,WAUrB8F,MAAM+3E,SAAoBv4E,IAAdQ,MAAM+3E,IAAoB/3E,MAAM+3E,IAAM,GAClD/3E,MAAM4C,IAAM5C,MAAM4C,KAAO,GAEzB,MAAMo1E,EAAc,IAAIz3E,OAAO,+BAK/BP,MAAM4C,IAAIumB,aAAe,SAAU3R,EAAOzP,EAAO4H,GAG/C,IAAI2a,EAAMtqB,MAAM+3E,IAAM,UAQtB,MAAME,EAASD,EAAY/vD,KAAKzQ,EAAM66C,WACtC,IAAI6lB,EAAc,GAEhBA,EADa,OAAXD,GAAmBA,EAAO,GACdA,EAAO,GAAK,IAAMA,EAAO,GAAK,IAAMA,EAAO,GAG3CzgE,EAAM66C,UAGtB6lB,GAAe,IAAM1gE,EAAM86C,QAC3BhoC,GAAO,IAAM4tD,EAGS,GAAlBnwE,EAAa,OACfuiB,GAAO,cACP4tD,GAAe,gBACU14E,IAArBuI,EAAe,UAClBuiB,GAAO,YAAcviB,EAAe,QACnCmwE,GAAenwE,EAAe,cAETvI,IAAnBuI,EAAa,QAChBuiB,GAAO,UAAYviB,EAAa,MAC/BmwE,GAAe,IAAInwE,EAAa,SAOlCmwE,GAAe,UACf5tD,GAAO,gBAGTtqB,MAAM4C,IAAIu1E,QAAQ7tD,EAAK3a,EAAI,cAAgBuoE,IAO7Cl4E,MAAM4C,IAAImpB,YAAc,SAAUxU,EAAKxP,EAAO4H,GAG5C,IAAI2a,EAAMtqB,MAAM+3E,IAAN/3E,WAA8BuX,EAAI86C,eAEpB7yD,IAApBuI,EAAc,OAChBuiB,GAAO,WAGPA,GAAO,eAGTtqB,MAAM4C,IAAIu1E,QAAQ7tD,EAAK3a,EAAI,aAAe4H,EAAI86C,YAOhDryD,MAAM4C,IAAIw1E,eAAiB,SAAUzoE,GACnC3P,MAAM4C,IAAIu1E,QAAQn4E,MAAM+3E,IAAM,cAAepoE,EAAI,eAcnD3P,MAAM4C,IAAI+b,YAAc,SAAU05D,EAAI1oE,GACrC,IAAI2a,EAAQtqB,MAAM+3E,IAAM,cAAgBptB,mBAAmB0tB,GAC3Dr4E,MAAM4C,IAAIu1E,QAAQ7tD,EAAK3a,EAAI,eAAiB0oE,IAQ7Cr4E,MAAM4C,IAAI01E,cAAgB,SAAUhuD,EAAK3a,GACvC3P,MAAM4C,IAAIu1E,QAAQ7tD,EAAK3a,EAAI,gBAM7B3P,MAAM4C,IAAIu1E,QAAU,SAAU7tD,EAAKosD,EAAQjnE,GACzC,MAAMpV,EAAM,IAAIk+E,eAChBl+E,EAAI8mB,KAAK,MAAOmJ,GAAK,GAGrB,MAAMkuD,EAAO,IAAIjjE,YAAY,eAAgB,CAC3CkjE,SAAU,EACVjjE,OAAQ,CACN8U,IAAQA,EACR7a,MAAUA,KAGd1P,OAAOuV,cAAckjE,GAErBn+E,EAAIq+E,iBAAiB,SAAU,oBAC/Br+E,EAAIq+E,iBAAiB,mBAAoB,kBACzCr+E,EAAIs+E,mBAAqB,WASvB,GAAuB,GAAnBx4E,KAAKy4D,WAAiB,CAExB,IAAI9lD,EACJ,IACEA,EAAO2e,KAAKykC,MAAM/1D,KAAKy4E,cAEzB,MAAO/5E,GAIL,OAHAmB,MAAMsD,IAAI,EAAGzE,GACb6E,QAAQJ,IAAIzE,QACZ63E,OAAOl3E,QAIGA,IAATsT,QAAyCtT,IAAnBsT,EAAa,OACrCA,EAAa,OAAElM,QACZ/H,GAAKmB,MAAMsD,IAAIzE,EAAE,GAAIA,EAAE,IAAM,YAIR,MAAhBsB,KAAK04E,QACb74E,MAAMsD,IAAInD,KAAK04E,OAAQ14E,KAAK24E,YAGV,MAAhB34E,KAAK04E,OACPnC,EAAO5jE,GAIN4jE,OAAOl3E,KAKbnF,EAAI0+E,UAAY,WACd/4E,MAAMsD,IAAI,EAAG,oBAEfjJ,EAAI2+E,WAKR9+E,EAAO,gBAAgB,IAAG,WAC1B6F,OAAOk5E,MAAQ,SAAUrpE,EAAEnR,GAAMA,KAAGmR,EAAErN,SAASC,cAAc,MAAO02E,KAAKz6E,GAAE,IAA0DwI,EAAtDsT,EAAE3K,EAAE8nD,OAAOf,EAAEp2D,OAAO5B,EAAE6B,OAAOmN,aAAoB4P,EAAE,GAAO2V,KAAKimD,IAAic,IAA7b/iE,EAAExG,EAAE6nD,SAASjgD,MAAM,uBAAuB1D,EAAE,SAASyc,GAAoB,IAAjB,IAAQ/C,EAAO7M,EAAX9hB,EAAE,EAAIutB,EAAE,GAAWvtB,EAAE0xB,EAAE9zB,QAAwB,IAAhBkkB,EAAE4P,EAAE1zB,OAAOgC,MAAU2Y,MAAM,YAAa4U,GAAGztB,GAAGgiB,GAAG,IAAI,GAAG,OAAOA,EAAEA,EAAEy3B,WAAW,GAAG,IAAIz3B,EAAEA,EAAE,QAAS,CAAA,GAAM,KAAHA,EAAkG,OAArE,IAArB6M,EAAE,GAAG7M,EAAE4P,EAAE1zB,OAAOgC,KAAW8hB,EAAEnJ,MAAM,OAAOgW,GAAG7M,EAAEA,EAAE4P,EAAE1zB,OAAOgC,KAAKA,IAAIutB,GAAGztB,EAAEiK,SAAS4kB,IAAgF,IAAhE9jB,EAAE0iB,EAAE3vB,OAAO4vB,EAAE6G,KAAKwE,IAAI,IAAIhuB,EAAEA,GAAG0iB,EAAEA,EAAE5qB,OAAO6qB,GAAGD,EAAE5qB,OAAO,EAAE6qB,GAAGplB,EAAE,GAAO/K,EAAE,EAAEA,EAAEwN,EAAExN,IAAK+K,GAAGtI,EAAEytB,EAAEgsB,WAAWl8C,GAAGka,EAAE,GAAGgiC,WAAWhiC,EAAE,GAAG3Z,QAAQP,EAAE,KAAK,OAAO+K,GAASsT,GAAGA,EAAEA,EAAE3d,QAAQ,kBAAkB,KAAIqK,EAAE0vD,EAAEvuC,IAAQ5Q,MAAM,wBAAkC,OAANm/C,EAAEvuC,GAAU7K,EAAEjgB,KAAK,MAAMwW,EAAE6iD,EAAExuC,IAAI,IAAIrU,EAAEsC,EAAE,KAAUmH,EAAEjgB,KAAKq5D,EAAEvuC,GAAG,IAAItU,EAAE6iD,EAAExuC,KAAW5K,EAAEjgB,KAAK2J,EAAErK,QAAQ,MAAM,MAA8C,OAAxC46D,SAAS0hB,KAAK,WAAc37D,EAAEvgB,KAAK,MAAY,MAqBt0B9C,EAAO,OAAO,CACZ,QACA,OACA,KACA,WACA,eACA,WACA,eACA,UACA,aACA,eACA,cACA,aACA,gBACA,OACA,MACA,gBACA,OACA,UACC,SAAUk/E,EACArG,EACAvxD,EACA63D,EACAxgB,EACAygB,EACAC,EACApjB,EACAqjB,EACAC,EACAC,EACAC,EACAC,EACAC,GAEX,MAAMt/D,EAAIhY,SAGVvC,MAAM+3E,IAAMx9D,EAAEu2C,KAAK5oC,aAAa,mBAAqB,GAGrD,MAAM4xD,EAAMv/D,EAAE8K,eAAe,cACjB,OAARy0D,IACF95E,MAAM8hE,WAAarwC,KAAKykC,MAAM4jB,EAAI5xD,aAAa,oBAAsB,KAIvEloB,MAAMo2D,QAAUD,EAAa9xD,OAC3BrE,MAAM+3E,IAAIt7E,OAAS,EAAI,aAAeuD,MAAM+3E,IAAIt2E,UAAY,aAI9D1B,OAAO88D,SAAW0c,EAClBv5E,MAAMsD,IAAM,SAAUgpB,EAAM9oB,EAAKC,GAE3BA,IACFD,GAAO,qBAAqBC,EAAI,WAIlC81E,EAAcj2E,KACF,IAATgpB,EAAa,GAAKA,EAAO,MACxB9oB,EACF,QACA,MAIJxD,MAAMqV,GAAKmM,EAAQnd,OAAOi1E,GAE1Bt5E,MAAM+5E,SAAY,WAChBJ,EAAUxG,gBAAgB1oD,SAG5BzqB,MAAMg6E,UAAY,WAChBL,EAAUhG,gBAAgBlpD,SAG5BouC,GAAS,SAAUtzC,GAEjB,IA2BI00D,EAAQC,EA3BR9+E,EAAM,GAGNsS,EAAO1N,MAAMo2D,QAAQL,IAAI,SAAW,GAExC/1D,MAAM21E,MAAQ31E,MAAM21E,OAAS,GAK7Bp7D,EAAE48C,iBAAiB,6BAA6BvwD,SAC9C,SAAS/H,GACP,IAAI2E,EAAM3E,EAAEsI,YAER1D,EAAM5E,EAAEqpB,aAAa,YACrBzkB,IACFD,GAAO,qBAAqBC,EAAI,WAGlC,IAAIF,EAAO1E,EAAEqpB,aAAa,cAAgB,QAC1CqxD,EAAcj2E,IAAIE,EAAKD,EAAM,QAQjC,IAAI0U,EAAQsC,EAAE8K,eAAe,MAEzBhQ,EAAKrV,MAAMqV,GAGf,GAAI4C,EAAO,CAQT,GAPAA,EAAM3O,MAAMK,QAAU,QACtBswE,EAAS1/D,EAAE/X,cAAc,SAClBuH,aAAa,KAAM,aAC1BkwE,EAAOj4E,UAAUE,IAAI,eAII1C,IAArBQ,MAAM8hE,aAA6B9hE,MAAM8hE,WAAuB,YAAK9hE,MAAM8hE,WAAmB,QAChG,IACEzsD,EAAGtC,SAAS/S,MAAM8hE,WAAuB,YAAK9hE,MAAM8hE,WAAmB,QAEzE,MAAOjjE,GACLmB,MAAMsD,IAAI,EAAEzE,IAIhBq7E,EAAWD,EAAO73E,KAAK,SACdK,KAAK4S,EAAGiM,WAEbjM,EAAGyL,gBACLo5D,EAASl4E,UAAUE,IAAI,aAGzB+V,EAAMjS,WAAWa,aAAaozE,EAAQhiE,GAMxC,IAAIkiE,EAAgB5/D,EAAE48C,iBACpB,qBAGFgjB,EAAcvzE,SAAQ,SAAS/H,GAGzBA,EAAEmD,UAAUC,SAAS,eACHzC,IAAhBW,KAAK2oB,QAEPswD,EAAW/0E,OAAOxF,GAAG2L,QAMvB3L,EAAEoL,iBAAiB,SAAS,SAAUpL,QAChBW,IAAhBW,KAAK2oB,OACP3oB,KAAK2oB,OAAO3H,OAGZi4D,EAAW/0E,OAAOlE,MAAMghB,UAK5BtiB,EAAEoL,iBAAiB,WAAW,SAAUpL,GAGtC,OAFWqC,EAAerC,IAG1B,KAAK,QACiBW,IAAhBW,KAAK2oB,OACP3oB,KAAK2oB,OAAO8pC,SAGZwmB,EAAW/0E,OAAOlE,MAAMghB,OAE1BtiB,EAAEqB,cAKPC,MAGH,IAAIi6E,EAAQ7/D,EAAExU,qBAAqB,SAAS,GAE5C,GAAIq0E,GAA+C,GAAtCA,EAAMp4E,UAAUC,SAAS,UAAoB,CAGxD,IAAIo4E,GAAe,EAGnBD,EAAMnwE,iBAAiB,SAAS,SAASpL,GACvCsB,KAAK6B,UAAUE,IAAI,aAIrB,IAAI4uD,EAAOv2C,EAAExU,qBAAqB,QAAQ,GAC7B,OAAT+qD,GACFA,EAAK7mD,iBAAiB,SAAS,WACxBowE,EAIHA,GAAe,EAHfD,EAAMp4E,UAAUG,OAAO,aAW7Bi4E,EAAMnwE,iBAAiB,SAAS,SAASpL,GACvCw7E,GAAe,KAOH,OADF9/D,EAAE8K,eAAe,cAE7BrlB,MAAM+2D,OAASyiB,EAAgBn1E,OAC7BkW,EAAE8K,eAAe,YAAYrf,YAC7BkC,MAAM,IAGV,IAAIoyE,EAAa//D,EAAE8K,eAAe,cAK9Bk1D,EAAcd,EAAiBp1E,OAAOqJ,GAE1C,GAAkB,MAAd4sE,EAAoB,CAGtBA,EAAWh4E,YAAYi4E,EAAY/8D,QAAQtY,WAG3C,IAAIs1E,EAAKjgE,EAAE8K,eAAe,UAC1Bm1D,EAAG3zE,aAAa0zE,EAAYr1E,UAAWs1E,EAAGx5E,YA0C5C,QArCyBxB,IAArBQ,MAAM8hE,aAGW,OAAfwY,GACFC,EAAYnY,cAGVpiE,MAAM8hE,WAAmB,QAC3B9hE,MAAM8hE,WAAmB,OAAEl7D,SAAQ,SAAS/H,GAG7B,MAATA,EAAE,SAAuBW,IAATX,EAAE,IACpBzD,EAAIm5D,KAAOwe,EAAU1uE,SACrBjJ,EAAIm5D,KAAKe,MAAMz2D,EAAE,GAAIA,EAAE,KAIP,MAATA,EAAE,KACTzD,EAAIm5D,KAAOwe,EAAU1uE,SACrBjJ,EAAIm5D,KAAKe,MAAM,EAAGz2D,EAAE,SAWxBs7E,EAAc19E,OAAS,GACzB89E,EAAYhY,iBAEdviE,MAAM21E,MAAc,OAAI4E,EAIpBN,EAAQ,CACV5kE,EAAGgM,WAAa,WACd44D,EAAOj4E,UAAUG,OAAO,iBACjBuL,EAAS,IAGlB2H,EAAG+L,OAAS,WACV64D,EAAOj4E,UAAUE,IAAI,UAErB,IAAI2b,EAAOtD,EAAE8K,eAAe,WACvBxH,EAAK7c,YACR6c,EAAKvb,YAAYnC,KAAK+E,WAExBwI,EAAS,IAAI,GAGf,IAAI+sE,EAAU,WACRplE,EAAG6L,SACL7L,EAAG8I,WAGH9I,EAAG8L,QAIP84D,EAAO30E,QAAUm1E,EAGb/sE,EAAS,IACX+sE,EAAQl9E,QAQRgd,EAAE8K,eAAe,kBACnBtlB,OAAO26E,SAAWrB,EAASh1E,OACzBkW,EAAE8K,eAAe,iBACjBrlB,MAAMo2D,SAERh7D,EAAIs/E,SAAW36E,OAAO26E,UAIf36E,OAAO0Q,SACdrV,EAAIs/E,SAAW36E,OAAO0Q,OAAOiqE,UAI3Bt/E,EAAIs/E,WACNt/E,EAAIs/E,SAASxjB,YAAY38C,GAGzBnf,EAAIs/E,SAAStjB,aAAa78C,IAO5B,IAAIogE,EAAOpgE,EAAE8K,eAAe,cACf,OAATs1D,GACFA,EAAK1wE,iBAAiB,UAAU,SAAUpL,GACxC,IAAI+7E,EAAKrgE,EAAE8K,eAAe,WAG1B,QAAiB7lB,IAAbo7E,EAAGl9E,OAAoC,KAAbk9E,EAAGl9E,MAI/B,OAHAk9E,EAAG/vE,QACHhM,EAAEqB,YACFF,MAAMsD,IAAI,IAAK,kBAKjBtD,MAAMo2D,QAAQp7C,IAAI,OAAQtN,QAEflO,IAAP6V,GACF4C,EAAMva,MAAQ2X,EAAG1C,UACE,IAAfsF,EAAMva,OACRua,EAAMq+C,gBAAgB,UAGxBr+C,EAAMq+C,gBAAgB,SACtBr+C,EAAMq+C,gBAAgB,SAQxBskB,EAAG54E,UAAUE,IAAI,WACjBqY,EAAE8K,eAAe,WAAWrjB,UAAUE,IAAI,cAM3ClC,MAAMo2D,QAAQL,IAAI,SACnB4jB,EAAUhG,gBAAgBlpD,aAUXjrB,IAAbpE,EAAIm5D,OACNn5D,EAAIm5D,KAAOwe,EAAU1uE,UAGvBrE,MAAM0zE,KAAOt4E,EAAIm5D,KAMjB,IAAIsmB,EAAanB,EAAgBr1E,SAG7By2E,EAAQvgE,EAAE8K,eAAe,cACzB01D,EAASxgE,EAAE8K,eAAe,WAU9B,IAAI21D,EACJ,GAVIF,GAASC,IAEXD,EAAMj0E,aAAag0E,EAAW31E,UAAW61E,GACzC/6E,MAAM21E,MAAa,MAAIkF,GAOrBG,EAAKzgE,EAAE8K,eAAe,mBAAoB,CAC5C,IAAIiF,EAAM0wD,EAAG9yD,aAAa,qBACd1oB,IAAR8qB,GACFtqB,MAAM4C,IAAI01E,cAAchuD,GAAK,SAAUxX,GACrC,GAAIA,GAAQA,EAAKrW,OAAS,EAAG,CAE3BuD,MAAMyxD,OAASmoB,EAAYv1E,SAG3BkW,EAAEnX,KAAKd,YAAYtC,MAAMyxD,OAAOvsD,WAGhClF,MAAMo3E,KAAOyC,EAAUx1E,SACvBkW,EAAE8K,eAAe,cAAc/iB,YAAYtC,MAAMo3E,KAAKlyE,WAEtD,IAGE4N,EAAKlM,QAAQ1K,GAAK8D,MAAMyxD,OAAOwkB,SAAS/5E,IAE1C,MAAO2C,GACLmB,MAAMsD,IAAI,EAAGzE,QAOvB,OAAOzD,QAKX2E,OAAOC,MAAQD,OAAOC,OAAS,GAC/BA,MAAM6C,OAAS7C,MAAM6C,QAAU,GAC/B5I,EAAQ,CAAC,aAAc,SAAU,SAEjCC,EAAO,UAAU,eA3+2BjB","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) { //when is this ever called?\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n    // anno[i]: [0] First is name, then [1] what gets entered into the search bar, then a [2] description\r\n    // Question: is there a conflict with anno[\"Stored Queries\"][1] being \"\" if I do implement it like that?\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return; // no anno[i][2] means no description, this hopefully never happens\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else { //value includes :\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\ndefine('hint/foundries/storedQueries',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Stored Queries\", \"storedQ/=\", \"stored online\"]\r\n    // We do not want to add a string (I think) instead, as soon as we select a stored query, we just add its contents\r\n  );\r\n\r\n  ah[\"storedQ/=\"] = [\r\n    [\"Baum\", \"baum\", \"DescBaum\"],\r\n    [\"Holz\", \"holz\", \"DescParagraph\"],\r\n    [\"Blatt\", \"blatt\", \"DescText\"]\r\n  ];\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\",\r\n  \"hint/foundries/storedQueries\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * cq = corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General method to retrieve JSON information\r\n   */\r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  }\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.1-en.js b/public/js/kalamar-0.41.1-en.js
new file mode 100644
index 0000000..0da085f
--- /dev/null
+++ b/public/js/kalamar-0.41.1-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,v=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||v)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const r=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(r,"\\$1")+'"'};const o=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(o,"\\$1")};const c=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),l=new RegExp("[-\\s]+","g");function h(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function d(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(c,"").replace(l,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),n("hint/foundries/storedQueries",["hint/foundries"],(function(t){t["-"].push(["Stored Queries","storedQ/=","stored online"]),t["storedQ/="]=[["Baum","baum","DescBaum"],["Holz","holz","DescParagraph"],["Blatt","blatt","DescText"]]})),e(["hint/foundries/base","hint/foundries/dereko","hint/foundries/storedQueries"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(d(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(d(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return h(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),h(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),h(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();h(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),h(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?h(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+v.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)v(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s=i.v===n,c=s?i.w:i.v;if(c!==r){var l=s===o,u=e.edge(i).weight;if(a+=l?u:-u,function(t,e,n){return t.hasEdge(e,n)}(t,n,c)){var h=t.edge(n,c).cutvalue;a+=l?-h:h}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},N={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},P={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=N[typeof window]&&window||this,O=N[typeof n]&&n&&!n.nodeType&&n,R=N[typeof e]&&e&&!e.nodeType&&e,j=R&&R.exports===O&&O,I=N[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+P[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Y(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!I||I.global!==I&&I.window!==I||(S=I);var W=function t(e){var n=(e=e?W.defaults(S.Object(),e,W.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,P=e.Function,O=e.Math,R=e.Number,j=e.Object,I=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=j.prototype,Z=e._,X=J.toString,tt=I("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=P.prototype.toString,ot=Dt(ot=j.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=j.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=j.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Dt(gt=j.keys)&&gt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=P,wt[A]=j,wt["[object Number]"]=R,wt["[object RegExp]"]=I,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Y(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Y(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return je(t,e)}function Nt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Y(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Y(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Nt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Pt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&N[typeof t]||e&&N[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var v=m,_=e[g];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[g],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function jt(t,e){return t+it(bt()*(e-t+1))}function It(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Y(u))[2]&&(u[2]=Y(u[2])),u[3]&&(u[3]=Y(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Nt)([t,e,n,i,r,o])}function qt(t){return Yt[t]}function Bt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof P.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Wt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!N[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Yt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Wt=ie(Yt),Qt=I("("+Gt(Wt).join("|")+")","g"),$t=I("["+Gt(Yt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&N[typeof r])for(var u=-1,h=N[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&N[typeof r])for(var l=-1,u=N[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!N[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=N[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!N[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=jt(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Y(t,0,_t(vt(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Pe(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Ne(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return Y(t,i)}function Pe(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),It(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function je(t,e){return arguments.length>2?Mt(t,17,Y(arguments,2),null,e):Mt(t,1,null,null,e)}function Ie(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),v=g<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=je,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Y(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=Ie,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Q;var e=Y(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=Y(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Pt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Y(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Y(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Y(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Pt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Y(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Y(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Ne,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,Ie(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Y(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return It(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Pt(t,Y(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?It(Pt(i,n).concat(Pt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Ne,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Ne,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return jt(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Pe,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",_=I((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(v,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=P(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Y(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[jt(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?j?(R.exports=W)._=W:O._=W:S._=W}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const v=n;g.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===d(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){Array.from(t.querySelectorAll("pre.query.tutorial:not(.unsupported)")).forEach(t=>t.onclick=function(t){this.useQuery(this,t)}.bind(this))},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,v=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=v(),0;var i=s(n,E);if(i)return A+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=v();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,N=0;E.t.lastIndex=N,T=E.t.exec(n);)L=y(n.substr(N,T.index-N),T[0]),N=T.index+L;for(y(n.substr(N)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return j.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=P(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=P(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;N(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&Y(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+W.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",W.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),N=document.createElement("div"),P=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),j=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&Y(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),N.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var I=document.createElement("ul");I.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),I.appendChild(i)})),O.appendChild(I),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",W.call(this)),M.style.cssText="width:"+W.call(this)+"%;",R.appendChild(M),j.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(j.style.display="none"),P.className="introjs-tooltip",P.appendChild(S),P.appendChild(O),P.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),P.appendChild(N),x.appendChild(P),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},j.appendChild(i),this._introItems.length>1&&(j.appendChild(n),j.appendChild(e)),P.appendChild(j),h.call(o,t.element,P,N,q),b.call(this,t.scrollTo,t,P)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=P().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function N(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||N(e))}function P(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",j,this,!0)}function j(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function I(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(I(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=I(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function B(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(I(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=I('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),N(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function Y(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function W(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Q=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Q.instances[A(n,"introjs-instance")]=n,n};return Q.version="2.9.3",Q.instances={},Q.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Q})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":vchoo=l.querySelector("#vc-choose"),vcv=l.querySelector("#vc-view"),KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),vcv.querySelector(".active")||(vchoo.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,e,n){const i=new XMLHttpRequest;i.open("GET",t,!0);const r=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:t,title:n}});window.dispatchEvent(r),i.setRequestHeader("Accept","application/json"),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.onreadystatechange=function(){if(4==this.readyState){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void e(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText),200===this.status?e(t):e(void 0)}},i.ontimeout=function(){KorAP.log(0,"Request Timeout")},i.send()}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,r=t.search,o=RegExp,c=String.fromCharCode,l=[];Math.pow;for(k=t.pathname.match(/([^\/]+)\/([^\/]+)$/),a=function(t){for(var e,r,o=0,a="";o<t.length;)if((r=t.charAt(o++)).match(/[A-Za-z]/))a+=c((r<="Z"?90:122)>=(r=r.charCodeAt(0)+13)?r:r-26);else{if("-"!=r)return;for(e="",r=t.charAt(o++);r.match(/\d/);)e+=r,r=t.charAt(o++);o--,a+=c(parseInt(e))}for(s=a.length,u=Math.abs(673%s-s),a=a.substr(u)+a.substr(0,u),n="",i=0;i<s;i++)n+=c(a.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)));return n};r;)r=r.replace(/^[\?\&]([^\&]+)/,""),(n=o.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==o.$1?l.push("to="+a(o.$2)+"@"+a(k[2])):l.push(o.$1+"="+a(o.$2)):l.push(n.replace(/\+/g," "));return location.href="mailto:?"+l.join("&"),!1}})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,h,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const g=m.getElementById("koralQuery");null!==g&&(KorAP.koralQuery=JSON.parse(g.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),KorAP.tourshow=function(){h.gTstartSearch().start()},KorAP.tourshowR=function(){h.gTshowResults().start()},r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=m.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(d(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){_.onMinimize=function(){r.classList.remove("active"),delete g.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,g.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&h.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),N=m.getElementById("searchform"),P=m.getElementById("vc-view");let S;if(N&&P&&(N.insertBefore(L.element(),P),KorAP.Panel.query=L),S=m.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.1-en.js.map b/public/js/kalamar-0.41.1-en.js.map
new file mode 100644
index 0000000..a87a01c
--- /dev/null
+++ b/public/js/kalamar-0.41.1-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.1-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","getPluginList","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) { //when is this ever called?\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n    // anno[i]: [0] First is name, then [1] what gets entered into the search bar, then a [2] description\r\n    // Question: is there a conflict with anno[\"Stored Queries\"][1] being \"\" if I do implement it like that?\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return; // no anno[i][2] means no description, this hopefully never happens\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else { //value includes :\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\ndefine('hint/foundries/storedQueries',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Stored Queries\", \"storedQ/=\", \"stored online\"]\r\n    // We do not want to add a string (I think) instead, as soon as we select a stored query, we just add its contents\r\n  );\r\n\r\n  ah[\"storedQ/=\"] = [\r\n    [\"Baum\", \"baum\", \"DescBaum\"],\r\n    [\"Holz\", \"holz\", \"DescParagraph\"],\r\n    [\"Blatt\", \"blatt\", \"DescText\"]\r\n  ];\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\",\r\n  \"hint/foundries/storedQueries\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * cq = corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General method to retrieve JSON information\r\n   */\r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  }\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.3-de.js b/public/js/kalamar-0.41.3-de.js
new file mode 100644
index 0000000..5484e88
--- /dev/null
+++ b/public/js/kalamar-0.41.3-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function g(t,e){return d.call(t,e)}function m(t,e){var n,i,r,o,s,a,c,l,h,d,f,g=e&&e.split("/"),m=u.map,v=m&&m["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&g&&(t=g.slice(0,g.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((g||v)&&m){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),g)for(d=g.length;d>0;d-=1)if((r=m[g.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(g(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!g(c,t)&&!g(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=m(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return m(t,i)})):m(t,s):(o=(r=b(t=m(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,m,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),m=!0;else if("module"===o)r=b[f]=a.module(t);else if(g(c,o)||g(l,o)||g(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&m||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),g(c,t)||g(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),g=t("./util"),m=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new m({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},A,x(r,E),i.pick(r,k)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(g.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};g.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(g.intersectRect(o,n)),r.points.push(g.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],A={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},k=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,g=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:g,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:g,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,g=0;g<4;++p,++g){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var m=o(t,a);m<l&&(g=0,c=i.cloneDeep(a),l=m)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var g=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(g,f);var m=s(g,c);if(h&&(m.vs=i.flatten([h,m.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(m,"barycenter")||(m.barycenter=0,m.weight=0),m.barycenter=(m.barycenter*m.weight+v.order+_.order)/(m.weight+2),m.weight+=2}return m}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-g(t,n)/2}));return i.max(e,(function(e,n){return e+g(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function g(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=g(n);)v(n,t,e,m(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function g(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function m(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=g,u.enterEdge=m,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),g=/($^)/,m=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",A="[object Date]",k="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[A]=C["[object Number]"]=C[k]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},P={configurable:!1,enumerable:!1,value:null,writable:!1},L={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=L[typeof window]&&window||this,O=L[typeof n]&&n&&!n.nodeType&&n,R=L[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=L[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Q=function t(e){var n=(e=e?Q.defaults(S.Object(),e,Q.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Y=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,gt=e.isNaN,mt=Dt(mt=I.keys)&&mt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new At(t)}function At(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[A]=r,wt["[object Function]"]=N,wt[k]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,At.prototype=Et.prototype;var kt=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case A:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?ge:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Pt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(kt.funcNames&&(i=!t.name),!(i=i||!kt.funcDecomp))){var r=rt.call(t);kt.funcNames||(i=!d.test(r)),i||(i=m.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Lt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Lt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function Nt(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&L[typeof t]||e&&L[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=k),c==b&&(c=k),a!=c)return!1;switch(a){case E:case A:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=k)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var g=r.length;g--;)if(r[g]==t)return o[g]==e;var m=0;if(s=!0,r.push(t),o.push(e),l){if(g=t.length,m=e.length,(s=m==g)||i)for(;m--;){var v=g,_=e[m];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[m],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return m++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--m>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?ge:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Y;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Lt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Pe?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}kt.funcDecomp=!Dt(e.WinRTError)&&m.test(t),kt.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){P.value=e,ht(t,"__bindData__",P)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=k||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Qt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=mt?function(t){return oe(t)?mt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!L[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qt=ie(Wt),Yt=j("("+Gt(Qt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Pt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&L[typeof r])for(var u=-1,h=L[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&L[typeof r])for(var l=-1,u=L[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;for(i in e=e&&void 0===n?e:Pt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;e=e&&void 0===n?e:Pt(e,n,3);for(var s=-1,a=L[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Pt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!L[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=k)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function ge(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function me(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function Ae(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),me(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function ke(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return ge(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,_t(vt(0,i),r))}function Pe(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Le(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return W(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Y;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},g=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var m=h-(s-u),v=m<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(g,m))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=At,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);ge(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Y;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new At(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Y;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Pt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Y;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Y;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=ge,Et.forEachRight=me,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Pt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return ge(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Y;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Pt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Y;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Le,Et.shuffle=ke,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),ge(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Y;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Pt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?ge:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Le,Et.each=ge,Et.eachRight=me,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Le,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Pt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Pt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),me(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Pe,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==A||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==k&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Pt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!gt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=Ae,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||g,m="__p += '",_=j((n.escape||g).source+"|"+p.source+"|"+(p===f?u:g).source+"|"+(n.evaluate||g).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),m+=t.slice(d,a).replace(v,F),n&&(m+="' +\n__e("+n+") +\n'"),s&&(r=!0,m+="';\n"+s+";\n__p += '"),i&&(m+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),m+="';\n";var b=n.variable,w=b;w||(m="with ("+(b="obj")+") {\n"+m+"\n}\n"),m=(r?m.replace(a,""):m).replace(c,"$1").replace(l,"$1;"),m="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+m+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var A=N(s,"return "+m+E).apply(void 0,h)}catch(t){throw t.source=m,t}return e?A(e):(A.source=m,A)},Et.unescape=function(t){return null==t?"":q(t).replace(Yt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=Ae,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=ke(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new At(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,ge(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new At(n,t):n}})),ge(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),ge(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new At(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Q)._=Q:O._=Q:S._=Q}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let g=((o+f)/2+f)/2;const m=this._c("g");m.setAttribute("class","label"),n._labelsElement.appendChild(m),m.arcRef=c;const v=n;m.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=m.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",g+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,A=m.insertBefore(n._c("rect"),_),k=w+2*n.xPadding;A.setAttribute("x",d+u-k/2),A.setAttribute("ry",5),A.setAttribute("y",b.y-n.yPadding),A.setAttribute("width",k),A.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},g={},m=!1,v=13,_=27,y=32,b=[];return g={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,g="",m=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(g=d.value),"function"==typeof t&&(void 0!==d?t(!0,g):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){m.hide(),m.unbind(r.body,"keyup",l),m.unbind(o,"focus",u),h&&m.unbind(i,"click",e),f&&m.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||m.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=g.message.replace("{{message}}",i),"prompt"===n&&(e+=g.input),e+=g.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",g.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),m||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(m=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(m=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;m=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function m(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!g[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,A[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(A[E.sL]=t.top),m(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=m(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?m(t.cN,"",!0):"";t.rB?(k+=i,x=""):t.eB?(k+=e(n)+i,x=""):(k+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return k+=v(),0;var i=s(n,E);if(i)return k+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),k+=v();do{E.cN&&(k+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(k+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,A={},k="";for(w=E;w!=b;w=w.parent)w.cN&&(k=m(w.cN,"",!0)+k);var x="",C=0;try{for(var T,P,L=0;E.t.lastIndex=L,T=E.t.exec(n);)P=y(n.substr(L,T.index-L),T[0]),L=T.index+P;for(y(n.substr(L)),w=E;w.parent;w=w.parent)w.cN&&(k+="</span>");return{r:C,value:k,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(g);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?m[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return g[t]||g[m[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},g={},m={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=g[e]=n(t);i.aliases&&i.aliases.forEach((function(t){m[t]=e}))},t.listLanguages=function(){return Object.keys(g)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(m.call(this,document.querySelector(".introjs-helperLayer")),m.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),m.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var g=a.width/2-s.width/2;r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",g=a.width/2-s.width/2,r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&g(i,"bottom"),a.top-o<0&&g(i,"top"),a.right+s>r.width&&g(i,"right"),a.left-s<0&&g(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&g(s,"-left-aligned");(t<r||o-t<r)&&g(s,"-middle-aligned");t<e&&g(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function g(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function m(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;L(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),m.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),g=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var A=this._introItems[t.step-2>=0?t.step-2:0];(null!==A&&"forward"===this._direction&&"floating"===A.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,s),m.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,g,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Q.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Q.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var k=document.createElement("div"),x=document.createElement("div"),L=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");k.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,k),m.call(o,x),this._targetElement.appendChild(k),this._targetElement.appendChild(x),L.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Q.call(this)),M.style.cssText="width:"+Q.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(O),N.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(L),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,L,q),b.call(this,t.scrollTo,t,N)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=P(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=P(e,"z-index"),r=parseFloat(P(e,"opacity")),o=P(e,"transform")||P(e,"-webkit-transform")||P(e,"-moz-transform")||P(e,"-ms-transform")||P(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var A,k=(A={},function(t,e){return A[e=e||"introjs-stamp"]=A[e]||0,void 0===t[e]&&(t[e]=A[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+k(n)+(i?"_"+k(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function P(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function L(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===P(t,"position")||L(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),L(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),m.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Q(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Y=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Y.instances[k(n,"introjs-instance")]=n,n};return Y.version="2.9.3",Y.instances={},Y.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Y})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const g=document;KorAP.URL=g.body.getAttribute("data-korap-url")||"";const m=g.getElementById("koralQuery");let v;null!==m&&(KorAP.koralQuery=JSON.parse(m.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(v=document.getElementById("link-guided-tour"))&&(v.setAttribute("href","#"),v.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},m=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},g.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=g.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=g.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=g.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=g.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=g.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==g.getElementById("ql-field")&&(KorAP.QLmenu=c.create(g.getElementById("ql-field").parentNode).limit(5));var A=g.getElementById("resultinfo"),k=l.create(m);if(null!=A){A.appendChild(k.actions.element());var x=g.getElementById("search");x.insertBefore(k.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==A&&k.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&k.addAlignAction(),KorAP.Panel.result=k,r){_.onMinimize=function(){r.classList.remove("active"),delete m.vc},_.onOpen=function(){r.classList.add("active");var t=g.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),m.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,m.vc&&C.apply()}g.getElementById("view-tutorial")?(window.tutorial=i.create(g.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(g),a.tutorial.initDocLinks(g));var T=g.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=g.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",m),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),g.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var P=u.create(),L=g.getElementById("searchform"),N=g.getElementById("vc-view");let S;if(L&&N&&(L.insertBefore(P.element(),N),KorAP.Panel.query=P),S=g.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),g.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),g.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.3-de.js.map b/public/js/kalamar-0.41.3-de.js.map
new file mode 100644
index 0000000..3bc7070
--- /dev/null
+++ b/public/js/kalamar-0.41.3-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.3-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"CAAC;;;;;AASD,IAAIA,EAAWC,EAASC,GACvB,SAAUC,GACP,IAAIC,EAAMC,EAAKC,EAASC,EACpBC,EAAU,GACVC,EAAU,GACVC,EAAS,GACTC,EAAW,GACXC,EAASC,OAAOC,UAAUC,eAC1BC,EAAM,GAAGC,MACTC,EAAiB,QAErB,SAASC,EAAQC,EAAKC,GAClB,OAAOT,EAAOU,KAAKF,EAAKC,GAW5B,SAASE,EAAUC,EAAMC,GACrB,IAAIC,EAAWC,EAAaC,EAAUC,EAAUC,EAC5CC,EAAQC,EAAcC,EAAOC,EAAGC,EAAGC,EACnCC,EAAYZ,GAAYA,EAASa,MAAM,KACvCC,EAAM7B,EAAO6B,IACbC,EAAWD,GAAOA,EAAI,MAAS,GAGnC,GAAIf,EAAM,CAwBN,IAtBAM,GADAN,EAAOA,EAAKc,MAAM,MACDG,OAAS,EAMtB/B,EAAOgC,cAAgBxB,EAAeyB,KAAKnB,EAAKM,MAChDN,EAAKM,GAAaN,EAAKM,GAAWc,QAAQ1B,EAAgB,KAIpC,MAAtBM,EAAK,GAAGqB,OAAO,IAAcR,IAO7Bb,EADsBa,EAAUpB,MAAM,EAAGoB,EAAUI,OAAS,GACjCK,OAAOtB,IAIjCU,EAAI,EAAGA,EAAIV,EAAKiB,OAAQP,IAEzB,GAAa,OADbE,EAAOZ,EAAKU,IAERV,EAAKuB,OAAOb,EAAG,GACfA,GAAK,OACF,GAAa,OAATE,EAAe,CAMtB,GAAU,IAANF,GAAkB,IAANA,GAAuB,OAAZV,EAAK,IAAgC,OAAhBA,EAAKU,EAAI,GACrD,SACOA,EAAI,IACXV,EAAKuB,OAAOb,EAAI,EAAG,GACnBA,GAAK,GAMjBV,EAAOA,EAAKwB,KAAK,KAIrB,IAAKX,GAAaG,IAAYD,EAAK,CAG/B,IAAKL,GAFLR,EAAYF,EAAKc,MAAM,MAEJG,OAAQP,EAAI,EAAGA,GAAK,EAAG,CAGtC,GAFAP,EAAcD,EAAUT,MAAM,EAAGiB,GAAGc,KAAK,KAErCX,EAGA,IAAKF,EAAIE,EAAUI,OAAQN,EAAI,EAAGA,GAAK,EAKnC,IAJAP,EAAWW,EAAIF,EAAUpB,MAAM,EAAGkB,GAAGa,KAAK,SAKtCpB,EAAWA,EAASD,IACN,CAEVE,EAAWD,EACXG,EAASG,EACT,MAMhB,GAAIL,EACA,OAMCG,GAAgBQ,GAAWA,EAAQb,KACpCK,EAAeQ,EAAQb,GACvBM,EAAQC,IAIXL,GAAYG,IACbH,EAAWG,EACXD,EAASE,GAGTJ,IACAH,EAAUqB,OAAO,EAAGhB,EAAQF,GAC5BL,EAAOE,EAAUsB,KAAK,MAI9B,OAAOxB,EAGX,SAASyB,EAAYC,EAASC,GAC1B,OAAO,WAIH,IAAIC,EAAOpC,EAAIM,KAAK+B,UAAW,GAQ/B,MAHuB,iBAAZD,EAAK,IAAmC,IAAhBA,EAAKX,QACpCW,EAAKE,KAAK,MAEPjD,EAAIkD,WAjJvB,EAiJoCH,EAAKN,OAAO,CAACI,EAASC,MAUtD,SAASK,EAASC,GACd,OAAO,SAAUC,GACblD,EAAQiD,GAAWC,GAI3B,SAASC,EAAQnC,GACb,GAAIL,EAAQV,EAASe,GAAO,CACxB,IAAI4B,EAAO3C,EAAQe,UACZf,EAAQe,GACfb,EAASa,IAAQ,EACjBpB,EAAKmD,WAtKjB,EAsK8BH,GAGtB,IAAKjC,EAAQX,EAASgB,KAAUL,EAAQR,EAAUa,GAC9C,MAAM,IAAIoC,MAAM,MAAQpC,GAE5B,OAAOhB,EAAQgB,GAMnB,SAASqC,EAAYrC,GACjB,IAAIsC,EACAC,EAAQvC,EAAOA,EAAKwC,QAAQ,MAAQ,EAKxC,OAJID,GAAS,IACTD,EAAStC,EAAKyC,UAAU,EAAGF,GAC3BvC,EAAOA,EAAKyC,UAAUF,EAAQ,EAAGvC,EAAKiB,SAEnC,CAACqB,EAAQtC,GAKpB,SAAS0C,EAAahB,GAClB,OAAOA,EAAUW,EAAYX,GAAW,GA+C5C,SAASiB,EAAW3C,GAChB,OAAO,WACH,OAAQd,GAAUA,EAAOA,QAAUA,EAAOA,OAAOc,IAAU,IAzCnElB,EAAU,SAAUkB,EAAM4C,GACtB,IAAIC,EAnDenB,EAoDfoB,EAAQT,EAAYrC,GACpBsC,EAASQ,EAAM,GACfC,EAAkBH,EAAS,GA2B/B,OAzBA5C,EAAO8C,EAAM,GAETR,IAEAO,EAASV,EADTG,EAASvC,EAAUuC,EAAQS,KAK3BT,EAEItC,EADA6C,GAAUA,EAAO9C,UACV8C,EAAO9C,UAAUC,GAlEb0B,EAkEiCqB,EAjE7C,SAAU/C,GACb,OAAOD,EAAUC,EAAM0B,MAkEZ3B,EAAUC,EAAM+C,IAK3BT,GADAQ,EAAQT,EADRrC,EAAOD,EAAUC,EAAM+C,KAER,GACf/C,EAAO8C,EAAM,GACTR,IACAO,EAASV,EAAQG,KAKlB,CACHU,EAAGV,EAASA,EAAS,IAAMtC,EAAOA,EAClCiD,EAAGjD,EACHkD,GAAIZ,EACJa,EAAGN,IAUX9D,EAAW,CACPN,QAAS,SAAUuB,GACf,OAAOyB,EAAYzB,IAEvBoD,QAAS,SAAUpD,GACf,IAAIqD,EAAIrE,EAAQgB,GAChB,YAAiB,IAANqD,EACAA,EAECrE,EAAQgB,GAAQ,IAGhCsD,OAAQ,SAAUtD,GACd,MAAO,CACHuD,GAAIvD,EACJwD,IAAK,GACLJ,QAASpE,EAAQgB,GACjBd,OAAQyD,EAAW3C,MAK/BpB,EAAO,SAAUoB,EAAMyD,EAAMC,EAAUhC,GACnC,IAAIiC,EAAW1B,EAAS2B,EAAK7C,EAAKL,EAAGkC,EAGjCiB,EAFAjC,EAAO,GACPkC,SAAsBJ,EAQ1B,GAHAd,EAAWF,EADXhB,EAAUA,GAAW1B,GAIA,cAAjB8D,GAAiD,aAAjBA,EAA6B,CAK7D,IADAL,GAAQA,EAAKxC,QAAUyC,EAASzC,OAAS,CAAC,UAAW,UAAW,UAAYwC,EACvE/C,EAAI,EAAGA,EAAI+C,EAAKxC,OAAQP,GAAK,EAK9B,GAAgB,aAHhBuB,GADAlB,EAAMjC,EAAQ2E,EAAK/C,GAAIkC,IACTI,GAIVpB,EAAKlB,GAAK3B,EAASN,QAAQuB,QACxB,GAAgB,YAAZiC,EAEPL,EAAKlB,GAAK3B,EAASqE,QAAQpD,GAC3B6D,GAAe,OACZ,GAAgB,WAAZ5B,EAEP0B,EAAY/B,EAAKlB,GAAK3B,EAASuE,OAAOtD,QACnC,GAAIL,EAAQX,EAASiD,IACjBtC,EAAQV,EAASgD,IACjBtC,EAAQR,EAAU8C,GACzBL,EAAKlB,GAAKyB,EAAQF,OACf,CAAA,IAAIlB,EAAIoC,EAIX,MAAM,IAAIf,MAAMpC,EAAO,YAAciC,GAHrClB,EAAIoC,EAAEY,KAAKhD,EAAIkC,EAAGxB,EAAYC,GAAS,GAAOM,EAASC,GAAU,IACjEL,EAAKlB,GAAK1B,EAAQiD,GAM1B2B,EAAMF,EAAWA,EAAS3B,MAAM/C,EAAQgB,GAAO4B,QAAQoC,EAEnDhE,IAII2D,QA1TpB,IA0TiCA,EAAUP,SACnBO,EAAUP,UAAYpE,EAAQgB,GAClChB,EAAQgB,GAAQ2D,EAAUP,aA5T9C,IA6T2BQ,GAAkBC,IAEzB7E,EAAQgB,GAAQ4D,SAGjB5D,IAGPhB,EAAQgB,GAAQ0D,IAIxBlF,EAAYC,EAAUI,EAAM,SAAU4E,EAAMC,EAAUhC,EAASC,EAAWsC,GACtE,GAAoB,iBAATR,EACP,OAAI1E,EAAS0E,GAEF1E,EAAS0E,GAAMC,GAMnBvB,EAAQrD,EAAQ2E,EAAMf,EAAagB,IAAWV,GAClD,IAAKS,EAAKlC,OAAQ,CAMrB,IAJArC,EAASuE,GACEA,MACP5E,EAAIK,EAAOuE,KAAMvE,EAAOwE,WAEvBA,EACD,OAGAA,EAASnC,QAGTkC,EAAOC,EACPA,EAAWhC,EACXA,EAAU,MAEV+B,OArWhB,EAkYQ,OAxBAC,EAAWA,GAAY,aAIA,mBAAZhC,IACPA,EAAUC,EACVA,EAAYsC,GAIZtC,EACA/C,OArXZ,EAqXwB6E,EAAMC,EAAUhC,GAQ5BwC,YAAW,WACPtF,OA9XhB,EA8X4B6E,EAAMC,EAAUhC,KAC7B,GAGA7C,GAOXA,EAAIK,OAAS,SAAUiF,GACnB,OAAOtF,EAAIsF,IAMf3F,EAAU4F,SAAWpF,GAErBN,EAAS,SAAUsB,EAAMyD,EAAMC,GAC3B,GAAoB,iBAAT1D,EACP,MAAM,IAAIoC,MAAM,6DAIfqB,EAAKlC,SAINmC,EAAWD,EACXA,EAAO,IAGN9D,EAAQX,EAASgB,IAAUL,EAAQV,EAASe,KAC7Cf,EAAQe,GAAQ,CAACA,EAAMyD,EAAMC,MAI9BW,IAAM,CACTC,QAAQ,GAtahB,GA0aA5F,EAAO,cAAc,eAIrB6F,OAAOC,MAAQD,OAAOC,OAAS,QAGZR,IAAfS,MAAMC,OAERD,MAAMnF,UAAUoF,KAAO,WACrBC,KAAKC,kBACLD,KAAKE,mBAIT,MAAMC,EAAW,IAAIC,OAAO,YAAc,KAC1CC,OAAO1F,UAAU2F,MAAQ,WACvB,MAAO,IAAMN,KAAKvD,QAAQ0D,EAAU,QAAU,KAGhD,MAAMI,EAAY,IAAIH,OAAO,YAAc,KAC3CC,OAAO1F,UAAU6F,YAAc,WAC7B,OAAOR,KAAKvD,QAAQ8D,EAAW,SAGjC,MAAME,EAAW,IAAIL,OAAO,qBAAsB,KAC5CM,EAAW,IAAIN,OAAO,UAAW,KA8BvC,SAASO,EAAiBC,GAExB,KAAOA,EAAKC,YACVD,EAAKE,YAAYF,EAAKC,YAM1B,SAASE,EAAgBrC,GACvB,OAAKA,EAAU,UAAiB,GAAXA,EAAEsC,QACdtC,EAAEuC,SACJvC,EAAEsC,QAGX,SAASE,EAAUC,GACjB,OAAQ,IAAMA,EAAIC,SAAS,KAAKC,QAAQ,GA7C1ChB,OAAO1F,UAAU2G,QAAU,WACzB,OAAOtB,KAAKuB,cAAc9E,QAAQgE,EAAU,IAAIhE,QAAQiE,EAAU,MAIpEc,YAAY7G,UAAU8G,YAAc,SAAUC,EAAIC,GAChD,MAAMC,EAAK5B,KAAK6B,UACZD,EAAGE,SAASJ,IACdE,EAAGG,IAAIJ,GACPC,EAAGI,OAAON,KAGVE,EAAGI,OAAOL,GACVC,EAAGG,IAAIL,KAKXF,YAAY7G,UAAUsH,KAAO,SAAUC,GACrC,OAAOlC,KAAKmC,YAAYC,SAASC,cAAcH,KAIjDV,YAAY7G,UAAU2H,KAAO,SAAUC,GACrC,OAAOvC,KAAKmC,YAAYC,SAASI,eAAeD,KAuClDxI,EAAO,OAAO,IAAG,WAEf8F,MAAM4C,IAAM5C,MAAM4C,KAAO,GACzB5C,MAAM6C,OAAS7C,MAAM6C,QAAU,GAE/B,MAAMC,EAAM9C,MAAM6C,OAsBlB,OArBAC,EAAIC,GAAMD,EAAIC,IAAO,KACrBD,EAAIE,IAAMF,EAAIE,KAAO,MAGrBhD,MAAMiD,cAAgB,WACpB,QAAqBzD,IAAjBQ,MAAMkD,OAAsB,CAC9B,MAAMC,EAAQZ,SAASC,cAAc,SACrCD,SAASa,KAAKd,YAAYa,GAC1BnD,MAAMkD,OAASC,EAAME,MAEvB,OAAOrD,MAAMkD,QAKflD,MAAMsD,IAAMtD,MAAMsD,KAAO,SAAUC,EAAMC,EAAKC,GACxCA,IACFD,GAAO,SAAWC,GACpBC,QAAQJ,IAAIC,EAAO,KAAOC,IAGrBxD,SAGTA,MAAM2D,iBAAmB3D,MAAM2D,kBAAoB,CAAEC,IAAM,IAI3D1J,EAAO,iBAAiB,CAAC,SAAS,WAEhC,MAAM2J,EAAK7D,MAAM2D,iBA0EjB,OAxEAE,EAAGC,QAAU,SAAUC,EAAcrG,GAEnC,IAAKqG,EACH,OAEF,IAAIC,EAAO7D,KAAK4D,GAEhB,GAAKC,EAAL,CAGA,GAAKtG,EAAMuG,SAAS,KAApB,CAmBK,CACH,MAAMC,EAAIxG,EAAMpB,MAAM,KACtB,IAAI6H,EAAKD,EAAE,GAAK,IACZE,EAAKF,EAAE,GAAK,IACZxB,EAAO,GAGX,IAAK,IAAIxG,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMiI,EAAI,CAChBH,EAAK9H,GAAG,GACVwG,GAAQsB,EAAK9H,GAAG,GAEhBwG,GAAQsB,EAAK9H,GAAG,GAClB,MAKJ,GAAoB,IAAhBwG,EAAKjG,OACP,OAKF,GAFAuH,EAAO7D,KAAK4D,EAAeI,IAEtBH,EACH,OAGF,IAAK,IAAI9H,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMkI,EAIhB,OAHIJ,EAAK9H,GAAG,KACVwG,GAAQ,KAAOsB,EAAK9H,GAAG,IAElBwG,EAKb,MAAO,GA1DLhF,GAAS,IAKT,IAAK,IAAIxB,EAAI,EAAGA,EAAI8H,EAAKvH,OAAQP,IAC/B,GAAI8H,EAAK9H,IACL8H,EAAK9H,GAAG,IAAMwB,EAChB,OAAIsG,EAAK9H,GAAG,GACH8H,EAAK9H,GAAG,QAEf,IAkDH2H,KAGT3J,EAAO,sBAAsB,CAAC,mBAAmB,SAAU2J,GACzDA,EAAG,KAAKvG,KACN,CAAC,kBAAmB,UAAW,cAGjCuG,EAAG,WAAa,CACd,CAAC,IAAK,IAAK,YACX,CAAC,IAAK,IAAK,aACX,CAAC,IAAK,IAAK,YAIf3J,EAAO,wBAAwB,CAAC,mBAAmB,SAAU2J,GAC3DA,EAAG,KAAKvG,KACN,CAAC,SAAU,YAAa,iBAI5BrD,EAAQ,CACN,sBACA,0BAGFC,EAAO,WAAW,eAclBA,EAAO,YAAY,CASjBmK,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOlE,MAAMoE,MAAMD,IAUnCE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOTuE,QAAU,SAAUA,GAGlB,OAFyB,IAArBrH,UAAUZ,SACZ0D,KAAKwE,SAAWpC,SAASI,eAAe+B,IACnCvE,KAAKwE,UAOdC,OAAS,SAAUA,GAGjB,OAFyB,IAArBvH,UAAUZ,SACZ0D,KAAK0E,QAAUD,GACVzE,KAAK0E,SAQdC,QAAU,WACR,OAAO3E,KAAK4E,UASdC,OAAS,SAAUC,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,UACZgD,EACPlD,EAAGG,IAAI,UAEPH,EAAGI,OAAO,WAWdgD,OAAS,SAAUF,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,WACZgD,EACPlD,EAAGG,IAAI,WAEPH,EAAGI,OAAO,YAMd+C,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMC,EAAK9C,SAASC,cAAc,MAUlC,YAPwBhD,IAApBW,KAAc,UAChBkF,EAAY,QAAIlF,KAAKmF,QAAQC,KAAKpF,OAIpCkF,EAAG/C,YAAYnC,KAAKuE,WAEbvE,KAAKiF,IAAMC,GAQpBG,UAAY,SAAU1H,GAGpB,GAAIqC,KAAKsF,UAAY3H,EACnB,OAGmB,OAAjBqC,KAAKsF,SACPtF,KAAKuF,WAGP,MAAMC,EAAWxF,KAAK+E,UAAUU,WAChC,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAQ,EAAGP,GAAK,EAAGA,IACvCiE,KAAK0F,WAAWF,EAASzJ,GAAI4B,GAG/BqC,KAAKsF,QAAU3H,GAOjB4H,SAAW,WACT,GAAqB,OAAjBvF,KAAKsF,QACP,OAEF,MAAM5G,EAAIsB,KAAK+E,UAETY,EAAQjH,EAAEkH,qBAAqB,QAErC,IAAK,IAAI7J,EAAI4J,EAAMrJ,OAAS,EAAGP,GAAK,EAAGA,IAGrC4J,EAAM5J,GAAG8J,WAAWC,aAEnB1D,SAASI,eACPmD,EAAM5J,GAAG8E,WAAWkF,WAEtBJ,EAAM5J,IAKT2C,EAAEtD,YACF4E,KAAKsF,QAAU,MAKjBI,WAAa,SAAUM,EAAMC,GAC3B,GAAsB,IAAlBD,EAAKE,SAAgB,CAEvB,MAAM3D,EAASyD,EAAKD,UACdI,EAAS5D,EAAKhB,cAGpB,GAAI0E,EAAc,CAOhB,MAAMG,GAFNH,EAAeA,EAAaI,QAEElK,MAAM,KAEpC,IAAImK,EACAC,GAAO,EACPC,EAAM,EAqBV,GAjBAJ,EAASK,SAAQ,SAAS1K,GAGxBuK,EAAUH,EAAOtI,QAAQ9B,GACrBuK,EAAU,KAGD,IAATC,GAAcD,EAAUC,GAC1BA,EAAMD,EACNE,EAAMzK,EAAEO,QAEDgK,IAAYC,GAAOxK,EAAEO,OAASkK,IACrCA,EAAMzK,EAAEO,YAKRiK,GAAO,EAAG,CAGTA,EAAM,GACRP,EAAKH,WAAWa,aACdtE,SAASI,eAAeD,EAAKlB,OAAO,EAAGkF,IACvCP,GAKJ,MAAMW,EAAKvE,SAASC,cAAc,QAClCsE,EAAGxE,YACDC,SAASI,eAAeD,EAAKlB,OAAOkF,EAAKC,KAE3CR,EAAKH,WAAWa,aAAaC,EAAIX,GAGjC,MAAMY,EAAQrE,EAAKlB,OAAOkF,EAAMC,GAEhC,GAAII,EAAMtK,OAAS,EAAG,CACpB,MAAMuK,EAASzE,SAASI,eAAeoE,GACvCZ,EAAKH,WAAWa,aACdG,EACAb,GAEFhG,KAAK0F,WAAWmB,EAAQZ,GAGzBD,EAAKH,WAAW/E,YAAYkF,SAK7B,CACH,MAAMR,EAAWQ,EAAKP,WACtB,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAQ,EAAGP,GAAK,EAAGA,IACxCiE,KAAK0F,WAAWF,EAASzJ,GAAIkK,KAMlC7B,MAAQ,SAAUD,GAEhB,QAAkB9E,IAAd8E,EAAO,GACT,MAAM,IAAI1G,MAAM,sBAGlB,MAAMqJ,EAAI9G,KAcV,OAZA8G,EAAEvC,QAAQJ,EAAO,IAEbA,EAAO7H,OAAS,IAClBwK,EAAEpC,QAAUP,EAAO,GAEfA,EAAO7H,OAAS,IAClBwK,EAAEC,SAAW5C,EAAO,KAGxB2C,EAAElC,SAAW,IAAMkC,EAAEvC,UAAUyC,YAAYzF,cAC3CuF,EAAExB,QAAU,KAELtF,MAOTmF,QAAU,SAAUzG,GAClB,MAAMuI,EAAIjH,KAAKkH,OAGfD,EAAEtJ,OAAO,IAELqC,KAAK+G,UACP/G,KAAK+G,SAAS3J,MAAM4C,KAAMtB,GAE5BuI,EAAEE,QAOJD,KAAO,WACL,OAAOlH,KAAKoH,SAMhBrN,EAAO,cAAc,CAKnBmK,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WACN,MAAM0C,EAAI9G,KAYV,OAVA8G,EAAEO,QAAU,GAGZP,EAAE7B,IAAM7C,SAASC,cAAc,QAC/ByE,EAAE7B,IAAIpD,UAAUE,IAAI,aAGC1C,IAAjByH,EAAW,UACbA,EAAE7B,IAAa,QAAI6B,EAAE3B,QAAQC,KAAK0B,IAE7BA,GAITQ,QAAU,WACR,OAAOtH,KAAKiF,IAAIsC,UACZvH,KAAKqH,SAUXhD,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOT6E,OAAS,SAAUC,GACjB,MAAMlD,EAAK5B,KAAK+E,UAAUlD,UAC1B,QAAaxC,IAATyF,EACF,OAAOlD,EAAGE,SAAS,UACZgD,EACPlD,EAAGG,IAAI,UAEPH,EAAGI,OAAO,WAOdwF,MAAQ,WACN,OAAOxH,KAAKqH,QAAQ/K,OAAS,GAQ/BiB,MAAQ,SAAUkK,GAChB,OAAyB,IAArBvK,UAAUZ,QACZ0D,KAAKqH,QAAUI,EACRzH,KAAKsH,WAEPtH,KAAKqH,SAOdtF,IAAM,SAAU0F,GAEd,OADAzH,KAAKqH,SAAWI,EACTzH,KAAKsH,WAOdI,MAAQ,WAEN,OADA1H,KAAKqH,QAAU,GACRrH,KAAKsH,WAQdnC,QAAU,aAMVwC,KAAO,WACL,MAAMb,EAAI9G,KAYV,OATI8G,EAAEO,QAAQ/K,OAAS,EACrBwK,EAAEO,QAAUP,EAAEO,QAAQvJ,UACrB,EAAGgJ,EAAEO,QAAQ/K,OAAS,GAIvBwK,EAAEO,QAAU,GAGPP,EAAEQ,WAOXvC,QAAU,WACR,OAAO/E,KAAKiF,KAOdiC,KAAO,WACL,OAAOlH,KAAKoH,SAMhBrN,EAAO,mBAAmB,CAKxBmK,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WAGN,OAFApE,KAAKiF,IAAM7C,SAASC,cAAc,OAClCrC,KAAKiF,IAAIpD,UAAUE,IAAI,eAChB/B,MAUTqE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAOT+E,QAAU,WACR,OAAO/E,KAAKiF,KAOdlD,IAAM,SAAU6F,GACd5H,KAAKiF,IAAI9C,YAAYC,SAASC,cAAc,SACzCF,YAAYC,SAASI,eAAeoF,EAAM,GAAK,QAOpDC,MAAQ,WACN,KAAO7H,KAAKiF,IAAIpE,YACdb,KAAKiF,IAAIpE,WAAWmB,YAc1BjI,EAAO,cAAc,CAQnBmK,OAAS,SAAUgD,GACjB,OAAOxM,OAAOwJ,OAAOlE,MAAMoE,MAAM8C,IAUnC5K,OAAS,SAAUP,GACjB,OAAyB,IAArBmB,UAAUZ,OACL0D,KAAK8H,SACV/L,GAAKiE,KAAK8H,UAEd9H,KAAK8H,QAAU/L,GADNiE,OAWX+H,MAAQ,SAAUhM,GAChB,OAAyB,IAArBmB,UAAUZ,OACL0D,KAAKgI,QACVjM,GAAKiE,KAAKgI,SAEdhI,KAAKgI,OAASjM,GADLiE,OAWX6E,OAAS,SAAUC,GAajB,OAZyB,IAArB5H,UAAUZ,SACRwI,EACE9E,KAAKiI,UACRjI,KAAKiF,IAAIpD,UAAUE,IAAI,UACvB/B,KAAKiI,SAAU,GAGTjI,KAAKiI,UACbjI,KAAKiF,IAAIpD,UAAUG,OAAO,UAC1BhC,KAAKiI,SAAU,IAGXjI,KAAKiI,SASdC,UAAY,SAAUC,GAGpB,MACMC,EAAkBD,GADJnI,KAAKqI,aAAerI,KAAKsI,eAIvCC,EAAMvI,KAAKwI,OACfC,SAASL,EAAiBpI,KAAK0I,UAAY1I,KAAK2I,OAAOC,iBAG7CvJ,IAARkJ,GACFvI,KAAKoH,MAAMyB,OAAON,IAUtBO,UAAY,SAAUC,GACpB,MAAMC,EAAaD,EAAS/I,KAAKqI,aAC3BE,EAAMvI,KAAKwI,OAAOC,SAASO,GAAahJ,KAAK0I,SAAW,UAElDrJ,IAARkJ,GACFvI,KAAKoH,MAAMyB,OAAON,IAUtBC,OAAS,SAAUD,GACjB,OAAyB,IAArBrL,UAAUZ,OACL0D,KAAKiJ,SAGVV,EAAMvI,KAAK0I,SACbH,EAAMvI,KAAK0I,SACJH,EAAM,IACbA,EAAM,GAGJA,IAAQvI,KAAKiJ,SAIjBjJ,KAAKiJ,QAAUV,EACfvI,KAAKkJ,QAAQC,MAAMC,IAAOpJ,KAAKqJ,MAAQd,EAAO,IACvCA,QANP,IAaFxD,QAAU,WACR,OAAO/E,KAAKiF,KAQdqE,OAAS,WAEP,MAAMxC,EAAI9G,KACJuJ,EAAIzC,EAAE7B,IAAIkE,MAGZrC,EAAEgB,SAAWhB,EAAEkB,OACjBuB,EAAEC,QAAU,QAIZD,EAAEC,QAAU,QAGd1C,EAAE2C,QAAa3C,EAAEkB,OAASlB,EAAEgB,QAAW,IACvChB,EAAE4B,SAAW5B,EAAEgB,QAAUhB,EAAEkB,OAC3BlB,EAAEuC,OAAY,IAAMvC,EAAE2C,SAAW3C,EAAE4B,SACnC5B,EAAEoC,QAAQC,MAAMO,OAAS5C,EAAE2C,QAAU,MAKvCrF,MAAQ,SAAU8C,GAChB,MAAMJ,EAAI9G,KAEV8G,EAAEM,MAAQF,EAEVJ,EAAEmC,QAAU,EACZnC,EAAE6B,OAAS,GACX7B,EAAEmB,SAAU,EAEZ,MAAM0B,EAAK7C,EAAE7B,IAAM7C,SAASC,cAAc,OAmB1C,OAlBAsH,EAAGC,aAAa,QAAS,SAEzB9C,EAAEoC,QAAUS,EAAGxH,YACbC,SAASC,cAAc,SAGzByE,EAAE+C,OAASF,EAAGxH,YAAYC,SAASC,cAAc,QAGjDyE,EAAE+C,OAAOC,iBAAiB,aAAa,SAAUpL,GAC/CA,EAAEqB,UACD,GAGH+G,EAAE+C,OAAOC,iBAAiB,QAAShD,EAAEiD,YAAY3E,KAAK0B,IAAI,GAE1DA,EAAEoC,QAAQY,iBAAiB,YAAahD,EAAEkD,WAAW5E,KAAK0B,IAAI,GAEvDA,GAKTmD,kBAAoB,WAClBjK,KAAKqI,aAAgBrI,KAAKiF,IAAIiF,aAC9BlK,KAAKsI,cAAgBtI,KAAKkJ,QAAQgB,cAKpCC,WAAa,SAAUzL,GACrBsB,KAAKkI,UAAUxJ,EAAE0L,QAAUpK,KAAK2I,OAAO0B,MACvC3L,EAAEqB,QAKJuK,SAAW,SAAU5L,GACnBsB,KAAK6E,QAAO,GACZjF,OAAO2K,oBAAoB,YAAavK,KAAK2I,OAAO6B,KACpD5K,OAAO2K,oBAAoB,UAAWvK,KAAK2I,OAAO8B,IAClDzK,KAAKoH,MAAMsD,SAKbV,WAAa,SAAUtL,GAErB,MAAMiM,EAAK3K,KAAK2I,OAGhBgC,EAAGN,KAAO3L,EAAE0L,QACZO,EAAG/B,WAAa5I,KAAKiJ,QAGrB0B,EAAGH,IAAOxK,KAAKmK,WAAW/E,KAAKpF,MAC/B2K,EAAGF,GAAOzK,KAAKsK,SAASlF,KAAKpF,MAG7BA,KAAKiK,oBAELjK,KAAK6E,QAAO,GAEZjF,OAAOkK,iBAAiB,YAAaa,EAAGH,KACxC5K,OAAOkK,iBAAiB,UAAWa,EAAGF,IAEtC/L,EAAEqB,QAKJgK,YAAc,SAAUrL,GACtBsB,KAAKiK,oBAELjK,KAAK8I,UACHpK,EAAE0L,QAAUpK,KAAK6J,OAAOe,iBAAiB,GAAGxB,KAE9C1K,EAAEqB,UAsBNhG,EAAO,OAAO,CACZ,YACA,cACA,mBACA,cACA,SACC,SAAU8Q,EACAC,EACAC,EACAC,GAUX,MAAO,CAcL9G,OAAS,SAAU+G,EAAM9G,GACvB,OAAOzJ,OAAOwJ,OAAOlE,MAAMoE,MAAM6G,EAAM9G,IAIzCC,MAAQ,SAAU6G,EAAM9G,QAEP9E,IAAX8E,IACFA,EAAS,IAEX,MAAM2C,EAAI9G,KAEV8G,EAAEoE,WAAa/G,EAAkB,WAAK0G,OAGRxL,IAA1B8E,EAAoB,YACtB2C,EAAExB,QAAUnB,EAAoB,YAAED,SAGlC4C,EAAExB,QAAUwF,EAAmB5G,SAEjC4C,EAAExB,QAAQ8B,MAAQN,OAGiBzH,IAA/B8E,EAAyB,iBAC3B2C,EAAEqE,aAAehH,EAAyB,iBAAED,SAG5C4C,EAAEqE,aAAeJ,EAAwB7G,SAE3C4C,EAAEqE,aAAa/D,MAAQN,EAGvBA,EAAEoC,QAAU8B,EAAY9G,OAAO4C,GAG/B,IAAI6C,EAAKvH,SAASC,cAAc,MAkDhC,OAjDAsH,EAAGR,MAAMiC,QAAU,EACnBzB,EAAGC,aAAa,WAAY,GAC5BD,EAAG9H,UAAUE,IAAI,OAAQ,QACzB4H,EAAGxH,YAAY2E,EAAExB,QAAQP,WACzB4E,EAAGxH,YAAY2E,EAAEqE,aAAapG,WAC9B4E,EAAGxH,YAAY2E,EAAEoC,QAAQnE,WAGzB4E,EAAS,KAAI7C,EAGb6C,EAAGG,iBACD,UACAhD,EAAEuE,SAASjG,KAAK0B,IAChB,GAIF6C,EAAGG,iBACD,WACAhD,EAAEwE,UAAUlG,KAAK0B,IACjB,GAIF6C,EAAGG,iBACD,QACAhD,EAAEyE,YAAYnG,KAAK0B,IACnB,GAIF,CAAC,aAAc,WAAY,aAAaL,QACtC/H,GAAKiL,EAAGG,iBAAiBpL,EAAGoI,EAAE0E,OAAOpG,KAAK0B,IAAI,IAIhDA,EAAE7B,IAAM0E,EAER7C,EAAEkB,OAjGY,EAmGdlB,EAAE2E,OAAS,IAAIC,MAIf5E,EAAE6E,UAAUV,GAEZnE,EAAE8E,UAAW,EAEN9E,GAIT6E,UAAY,SAAUV,GACpB,MAAMnE,EAAI9G,KAEV8G,EAAE+E,WAAQxM,EAGV,IAAK,IAAItD,EAAI,EAAGA,EAAI+K,EAAE2E,OAAOnP,OAAQP,WAC5B+K,EAAE2E,OAAO1P,GAAU,aACnB+K,EAAE2E,OAAO1P,GAGlB+K,EAAE2E,OAAS,IAAIC,MACf5E,EAAEgF,cAIFhF,EAAEqE,aAAatD,QAGfoD,EAAKxE,SAAQ,SAAS1K,GACpB,MAAMd,EAAM+E,KAAKkL,WAAWhH,OAAOnI,GAGnCd,EAAW,MAAI+E,KACfA,KAAKmL,aAAapJ,IAAIhG,GACtBiE,KAAKyL,OAAOtO,KAAKlC,KAChB6L,GAEHA,EAAEoC,QAAQ5M,OAAOwK,EAAEiF,cAChBhE,MAAMjB,EAAEkB,QACRsB,SAEHxC,EAAEkF,cAAe,EAEjBlF,EAAE0B,OAAS,EACX1B,EAAEmF,SAAW,GAIfC,UAAY,WACV,MAAMpF,EAAI9G,KAeV,QAZgBX,IAAZyH,EAAE+E,MACJ/E,EAAE+E,MAAQ,GAEgB,IAAnB/E,EAAE+E,MAAMvP,SACfwK,EAAEqF,WAAU,GACZrF,EAAE+E,MAAMvP,OAAS,GAInBwK,EAAE0B,OAAS,EAGP1B,EAAEnJ,SAASrB,QAAU,EAAG,CAG1B,IAAIP,EAAI,EACR,KAAOA,EAAI+K,EAAE2E,OAAOnP,OAAQP,IAC1B+K,EAAE+E,MAAM1O,KAAKpB,GACb+K,EAAE2E,OAAO1P,GAAGwJ,WAKd,OAFAuB,EAAEoC,QAAQ5M,OAAOP,GAAGuN,UAEb,EAOT,MAAM8C,EAAatF,EAAEnJ,SAAS4D,cAAcpF,MAAM,KAGlD,IAAIkQ,EAAY,EAiChB,OA7BAvF,EAAE2E,OAAOhF,SAAQ,SAAS6F,EAAI/F,GAE5B,IAAIgG,EAAS,EAEbH,EAAW3F,SAAQ,SAASjI,GAGrB8N,EAAG3H,UAAUb,SAAS,IAAMtF,GAC/B+N,GAAU,EAIHD,EAAG3H,UAAUb,SAAStF,KAC7B+N,GAAU,MAIVA,EAASF,GACXrM,KAAK6L,MAAQ,CAACtF,GACd8F,EAAYE,GAELA,GAAUF,GACjBrM,KAAK6L,MAAM1O,KAAKoJ,KAEjBO,GAEHA,EAAEoC,QAAQ5M,OAAOwK,EAAE+E,MAAMvP,QAAQgN,SAG1BxC,EAAE+E,MAAMvP,OAAS,GAS1BkQ,QAAU,WACR,MAAM1F,EAAI9G,KAGGX,MAATyH,EAAE7B,YACG6B,EAAE7B,IAAU,KAGrB6B,EAAE2E,OAAOhF,SAAQ,SAAS1K,UACjBA,EAAS,gBAIX+K,EAAExB,QAAe,aACjBwB,EAAEqE,aAAoB,aACtBrE,EAAEoC,QAAe,OAO1BwB,MAAQ,WACN1K,KAAKiF,IAAIyF,SAKXa,YAAc,SAAU7M,GACtB,MAAM+N,EAAQ/N,EAAEgO,OAAS,IACrBD,EAAQ,EACVzM,KAAK2M,OACEF,EAAQ,GACfzM,KAAK4M,OACPlO,EAAEqB,QAKJyL,OAAS,SAAU9M,GACPsB,KAAK6M,SAEf,GAAe,eAAXnO,EAAE0E,KACJpD,KAAK8M,WAAapO,EAAEqO,QAAQ,GAAG3C,aAE5B,GAAe,aAAX1L,EAAE0E,KACTpD,KAAK8M,gBAAazN,OAEf,GAAe,cAAXX,EAAE0E,KAAsB,CAC/B,MAAM4J,EAAKtO,EAAEqO,QAAQ,GAOhB/M,KAAK8M,WAAa,GAAME,EAAG5C,SAC9BpK,KAAKiN,WACLjN,KAAK8M,WAAaE,EAAG5C,SAEbpK,KAAK8M,WAAa,GAAME,EAAG5C,UACnCpK,KAAKkN,SACLlN,KAAK8M,WAAaE,EAAG5C,SAEvB1L,EAAEqB,SAKNsL,SAAW,SAAU3M,GACnB,MAAMoI,EAAI9G,KAEV,OAAQe,EAAerC,IAEvB,KAAK,GACHA,EAAEqB,OACF+G,EAAEK,OACF,MAEF,KAAK,GACHzI,EAAEqB,OACF+G,EAAE8F,OACF,MAEF,KAAK,GACHlO,EAAEqB,OACF+G,EAAEqG,SACF,MAEF,KAAK,GACHzO,EAAEqB,OACF+G,EAAE6F,OACF,MAEF,KAAK,GACHjO,EAAEqB,OACF+G,EAAEsG,WACF,MAEF,KAAK,GACH,GAAItG,EAAExB,QAAQT,SACZ,MAEF,MAAMwI,EAAOvG,EAAEwG,SAASxG,EAAEmF,eAEF5M,IAApBgO,EAAc,SAChBA,EAAc,QAAEjI,KAAKiI,GAAMjQ,QAG7BsB,EAAEqB,OACF,MAEF,KAAK,GAEC+G,EAAExB,QAAQT,SACZiC,EAAExB,QAAQH,QAAQzG,GAIlBoI,EAAEwG,SAASxG,EAAEmF,UAAU9G,QAAQzG,GACjCA,EAAEqB,OACF,MAEF,KAAK,EACH+G,EAAExB,QAAQqC,OACVb,EAAEyG,OACF7O,EAAEqB,SAONuL,UAAY,SAAU5M,GACD,IAAfA,EAAEuC,WACJvC,EAAEqB,OAGFC,KAAKsF,QAAQvD,IACX1B,OAAOmN,aAAazM,EAAerC,KAGrCsB,KAAKuN,SAST1E,OAAS,SAAU4E,GACjB,MAAM3G,EAAI9G,KAGV,GAAIyN,EAAK,EACPA,EAAK,MAIF,CAAA,GAAI3G,EAAEiF,aAAejF,EAAEiB,QAC1B,OAAO,EAIA0F,EAAM3G,EAAEiF,aAAejF,EAAEiB,UAChC0F,EAAM3G,EAAEiF,aAAejF,EAAEiB,SAI3B,OAAIjB,EAAE0B,SAAWiF,IAGjB3G,EAAE4G,WAAWD,IAEN,IAOT1I,QAAU,WACR,OAAO/E,KAAKiF,KAOd0I,UAAY,WACV,OAAO3N,KAAKkL,YAQdnD,MAAQ,SAAUA,GAChB,OAAyB,IAArB7K,UAAUZ,QACR0D,KAAKgI,SAAWD,IAClB/H,KAAKgI,OAASD,EACd/H,KAAKkJ,QAAQnB,MAAMA,GAAOuB,UAErBtJ,MAEFA,KAAKgI,QAUd3D,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAUTuN,KAAO,SAAU1I,GACf,MAAMiC,EAAI9G,KAOV,GAJA8G,EAAE8G,UACF9G,EAAEgF,eAGGhF,EAAEoF,YAQL,OALApF,EAAExB,QAAQT,QAAO,GAGjBiC,EAAE7B,IAAIpD,UAAUE,IAAI,YAEb,EAGT,IAAIyG,EAAS,EAGb,GAAyB,IAArBtL,UAAUZ,OAAc,CAW1B,GARIuI,EAAS,EACXA,EAAS,EAEFA,GAAUiC,EAAEiF,eACnBlH,EAASiC,EAAEiF,aAAe,GAIxBlH,GAAUiC,EAAEkB,OAAQ,CACtBQ,EAAS3D,EACT,MAAMgJ,EAAY/G,EAAEiF,aAAejF,EAAEkB,OACjCQ,EAASqF,IACXrF,EAASqF,GAIb/G,EAAEmF,SAAWpH,OAINiC,EAAEkF,aACTlF,EAAEmF,SAAW,EAKbnF,EAAEmF,UAAY,EAoBhB,OAjBAnF,EAAE0B,OAASA,EACX1B,EAAE4G,WAAWlF,IAGO,IAAhB1B,EAAEmF,UACJnF,EAAEwG,SAASxG,EAAEmF,UAAUpH,QAAO,GAIhCiC,EAAExB,QAAQT,QAAO,GAGjBiC,EAAE7B,IAAIpD,UAAUE,IAAI,WAGpB+E,EAAEqF,WAAU,IAEL,GAOThF,KAAO,WACAnH,KAAK4L,WACR5L,KAAK8L,cACL9L,KAAKsF,QAAQoC,QACb1H,KAAK8N,SACL9N,KAAKiF,IAAIpD,UAAUG,OAAO,aAU9B8L,OAAS,aAOTnQ,OAAS,SAAUoQ,GACjB,OAAyB,IAArB7Q,UAAUZ,QACZ0D,KAAKsF,QAAQ/H,MAAMwQ,GACZ/N,MAEFA,KAAKsF,QAAQ/H,SAOtByQ,YAAc,WACZ,OAAOhO,KAAKmL,cAOd0B,OAAS,WACP,OAAO7M,KAAKkJ,SAOd4C,YAAc,WAEZ,MAAMtG,EAAWxF,KAAKiF,IAAIQ,WAG1B,IAAK,IAAI1J,EAAIyJ,EAASlJ,OAAS,EAAGP,GAAK,EAAGA,IACxCiE,KAAKiF,IAAInE,YACP0E,EAASzJ,KAWfsR,KAAO,SAAUzP,GACf,OAAOoC,KAAKyL,OAAO7N,IAUrB0P,SAAW,SAAU1P,GACnB,QAAmByB,IAAfW,KAAK6L,OACF7L,KAAKkM,YAGZ,OAAOlM,KAAKyL,OAAOzL,KAAK6L,MAAMjO,KAUhCqQ,UAAY,SAAUrQ,GACpB,KAAIA,GAASoC,KAAK+H,SAGlB,OAAO/H,KAAKsN,SAAStN,KAAKwI,OAAS5K,IAOrCtB,OAAS,WACP,OAAO0D,KAAKyL,OAAOnP,QAOrByP,WAAa,WAGX,YAFmB1M,IAAfW,KAAK6L,OACP7L,KAAKkM,YACAlM,KAAK6L,MAAMvP,QAOpBqQ,KAAO,WACL,MAAM7F,EAAI9G,KAGV,GAAuB,IAAnB8G,EAAEiF,aACJ,QAGkB,IAAhBjF,EAAEmF,UAAoBnF,EAAExB,QAAQT,UAClCiC,EAAEwG,SAASxG,EAAEmF,UAAUpH,QAAO,GAIhCiC,EAAEmF,WACF,IAAIiC,EAAUpH,EAAEwG,SAASxG,EAAEmF,UAG3B,QAAgB5M,IAAZ6O,EAAuB,CAGzB,MAAMvQ,EAASqC,KAAKsF,QAGpB,GAAI3H,EAAO6J,UAAY7J,EAAOkH,SAG5B,OAFAiC,EAAEmF,gBACFtO,EAAOkH,QAAO,GAMdqJ,EAAUpH,EAAEwG,SAAS,GAErBxG,EAAEmF,SAAW,EACbnF,EAAE4G,WAAW,QAKR5G,EAAEmF,UAAanF,EAAEiB,QAAUjB,EAAE0B,OACpC1B,EAAE+B,OAAO/B,EAAEmF,SAAWnF,EAAEiB,QAAU,GAI3BjB,EAAEmF,UAAYnF,EAAE0B,QACvB1B,EAAE+B,OAAO/B,EAAEmF,UAGbnF,EAAExB,QAAQT,QAAO,GACjBqJ,EAAQrJ,QAAO,IAOjB+H,KAAO,WACL,MAAM9F,EAAI9G,KAGV,GAAuB,IAAnB8G,EAAEiF,aACJ,OAGGjF,EAAExB,QAAQT,YAGO,IAAhBiC,EAAEmF,SACJnF,EAAEmF,SAAWnF,EAAEiF,aAKfjF,EAAEwG,SAASxG,EAAEmF,YAAYpH,QAAO,IAKpC,IAAIqJ,EAAUpH,EAAEwG,SAASxG,EAAEmF,UAG3B,QAAgB5M,IAAZ6O,EAAuB,CAGzB,MAAMvQ,EAASmJ,EAAExB,QACjB,IAAIkD,EAAU1B,EAAEiF,aAAejF,EAAEiB,QASjC,GANAS,EAASA,EAAS,EAAI,EAAIA,EAG1B1B,EAAEmF,SAAWnF,EAAEiF,aAAe,EAG1BpO,EAAO6J,UAAY7J,EAAOkH,SAI5B,OAHAiC,EAAEmF,WACFtO,EAAOkH,QAAO,QACdiC,EAAE0B,OAASA,GAMX0F,EAAUpH,EAAEwG,SAASxG,EAAEmF,UACvBnF,EAAE4G,WAAWlF,QAKR1B,EAAEmF,SAAWnF,EAAE0B,OACtB1B,EAAE+B,OAAO/B,EAAEmF,UAIJnF,EAAEmF,UAAanF,EAAEiB,QAAUjB,EAAE0B,QACpC1B,EAAE+B,OAAO/B,EAAEmF,SAAWnF,EAAEiB,QAAU,GAGpCjB,EAAExB,QAAQT,QAAO,GACjBqJ,EAAQrJ,QAAO,IAOjBsI,OAAS,WACPnN,KAAK6I,OAAO7I,KAAKwI,OAASxI,KAAK+H,UAOjCqF,SAAW,WACTpN,KAAK6I,OAAO7I,KAAKwI,OAASxI,KAAK+H,UAOjCmF,OAAS,WACPlN,KAAK6I,OAAO7I,KAAKwI,OAAS,IAO5ByE,SAAW,WACTjN,KAAK6I,OAAO7I,KAAKwI,OAAS,IAK5BoF,QAAU,WACR5N,KAAK6L,MAAMpF,SAAQ,SAAS6F,GAC1B,MAAMe,EAAOrN,KAAKyL,OAAOa,GACzBe,EAAK9H,WACL8H,EAAKxI,QAAO,KACX7E,OAKLmM,UAAY,SAAUrH,GACM,IAAtB9E,KAAK6L,MAAMvP,SAGf0D,KAAKqN,KAAKrN,KAAK6L,MAAM,IAAI7G,OAAOF,GAChC9E,KAAKqN,KAAKrN,KAAK6L,MAAM7L,KAAK6L,MAAMvP,OAAS,IAAI0I,OAAOF,KAKtD4I,WAAa,SAAUnF,GACrB,MAAMzB,EAAI9G,KAGV,GAAI8G,EAAE0B,SAAYD,EAAM,EACtBzB,EAAE0B,OAASD,EAIXzB,EAAE7B,IAAInE,YAAYgG,EAAE7B,IAAIO,SAAS,IAEjCsB,EAAEqH,QACArH,EAAE+E,MAAM/E,EAAE0B,OAAS1B,EAAEiB,QAAU,SAK9B,GAAIjB,EAAE0B,SAAYD,EAAM,EAC3BzB,EAAE0B,OAASD,EAGXzB,EAAE7B,IAAInE,YAAYgG,EAAE7B,IAAImJ,WAExBtH,EAAEuH,SAASvH,EAAE+E,MAAM/E,EAAE0B,aAGlB,CACH1B,EAAE0B,OAASD,EAGXzB,EAAEgF,cAGF,IAAIwC,EAAQ,EAEZ,IAAK,IAAIvS,EAAI,EAAGA,EAAI+K,EAAE+E,MAAMvP,SAG1BgS,IACIA,GAAS/F,IAGbzB,EAAEqH,QAAQrH,EAAE+E,MAAM9P,MAEduS,GAAUxH,EAAEiB,QAAUQ,KATQxM,MAetC+K,EAAEoC,QAAQV,OAAO1B,EAAE0B,SAKrB2F,QAAU,SAAUpS,GAClB,MAAMsR,EAAOrN,KAAKqN,KAAKtR,GAGnBiE,KAAKrC,SAASrB,OAAS,GACzB+Q,EAAKhI,UAAUrF,KAAKrC,SAAS4D,eAI/BvB,KAAK+E,UAAU5C,YAAYkL,EAAKtI,YAKlCsJ,SAAW,SAAUtS,GACnB,MAAMsR,EAAOrN,KAAKqN,KAAKtR,GAGnBiE,KAAKrC,SAASrB,OAAS,GACzB+Q,EAAKhI,UAAUrF,KAAKrC,SAAS4D,eAG/B,MAAM7C,EAAIsB,KAAK+E,UAGfrG,EAAEgI,aACA2G,EAAKtI,UACLrG,EAAE8G,SAAS,SAWnBzL,EAAO,mBAAmB,CAAC,SAAS,SAAUwU,GAE5C,MAAO,CAWLrK,OAAS,SAAU+G,EAAM0C,GACvB,MAAM1S,EAAMP,OAAOwJ,OAAOqK,GACpBlK,UAAUrE,MACVoE,MAAM6G,EAAM,CAAC0C,UAAYA,IAC/B1S,EAAI8M,MAAM,GAEV,MAAMrJ,EAAIzD,EAAI8J,UAYd,OATArG,EAAEoL,iBAAiB,QAAQ,SAAUpL,GACpCsB,KAAKkH,KAAKC,UAGXzI,EAAEmD,UAAUE,IAAI,qBAGhBK,SAASwD,qBAAqB,QAAQ,GAAGzD,YAAYzD,GAE9CzD,GAOTuT,MAAO,SAAUC,GAIf,YAHiBpP,IAAboP,IACFzO,KAAK0O,OAASD,GAETzO,KAAK0O,QAKdC,OAAS,SAAUC,GAEjB5O,KAAK6O,QAAUD,EAEf5O,KAAK8O,OAAO9O,KAAK6O,SACjB7O,KAAK6M,SAASvD,cAMSjK,IAAnBW,KAAK+O,WACPnP,OAAO2K,oBAAoB,SAAUvK,KAAK+O,WAG5C/O,KAAK+O,UAAY,WACf/O,KAAK8O,OAAO9O,KAAK6O,UACjBzJ,KAAKpF,MAEPJ,OAAOkK,iBAAiB,SAAU9J,KAAK+O,YAKzCjB,OAAS,gBAGgBzO,IAAnBW,KAAK+O,WACPnP,OAAO2K,oBAAoB,SAAUvK,KAAK+O,WAE5C/O,KAAK+E,UAAUiK,QAGjBF,OAAS,SAAUpQ,GACjB,MAAMuQ,EAAWvQ,EAAEwQ,wBACnBlP,KAAKiF,IAAIkE,MAAMgG,KAAOF,EAASE,KAAO,KACtCnP,KAAKiF,IAAIkE,MAAMC,IACb6F,EAAS7F,IACP6F,EAASvF,OACT1J,KAAKiF,IAAIiF,aACT,UAOVnQ,EAAO,cAAc,CAAC,mBAAmB,YAAY,SAAS,SAAUqV,EAAevE,GAErF,MAAO,CAIL3G,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAInCjL,MAAQ,SAAUiL,GAChB,MAAM3Q,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UAMb,OALIwN,GACFzN,EAAGG,IAAI3E,MAAMwE,EAAGyN,GAElBzN,EAAGG,IAAI,gBACP/B,KAAKiF,IAAMvG,EACJsB,MAOT+E,QAAU,WACR,OAAO/E,KAAKiF,KAUdZ,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,MAST+B,IAAM,SAAUuN,EAAOC,EAAMC,GAE3B,MAAMC,EAAIzP,KAAKiF,IAAIhD,KAAK,QACxBwN,EAAE7F,aAAa,QAAQ0F,QAEVjQ,IAATkQ,SACkBlQ,IAAhBkQ,EAAU,KACZE,EAAE5N,UAAUE,IAAI3E,MAAMqS,EAAE5N,UAAW0N,EAAU,UAG1BlQ,IAAjBkQ,EAAW,MACbE,EAAE7F,aAAa,YAAa2F,EAAW,WAGnBlQ,IAAlBkQ,EAAY,QACdE,EAAS,MAAIF,EAAY,QAI7BE,EAAExN,KAAK,QAAQK,KAAKgN,GAEpB,IAAII,EAAO1P,KAYX,OAXAyP,EAAE3F,iBAAiB,SAAS,SAAUpL,GAGpCA,EAAEqB,OAGF,IAAI9E,EAAMyU,EAAKC,OAAS3P,KACxB/E,EAAI0T,OAASc,EACbD,EAAGpS,MAAMnC,EAAKyD,MAGT+Q,GASTG,QAAU,SAAUN,EAAOC,EAAM5B,EAAY9C,GAC3C,MAAMI,EAAOmE,EAAclL,OAAO,GAAIyJ,GAMtC,OALA3N,KAAK+B,IAAIuN,EAAOC,GAAM,SAAU7Q,GAC9BuM,EAAKsC,OACLtC,EAAK0D,OAAO3O,KAAK2O,QACjB1D,EAAKP,WAEAO,GAOT4E,UAAY,SAAUP,EAAOC,EAAMO,GACjC,MAAML,EAAIzP,KAAKiF,IAAIhD,KAAK,QACxBwN,EAAE7F,aAAa,QAAQ0F,GAEXjQ,MAARkQ,QACkBlQ,IAAhBkQ,EAAU,KACZE,EAAE5N,UAAUE,IAAI3E,MACdqS,EAAE5N,UACF0N,EAAU,KAMhB,MAAMQ,EAAQN,EAAExN,KAAK,QACrB8N,EAAMlO,UAAUE,IAAI,QAAS,eAC7BgO,EAAM9N,KAAK,QAIX8N,EAAMC,SAAW,SAAUzS,GACrBA,EACFyC,KAAK6B,UAAUE,IAAI,WAEnB/B,KAAK6B,UAAUG,OAAO,YAG1B8N,EAAMG,UAAUF,GAEhBN,EAAExN,KAAK,QAAQK,KAAKgN,GAYpB,OATAG,EAAE3F,iBAAiB,SAAS,SAAUpL,GAGpCA,EAAEqB,OAGF+P,EAAMI,UAGDT,GAQTrK,KAAO,SAAUnK,GACf,YAAYoE,IAARpE,GACF+E,KAAK2P,MAAQ1U,EACN+E,MAEFA,KAAK2P,OAAS3P,MAOvB0H,MAAQ,WAEN,OADA/G,EAAgBX,KAAKiF,KACdjF,UAUbjG,EAAO,eAAe,CAAC,gBAAgB,SAAUoW,GAE/C,MAAMxN,EAAM9C,MAAM6C,OAIlB,SAAS0N,EAAOtL,GACd,OACEA,MAAAA,IAEW,IAATA,EAKN,SAASuL,EAAMpV,EAAKmI,GAClB,MAAMkN,EAASrV,EAAIqV,SAEnB,GAAqB,aAAjBrV,EAAIsV,SAAyB,CAG/B,GAAItV,EAAIuV,cAAgBpN,EACvB,OAED,OAAwB,OAApBkN,EAAOC,SACHD,EAAOG,SAASxV,GAKhBA,EAAIyV,aAIT,GAAqB,QAAjBzV,EAAIsV,UACa,gBAAjBtV,EAAIsV,SAEX,OAAwB,OAApBD,EAAOC,SACHtV,EAAIyV,WAAWtN,GAGdkN,EAAOE,cAAgBpN,EACxBkN,EAAOG,SAASxV,GAIhBA,EAAI0V,KAAKvN,GA6BrB,OAxEAT,EAAIiO,IAAQjO,EAAIiO,KAAS,IAkDzB/Q,MAAMgR,KAAO,WACX,OAAOR,EAAKrQ,KAAM,QAKpBH,MAAMiR,IAAM,WACV,OAAOT,EAAKrQ,KAAM,OAKpBH,MAAMkR,QAAU,WACd,GAA+B,OAA3B/Q,KAAKsQ,SAASC,SAChB,OAAOvQ,KAAKsQ,SAASU,WAAWhR,MAAMiR,SAGtCjR,KAAKsQ,SAASY,SAKX,CACLhN,OAAS,SAAUiN,EAAKC,EAAIC,GAG1B,IAAIC,EAAK5W,OAAOyV,GAAkBjM,OAAO,CAAC,cAAcG,UAAUrE,MAMlE,OALAsR,EAAGH,IAAIA,GACPG,EAAGF,GAAGA,GACNE,EAAGD,IAAIA,GACPC,EAAGL,SAEIK,GAOTL,OAAS,WACP,MAAMnK,EAAI9G,KAmBV,OAhBA8G,EAAEY,SAEa,IAAXZ,EAAE+J,MACJ/J,EAAE/E,IAAIY,EAAIE,IAAK,CAAC0O,IAAM,CAAC,QAAS1R,MAAMgR,OAI1B,IAAV/J,EAAEgK,KACJhK,EAAE/E,IAAIY,EAAIC,GAAI,CAAC2O,IAAM,CAAC,OAAQ1R,MAAMiR,MAIvB,IAAXhK,EAAE0K,MACJ1K,EAAE/E,IAAIY,EAAIiO,IAAK,CAACW,IAAM,CAAC,WAAY1R,MAAMkR,SAGpCjK,EAAE/B,WAMXuL,OAAS,SAAUrV,GAQjB,OAPyB,IAArBiC,UAAUZ,SACb0D,KAAKyR,QAAUxW,EAGd+E,KAAKoF,KAAKnK,IAGL+E,KAAKyR,SAIdN,IAAM,SAAUrM,GAGd,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAK6Q,KAAOT,EAAMtL,IACZ9E,KAAK6Q,MAIdO,GAAK,SAAUtM,GAGb,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAK8Q,IAAMV,EAAMtL,IACX9E,KAAK8Q,KAIdO,IAAM,SAAUvM,GAGd,OAFyB,IAArB5H,UAAUZ,SACb0D,KAAKwR,KAAOpB,EAAMtL,IACZ9E,KAAKwR,UAUlBzX,EAAO,YAAY,CAAC,iBAAiB,SAAU2X,GAE7C,MAAO,CAELC,WAAY,EAEZzN,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,OAQvBqE,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EAChBtE,KAAK9E,GAAQoJ,EAAMpJ,GAEpB,OAAO8E,MAITuQ,OAAS,SAAUnN,GAGjB,OAFyB,IAArBlG,UAAUZ,SACb0D,KAAK4R,QAAUxO,GACTpD,KAAK4R,SAIdtB,OAAS,SAAUrV,GAKjB,OAJyB,IAArBiC,UAAUZ,SACb0D,KAAKyR,QAAUxW,EACf+E,KAAK2R,WAAY,GAEX3R,KAAKyR,SAOdjF,QAAU,WACR,MAAM1F,EAAI9G,KACIX,MAAVyH,EAAE+K,OACL/K,EAAE+K,KAAKJ,aAAUpS,OACEA,IAAfyH,EAAE+K,KAAK5M,MACT6B,EAAE+K,KAAK5M,IAAI6M,WAAQzS,GAErByH,EAAE+K,UAAOxS,QAGIA,IAAVyH,EAAE7B,MACL6B,EAAE7B,SAAM5F,QAGWA,IAAhByH,EAAEiL,YACJjL,EAAEiL,UAAUtL,QAAQ1K,GAAKA,EAAEyQ,WAC5B1F,EAAEiL,UAAY,KAKjBrB,WAAa,SAAUY,GACrB,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAa5C,OAXyB,IAArBpT,UAAUZ,OACb0V,EAAMxB,UAAUc,GAEhBU,EAAMxB,UACiB,QAArBxQ,KAAKwQ,YAAwB,KAAO,OAEvCwB,EAAMC,OAAOjS,MACbA,KAAKsQ,OAAO0B,GACZA,EAAMC,SACND,EAAMjN,UACNuL,EAAO4B,KAAKF,GACLhS,KAAKsQ,UAKd6B,UAAY,SAAUhB,EAAKC,EAAIC,GAC7B,OAAkB,IAAdnU,YAGJ8C,KAAK6R,KAAOH,EAAexN,OAC1BiN,EAAKC,EAAIC,GAGVrR,KAAK6R,KAAKvB,OAAOtQ,OANTA,KAAK6R,MAWfO,OAAS,WACP,MAAO,CAENC,QAAU,SAAWrS,KAAKuQ,WAK7B+B,SAAW,WACT,OAAO,MAITC,WAAa,WACX,OAAO,GAITC,QAAU,WACR,MAAO,QAUbzY,EAAO,aAAa,CAAC,YAAa,SAAS,SAAU0Y,GAGnD,MAAMC,EACA,IAAItS,OAAO,6DAEjB,MAAO,CAGL8D,OAAS,SAAUyO,GACjB,OAAOjY,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,IAKZrP,IAAM,SAAUmE,GAGd,OAFyB,IAArBvK,UAAUZ,SACb0D,KAAK6S,KAAOpL,GACNzH,KAAK6S,MAKdrC,UAAY,SAAUc,GACpB,GAAyB,IAArBpU,UAAUZ,OAAc,CAC3B,IAAIoW,EAAkBlW,KAAK8U,GAKzB,YADAzR,MAAMsD,IAAI,IAAK,6BAHfnD,KAAK8S,IAAMxB,EAOd,OAAOtR,KAAK8S,KAAO,aAKrBC,MAAQ,SAAUC,GAGhB,OAFyB,IAArB9V,UAAUZ,SACb0D,KAAKiT,OAASD,GACRhT,KAAKiT,QAKdL,SAAW,SAAUD,GACnB,QAAatT,IAATsT,EACH,OAAO3S,KAGR,QAAsBX,IAAlBsT,EAAK,SAAT,CAMA,QAAoBtT,IAAhBsT,EAAU,KACY,iBAAhBA,EAAU,IAkBpB,OAZA3S,KAAKsD,IAAIqP,EAAU,UAGOtT,IAAtBsT,EAAgB,WACnB3S,KAAKwQ,UAAUmC,EAAgB,UAAElW,QAAQ,cAAc,UAIlC4C,IAAlBsT,EAAY,OACY,iBAAlBA,EAAY,OACrB3S,KAAK+S,MAAMJ,EAAY,OAEjB3S,KAjBNH,MAAMsD,IAAI,IAAK,+BAPftD,MAAMsD,IAAI,IAAK,yCA4BlB/B,SAAW,WACT,IAAI8R,EAAM,GACV,MAAM5B,EAAKtR,KAAKwQ,YAQhB,OAPA0C,GAAO5B,EAAG5U,OAAO,GAAGyW,cAAgB7B,EAAGxW,MAAM,GAC7CoY,GAAO,QACU,OAAhBlT,KAAKiT,OACH,SACAjT,KAAK+S,QAAQzS,SAEhB4S,GAAO,OAASlT,KAAKsD,MAAMhD,QACpB4S,OAObnZ,EAAO,iBAAiB,CAAC,YAAa,aAAa,SAAS,SAAU0Y,EAAaW,GACjF,MAAO,CAGLlP,OAAS,SAAUyO,GACjB,OAAOjY,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,IAOZC,SAAW,SAAUD,GAQnB,OAPA3S,KAAK6L,MAAQ,IAAIH,MACjBiH,EAAKlM,QACH1K,GACCiE,KAAK6L,MAAM1O,KACTiW,EAAalP,OAAOnI,KAGlBiE,MAIT1D,OAAS,WACP,OAAO0D,KAAK6L,MAAMvP,QAOpByI,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAEb,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAC5C3D,EAAEkL,aAAa,QAAS,WAExB,MAAMyJ,EAAW,GACjB,IAAIC,EAAMC,EA2BV,OA1BAvT,KAAK6L,MAAMpF,SAAQ,SAAU+M,GAG5BF,EAAOlR,SAASC,cAAc,QAG9BiR,EAAK1J,aAAa,QAAS4J,EAAQhD,aAGnC+C,EAAcC,EAAQlQ,WAGEjE,IAApBmU,EAAQT,UACVQ,GAAe,KAAOC,EAAQT,SAIhCO,EAAKhR,KAAKiR,GAETF,EAASlW,KAAKoW,EAAc,KAAOC,EAAQhD,YAAc,KAE1DxQ,KAAKiF,IAAI9C,YAAYmR,KACnBtT,MAEHtB,EAAEkL,aAAa,QAASyJ,EAASxW,KAAK,OAE/B6B,OAUb3E,EAAO,eAAe,CAAC,SAAS,WAE9B,MAAM4I,EAAM9C,MAAM6C,OAIlB,OAHAC,EAAI8Q,MAAa9Q,EAAI8Q,OAAc,QACnC9Q,EAAI+Q,WAAa/Q,EAAI+Q,YAAc,2BAE5B,CAILxP,OAAS,WACP,MAAMyP,EAAIzW,UACV,IAAI0W,GAAU,EACVC,GAAQ,EACRtW,EAAQ,GAqBZ,OAlBIoW,EAAErX,QAAU,QACD+C,IAATsU,EAAE,KACJpW,EAAQoW,EAAE,IAIVA,EAAErX,QAAU,QACD+C,IAATsU,EAAE,KACJE,EAAQF,EAAE,IAIVA,EAAErX,QAAU,IACdsX,EAAUD,EAAE,IACI,IAAZC,IACFC,GAAQ,IAGLnZ,OAAOwJ,OAAOlE,MAAMoE,MAAM7G,EAAOsW,EAAOD,IAKjDxP,MAAQ,SAAU7G,EAAOsW,EAAOD,GAI9B,OAHA5T,KAAKzC,MAAMA,GACXyC,KAAK6T,MAAMA,GACX7T,KAAK8T,SAASF,GACP5T,MAST6T,MAAQ,SAAU/O,GAKhB,OAJyB,IAArB5H,UAAUZ,SACb0D,KAAK+T,SAASjP,EACb9E,KAAKsH,WAEAtH,KAAK+T,QAIdD,SAAW,SAAUF,GAKnB,OAJyB,IAArB1W,UAAUZ,SACZ0D,KAAKgU,YAAYJ,EACjB5T,KAAKsH,WAEAtH,KAAKgU,WAQdC,YAAc,WACZjU,KAAK6T,OAAsB,IAAhB7T,KAAK+T,SAOlBxW,MAAQ,SAAU2W,GAMhB,OALyB,IAArBhX,UAAUZ,SACZ0D,KAAKmU,OAASD,EAEdlU,KAAKsH,WAEAtH,KAAKmU,QAKd7M,QAAU,WACR,QAAiBjI,IAAbW,KAAKiF,IACP,OAEFjF,KAAKmU,OAASnU,KAAKoU,OAAO7W,MAE1B,MAAMqE,EAAK5B,KAAKiF,IAAIpD,UAEhB7B,KAAK8T,YAAc9T,KAAK+T,OAC1BnS,EAAGG,IAAI,SAGPH,EAAGI,OAAO,UAUdqS,MAAQ,SAAUtQ,EAAEuQ,KAMpB5J,MAAQ,WACN1K,KAAKiF,IAAIO,SAAS,GAAGkF,SAOvB3F,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAC5C3D,EAAEkL,aAAa,WAAY,GAC3BlL,EAAEyK,MAAMiC,QAAU,EAElB,MAAMxJ,EAAKlD,EAAEmD,UAab,GAZAD,EAAGG,IAAI,UACc,IAAjB/B,KAAK6T,SACPjS,EAAGG,IAAI,SAGT/B,KAAKoU,OAAS1V,EAAEuD,KAAK,cAEA5C,IAAjBW,KAAKzC,UACPyC,KAAKoU,OAAO7W,MAAQyC,KAAKzC,SAIvByC,KAAK8T,WAAY,CACnB,MAAMS,EAAK7V,EAAEuD,KAAK,OAClBsS,EAAGzK,iBACD,QACA,WACC9J,KAAKiU,eAEJ7O,KAAKpF,OACP,GAEFuU,EAAG3K,aAAa,QAAS,6BACzB2K,EAAGjS,KAAK,SAqDV,OAhDAtC,KAAKoU,OAAOtK,iBACV,OACA,SAAUa,GACR,MAAM7D,EAAI9G,KACL8G,EAAE0N,WACN1N,EAAEvJ,MAAMuJ,EAAEsN,OAAO7W,OAChBuJ,EAAEuN,MAAMvN,EAAEvJ,QAASuJ,EAAE+M,UAEvBlJ,EAAG5K,QACHqF,KAAKpF,OAITtB,EAAEoL,iBACA,YACA,WACE9J,KAAKwU,UAAW,GAChBpP,KAAKpF,OAGTtB,EAAEoL,iBACA,UACA,WACE9J,KAAKwU,UAAW,EAChBxU,KAAKoU,OAAO1J,SACZtF,KAAKpF,OAGTA,KAAKoU,OAAOtK,iBACV,WACA,SAAUa,GACR,MAAM7D,EAAI9G,KACX,GAAkB,IAAd2K,EAAG3J,QAGJ,OAFD8F,EAAEvJ,MAAMuJ,EAAEsN,OAAO7W,OACjBuJ,EAAEuN,MAAMvN,EAAEvJ,QAASuJ,EAAE+M,UACb,GAETzO,KAAKpF,OAWFtB,OAWb3E,EAAO,iBAAiB,CACtB,YACA,iBACA,eACA,SACC,SAAU0Y,EAAagC,EAAkBC,GAK1C,MAAM/R,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,cAMV1N,OAAS,SAAUoM,EAAQqC,GACzB,MAAM1X,EAAMP,OAAO+X,GACbvO,SACDG,UAAUrE,MACT4S,SAASD,GASf,YAPYtT,IAARpE,GACFsI,QAAQJ,IAAIwP,QAECtT,IAAXiR,IACHrV,EAAIwW,QAAUnB,GAEfrV,EAAI0W,WAAY,EACT1W,GAOTgW,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACJ,OAAO6B,EAAE/B,UAEX,MAAMrG,EAAIoI,EAAE7B,IAGZ,IAAK6B,EAAE6K,UACL,OAAOjT,EAGTA,EAAEoT,MAAQhL,OAGWzH,IAAjByH,EAAEwL,YACJ5T,EAAEmD,UAAUE,IAAI,aAGlB,MAAM6S,EAAWxS,SAASC,cAAc,QACxCuS,EAAS/S,UAAUE,IAAI,MAAM,QAAS,OACtC6S,EAAStS,KAAK,WAGd,MAAMuS,EAAO/N,EAAEgO,MAAQ1S,SAASC,cAAc,QAgD9C,OA/CAwS,EAAKjL,aAAa,YAAa,UAC/BiL,EAAKjL,aAAa,QAAS,SAEvB5J,KAAK+U,MACPF,EAAKvS,KAAKwE,EAAEiO,QAGZF,EAAKvS,KAAKK,EAAIgS,OACdE,EAAKhT,UAAUE,IAAI,gBAIrB8S,EAAK/K,iBACH,QACAhD,EAAEkO,WAAW5P,KAAK0B,IAIpBnG,EAAgBjC,GAGhBA,EAAEyD,YAAYyS,GACdlW,EAAEyD,YAAY0S,GAEd/N,EAAE6K,WAAY,OAEMtS,IAAhByH,EAAEmO,WACJvW,EAAEyD,YAAY2E,EAAEmO,UAAUlQ,gBAGV1F,IAAdyH,EAAE2K,SAIJ/S,EAAEyD,YAAY2E,EAAEqL,WACd,GACA,GACA,GACApN,gBAGa1F,IAAbQ,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAAEC,OAAWvO,KAItCA,EAAE/B,WAOXA,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAEb,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAG5C,OAFA3D,EAAEkL,aAAa,QAAS,gBACxB5J,KAAKiR,SACEvS,GAOTqW,IAAM,SAAUA,GACd,OAAyB,IAArB7X,UAAUZ,QACZ0D,KAAKsV,KAAOP,EACZ/U,KAAKuV,WACEvV,MAEFA,KAAKsV,MAKdN,WAAa,SAAUtW,GACrB,MAAMgR,EAAO1P,KACPkT,EAAMwB,EAAexQ,OAAOlE,KAAK+U,OAAO,GAAO,GAC/CS,EAAUtC,EAAInO,UAEpBmO,EAAImB,MAAQ,SAAUU,EAAKlB,GACzBnE,EAAKqF,IAAIA,GAETrF,EAAKzK,IAAInE,YACPd,KAAKiF,KAEPyK,EAAKuB,UAIPjR,KAAKiF,IAAIyB,aACP8O,EACAxV,KAAK8U,OAGP5B,EAAIxI,SAQNiG,KAAO,SAAUW,GACf,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAI5C,OAHA0B,EAAMxB,UAAUc,GAChBU,EAAMC,OAAOjS,MACbgS,EAAMC,SACC3B,EAAOmF,eAAezV,KAAMgS,GAAOf,UAO5C2B,SAAW,SAAUD,GACnB,QAAatT,IAATsT,EACF,OAAO3S,KAET,QAAsBX,IAAlBsT,EAAK,SAAT,CAKA,QAAoBtT,IAAhBsT,EAAU,KACY,iBAAfA,EAAU,IAYrB,OAPA3S,KAAK+U,IAAIpC,EAAU,UAGMtT,IAArBsT,EAAe,UACjB3S,KAAKwT,QAAQb,EAAe,UAGvB3S,KAXLH,MAAMsD,IAAI,IAAK,6BANftD,MAAMsD,IAAI,IAAK,yCAwBnBgC,QAAU,WACR5B,QAAQJ,IAAI,iCAKdmP,SAAW,WACT,OAAOtS,KAAKiV,WAKdzB,QAAU,SAAUjW,GACG,iBAAVA,IACTA,EAAQ,CAAC,CACP8U,QAAU,gBACV7B,UAAc,aAAejT,EAC7B+F,IAAQ,aAGZtD,KAAKiV,UAAYR,EAAiBvQ,OAAO3G,IAQ3CgY,SAAW,WACTvV,KAAK2R,WAAY,OAEMtS,IAAnBW,KAAKiV,mBAGFjV,KAAgB,eAENX,IAAbW,KAAKiF,KAGTjF,KAAKiF,IAAIpD,UAAUG,OAAO,eAI5BoQ,OAAS,WACP,OAAKpS,KAAK+U,IAGH,CACL1C,QAAU,SAAWrS,KAAKuQ,SAC1BwE,IAAU/U,KAAK+U,OAJR,IASXxC,WAAa,WACX,OAAOvS,KAAK+U,OAIdvC,QAAU,WACR,OAAIxS,KAAKuS,aACA,GAGF,WAAavS,KAAK+U,MAAMzU,aAUrCvG,EAAO,SAAS,CACd,YACA,iBACA,eACA,iBACA,SACC,SAAU0Y,EAAagC,EAAkBC,EAAgBgB,GAQ1D,MAAMC,EAAY,4CAEZhT,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,MAGVgE,KAAO,WAAc,MAAO,OAO5B1R,OAAS,SAAUoM,EAAQqC,GAGzB,MAAM1X,EAAMP,OAAO+X,GACbvO,SACAG,UAAUrE,MACV4S,SAASD,GAEf,QAAYtT,IAARpE,EAUJ,YAJeoE,IAAXiR,IACFrV,EAAIwW,QAAUnB,GAEhBrV,EAAI0W,WAAY,EACT1W,EATLsI,QAAQJ,IAAIwP,IAgBhB1B,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACJ,OAAO6B,EAAE/B,UAGX,MAAMrG,EAAIoI,EAAE7B,IAGZ,IAAK6B,EAAE6K,UACL,OAAOjT,EAGTA,EAAEoT,MAAQhL,OAIWzH,IAAjByH,EAAEwL,YACJ5T,EAAEmD,UAAUE,IAAI,aAIlB,MAAM8T,EAAO/O,EAAEgP,MAAQ1T,SAASC,cAAc,QAM9C,GALAwT,EAAKjM,aAAa,QAAS,OAG3BiM,EAAK/L,iBAAiB,QAAShD,EAAEiP,WAAW3Q,KAAK0B,IAE7CA,EAAEkP,MAAO,CACX,MAAMC,EAAInP,EAAEkP,WACW3W,IAAnBsD,EAAI,MAAQsT,KACdA,EAAItT,EAAI,MAAQsT,IAClBJ,EAAKvT,KAAK2T,GAIZ,MAAMC,EAAWpP,EAAEqP,UAAY/T,SAASC,cAAc,QACtD6T,EAAStM,aAAa,YAAa9C,EAAE1D,QACrC8S,EAAStM,aAAa,QAAS,SAC/BsM,EAAS5T,KAAKwE,EAAEsP,WAGhBtP,EAAEqP,UAAUrM,iBACV,QACAhD,EAAEuP,eAAejR,KAAK0B,IAIxB,MAAMwP,EAASxP,EAAEyP,QAAUnU,SAASC,cAAc,QAiDlD,OAhDAiU,EAAO1M,aAAa,YAAa9C,EAAE1D,QACnCkT,EAAO1M,aAAa,QAAS,SAEzB9C,EAAEvJ,QACJ+Y,EAAOhU,KAAKwE,EAAEvJ,UAGd+Y,EAAOhU,KAAKK,EAAIgS,OAChB2B,EAAOzU,UAAUE,IAAI,gBAIvBuU,EAAOxM,iBACL,QACAhD,EAAE0P,aAAapR,KAAK0B,IAItBnG,EAAgBjC,GAGhBA,EAAEyD,YAAY0T,GACdnX,EAAEyD,YAAY+T,GACdxX,EAAEyD,YAAYmU,GAEdxP,EAAE6K,WAAY,OAEMtS,IAAhByH,EAAEmO,WACJvW,EAAEyD,YAAY2E,EAAEmO,UAAUlQ,gBAGV1F,IAAdyH,EAAE2K,SAIJ/S,EAAEyD,YAAY2E,EAAEqL,WACd,GACA,GACA,GACApN,WAGAlF,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAACC,OAAWvO,KAIrCpI,GAOTqG,QAAU,WACR,MAAM+B,EAAI9G,KACV,YAAcX,IAAVyH,EAAE7B,MAGN6B,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAI2E,aAAa,QAAS,OAC5B9C,EAAEmK,UAJOnK,EAAE7B,KAYb0L,KAAO,SAAUW,GACf,MAAMhB,EAAStQ,KAAKsQ,SACd0B,EAAQlY,EAAQ,eAAeoK,OAAOoM,GAI5C,OAHA0B,EAAMxB,UAAUc,GAChBU,EAAMC,OAAOjS,MACbgS,EAAMC,SACC3B,EAAOmF,eAAezV,KAAMgS,GAAOf,UAI5CwF,YAAc,SAAUnF,GACtB,MAAM9S,EAAIwB,KAAKsQ,SAEI,aAAf9R,EAAE+R,SACJ/R,EAAEiX,eAAezV,KAAMsR,GAEF,MAAd9S,EAAE+R,UACT/R,EAAE0T,KAAKZ,GAGT9S,EAAEyS,SAEFjR,KAAKwM,WAOPoG,SAAW,SAAUD,GACnB,MAAM7L,EAAI9G,KACV,QAAaX,IAATsT,EACF,OAAO7L,EAET,QAAsBzH,IAAlBsT,EAAK,SAEP,YADA9S,MAAMsD,IAAI,IAAK,wCAIjB,QAAsB9D,IAAlBsT,EAAY,OACY,iBAAjBA,EAAY,MAErB,YADA9S,MAAMsD,IAAI,IAAK,oBAIjB,IAAIqQ,EAGJ,QAAoBnU,IAAhBsT,EAAU,KACa,iBAAhBA,EAAU,IAAgB,CAMnC,GAHA7L,EAAEkP,IAAIrD,EAAU,UAGMtT,IAAlBsT,EAAY,MAAiB,CAC/B,GAA6B,iBAAlBA,EAAY,MAKrB,YADA9S,MAAMsD,IAAI,IAAKwS,GAHf7O,EAAEsP,QAAQzD,EAAY,OAS1B,QAAqBtT,IAAjBsT,EAAW,MAAmB9S,MAAM6W,WAAY,CAGlD,MAAMtT,EAAOvD,MAAM6W,WAAWC,OAAO7P,EAAEkP,OAC3B3W,MAAR+D,IACFuP,EAAW,KAAI,QAAUvP,GAK7B,QAAqB/D,IAAjBsT,EAAW,KAGR9S,MAAM+W,oBAAoBpa,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAoB,eAAhBA,EAAW,KAClB7L,EAAE1D,KAAK,UAGFvD,MAAMgX,oBAAoBra,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAoB,aAAhBA,EAAW,KAClB7L,EAAE1D,KAAK,QAGFvD,MAAMiX,kBAAkBta,KAAKsK,EAAEsP,aAClCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,YAIjB,GAAqB,cAAjBA,EAAW,KAAmB,CAGrC,GAFA7L,EAAE1D,KAAK,aAEe/D,IAAlBsT,EAAY,QACZ9S,MAAMkX,aAAava,KAAKmW,EAAY,OAetC,YADA9S,MAAMsD,IAAI,IAAK,oCAZVtD,MAAMmX,kBAAkBxa,KAAKsK,EAAEsP,aAClCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAIZ1M,EAAEvJ,MAAMoV,EAAY,WASnB,CAAA,GAAqB,eAAjBA,EAAW,KA4BlB,MADA9S,MAAMsD,IAAI,IAAK8T,uBAAmBnQ,EAAE1D,QAC9B,IAAI3F,MAAMwZ,uBAAmBnQ,EAAE1D,QA3BrC0D,EAAE1D,KAAK,SAEP,IAGc,IAAIhD,OAAOuS,EAAY,OAE9B9S,MAAMgX,oBAAoBra,KAAKsK,EAAEsP,aACpCvW,MAAMsD,IAAI,IAAKwS,GAGf7O,EAAEsP,QAAQ,MACV5C,EAAU,gBAGZ1M,EAAEvJ,MAAMoV,EAAY,OAGtB,MAAOjU,GAEL,YADAmB,MAAMsD,IAAI,IAAK,2CAGjB2D,EAAE1D,KAAK,UAmBX,YATyB/D,IAArBsT,EAAe,SACjB7L,EAAE0M,QAAQb,EAAe,eAINtT,IAAZmU,GACP1M,EAAE0M,QAAQA,GAGL1M,GAOTkP,IAAM,SAAUzY,GACd,OAAyB,IAArBL,UAAUZ,QACZ0D,KAAKkX,KAAO3Z,EACZyC,KAAKuV,WACEvV,MAEFA,KAAKkX,MAKdnB,WAAa,SAAUrX,GACrB,MAAMwI,EAAOrH,MAAM6W,WAGnB1W,KAAKiF,IAAIyB,aACPQ,EAAKnC,UACL/E,KAAK8V,OAIP,MAAMpG,EAAO1P,KACbkH,EAAKiQ,UAAS,SAAUnB,EAAK5S,GAE3B,GAAa,QAATA,EAEFsM,EAAK+G,YACHf,EAAiBxR,OAAOwL,EAAKY,eAI5B,CACH,MAAM8G,EAAM1H,EAAKsG,IAAIA,GAAK5S,KAAKA,GAG/BgU,EAAIhB,QAAQgB,EAAIhB,WAChBgB,EAAI7Z,MAAM6Z,EAAI7Z,SAGd6Z,EAAInG,SAINjR,KAAKmH,UAIPD,EAAKqG,OACLrG,EAAKwD,SAOP0L,QAAU,SAAUiB,GAClB,MAAMvQ,EAAI9G,KAEV,GAAyB,IAArB9C,UAAUZ,OAAc,CAC1B,MAAM2K,EAAIoQ,EAAM5a,QAAQ,UAAW,IAqBnC,OAlBc4C,MAAXyH,EAAEwQ,QAGc,WAAZxQ,EAAEwQ,OAAkC,UAAZxQ,EAAEwQ,QACzBzX,MAAMgX,oBAAoBra,KAAKyK,IAGtB,SAAZH,EAAEwQ,OAAoBzX,MAAMiX,kBAAkBta,KAAKyK,IAEvC,SAAZH,EAAEwQ,OAAoBzX,MAAMmX,kBAAkBxa,KAAKyK,GAEtDH,EAAEyQ,SAAWtQ,EAGbH,EAAEyQ,SAAW,KAGfzQ,EAAEyO,WACKzO,EAGT,OAAOA,EAAEyQ,UAAY,MAKvBlB,eAAiB,SAAU3X,GACzB,MAAMwI,EAAOrH,MAAM2X,eAAexX,KAAKoD,QAEvC,QAAa/D,IAAT6H,EAEF,YADArH,MAAMsD,IAAI,EAAG,2BAA6BnD,KAAKoD,QAKjDpD,KAAKiF,IAAIyB,aACPQ,EAAKnC,UACL/E,KAAKmW,WAIP,MAAMzG,EAAO1P,KACbkH,EAAKiQ,UAAS,SAAUM,GACtB/H,EAAK0G,QAAQqB,GAAIxG,SACjBjR,KAAKmH,UAGPD,EAAKqG,OACLrG,EAAKwD,SAOPtH,KAAO,SAAUA,GACf,OAAyB,IAArBlG,UAAUZ,QACZ0D,KAAKsX,MAAQlU,EACbpD,KAAKuV,WACEvV,MAEFA,KAAKsX,OAAS,UAOvB/Z,MAAQ,SAAUA,GAChB,MAAMuJ,EAAI9G,KACV,OAAyB,IAArB9C,UAAUZ,QACI,SAAZwK,EAAEwQ,OAAqBzX,MAAMkX,aAAava,KAAKe,GAIjDuJ,EAAEqN,OAAS5W,SAHJuJ,EAAEqN,OAKXrN,EAAEyO,WACKzO,GAEFA,EAAEqN,QAKXqC,aAAe,SAAU9X,GACvB,MAAMgR,EAAO1P,KAGb,GAAoB,SAAhBA,KAAKoD,OAAmB,CAC1B,MAAMsU,EAAK7X,MAAM8X,cACjBD,EAAGE,WAAW5X,KAAKzC,SAGnBma,EAAGvS,SAAQ,SAAU0S,GAGnB,GAAIA,EAAe,KAGjB,OAFAnI,EAAKnS,MAAMyC,KAAKoB,iBAChBsO,EAAKuB,SAKPvB,EAAKzK,IAAInE,YACP4W,EAAG3S,cAIP/E,KAAKiF,IAAIyB,aACPgR,EAAGnK,OACHvN,KAAKuW,SAGPmB,EAAGI,QAAQpN,YAGR,CACH,MAAMmJ,EAAwB,UAAhB7T,KAAKoD,OACb8P,EAAMwB,EAAexQ,OAAOlE,KAAKzC,QAASsW,GAC1C2B,EAAUtC,EAAInO,UAEpBmO,EAAImB,MAAQ,SAAU9W,EAAOsW,GAC3BnE,EAAKnS,MAAMA,IACG,IAAVsW,EACFnE,EAAKtM,KAAK,SAEVsM,EAAKtM,KAAK,UAEZsM,EAAKzK,IAAInE,YACPd,KAAKiF,KAEPyK,EAAKuB,UAIPjR,KAAKiF,IAAIyB,aACP8O,EACAxV,KAAKuW,SAGPrD,EAAIxI,UAKR4H,SAAW,WACT,OAAOtS,KAAKiV,WAIdzB,QAAU,SAAUjW,GACG,iBAAVA,IACTA,EAAQ,CAAC,CACP8U,QAAU,gBACV7B,UAAc,aAAejT,EAC7B+F,IAAQ,aAGZtD,KAAKiV,UAAYR,EAAiBvQ,OAAO3G,IAQ3CgY,SAAW,WACTvV,KAAK2R,WAAY,OAEMtS,IAAnBW,KAAKiV,mBAGFjV,KAAgB,eAENX,IAAbW,KAAKiF,KAGTjF,KAAKiF,IAAIpD,UAAUG,OAAO,eAI5BoQ,OAAS,WACP,MAAMtL,EAAI9G,KAEV,OAAK8G,EAAEsP,WAActP,EAAEkP,MAGhB,CACL3D,QAAU,SAAWvL,EAAEyJ,SACvByF,IAAUlP,EAAEkP,MACZqB,MAAU,SAAWvQ,EAAEsP,UACvB7Y,MAAUuJ,EAAEvJ,SAAW,GACvB6F,KAAU,QAAU0D,EAAE1D,QAPf,IAYXmP,WAAa,WACX,QAASvS,KAAKoW,WAAapW,KAAKgW,OAAShW,KAAKzC,UAIhDiV,QAAU,WACR,GAAIxS,KAAKuS,aACP,MAAO,GAGT,IAAI9K,EAASzH,KAAKgW,MAAQ,IAG1B,OAAQhW,KAAKoW,WACb,IAAK,KACH3O,GAAU,KACV,MACF,IAAK,WACHA,GAAU,IACV,MACF,IAAK,WAGL,IAAK,cACHA,GAAU,KACV,MACF,IAAK,MACHA,GAAU,QACV,MACF,IAAK,MACHA,GAAU,QACV,MACF,QACEA,GAA0B,QAAfzH,KAAKoD,OAAoB,KAAO,IAO7C,OAHAqE,GAAU,IAGFzH,KAAKoD,QACb,IAAK,OACH,OAAOqE,EAASzH,KAAKzC,QACvB,IAAK,QACH,OAAOkK,EAAS,IAAMzH,KAAKzC,QAAQiD,cAAgB,IACrD,IAAK,SACL,IAAK,OACH,OAAOiH,EAASzH,KAAKzC,QAAQ+C,QAG/B,MAAO,QAWbvG,EAAO,iBAAiB,CACtB,YACA,SACA,iBACA,SACC,SAAU0Y,EAAasF,EAAUrC,GAGlC,MAAM/S,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIgS,MAAQhS,EAAIgS,OAAS,IAElB,CAGL/C,QAAU,MAMV1N,OAAS,SAAUoM,GACjB,MAAMrV,EAAMP,OAAOwJ,OAAOuO,GACvBpO,UAAUrE,MAKb,YAHeX,IAAXiR,IACHrV,EAAIwW,QAAUnB,GAERrV,GAOT+a,IAAM,SAAUjS,GAGd,QAAqB1E,IAAjBW,KAAKyR,QACR,OAAO,KAER,IAAIuG,EACJ,MAAMC,EAAUpY,MAAM6W,WAAWC,OAAO5S,GAuBxC,OApBIkU,GAAuB,QAAZA,EACbD,EAAStC,EAAiBxR,OAAOlE,KAAKyR,UAGtCuG,EAASD,EAAS7T,OAAOlE,KAAKyR,SAC9BuG,EAAOhC,IAAIjS,GACXiU,EAAO5U,KAAK6U,IAIgB,OAA1BjY,KAAKyR,QAAQlB,UAChBvQ,KAAKyR,QAAQS,KAAK8F,GAClBhY,KAAKwM,WAKLxM,KAAKyR,QAAQgE,eAAezV,KAAMgY,GAEnChY,KAAKyR,QAAQR,SACN+G,GAOT/G,OAAS,WACP,MAAMnK,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE/B,UAGVpE,EAAgBmG,EAAE7B,KAElB,MAAMiT,EAAW9V,SAASC,cAAc,QAwBxC,OAvBA6V,EAAS5V,KAAKK,EAAIgS,OAGlBuD,EAASpO,iBAAiB,QAAShD,EAAE3B,QAAQC,KAAK0B,IAElDA,EAAE7B,IAAI9C,YAAY+V,GAGlBpR,EAAE7B,IAAI6M,MAAQhL,OAGIzH,IAAdyH,EAAE2K,SACsB,OAAxB3K,EAAEwJ,SAASC,UAEdzJ,EAAE7B,IAAI9C,YACJ2E,EAAEqL,WACA,GACA,GACA,GACApN,WAIE+B,EAAE/B,WAOXA,QAAU,WACR,MAAM+B,EAAI9G,KACV,YAAcX,IAAVyH,EAAE7B,MAEN6B,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAI2E,aAAa,QAAS,mBAC5B9C,EAAEmK,UAHMnK,EAAE7B,KAQZsN,WAAa,WACX,OAAO,GAOTpN,QAAU,WAGR,MAAM+B,EAAOrH,MAAM6W,WAGnB1W,KAAKiF,IAAIyB,aACRQ,EAAKnC,UACL/E,KAAKiF,IAAIpE,YAGV,MAAM6O,EAAO1P,KAGbkH,EAAKiQ,UAAS,SAAUnB,GAEvBtG,EAAKsG,IAAIA,GAAK/E,SACdjR,KAAKmH,UAGND,EAAKqG,OACLrG,EAAKwD,aAaX3Q,EAAO,cAAc,CACnB,YACA,iBACA,SACA,iBACA,SACC,SAAU0Y,EACD0F,EACAJ,EACCrC,GAEX,MAAM0C,EAAkB,IAAIhY,OAAO,gBAE7BiY,EAAgB,CAEpBzG,QAAU,WAEV1N,OAAS,SAAUoM,EAAQqC,GACzB,MAAM1X,EAAMP,OAAOwJ,OAAOuO,GAAapO,UAAUrE,MAKjD,OAJA/E,EAAI8W,UAAY,GAChB9W,EAAI2X,SAASD,QACEtT,IAAXiR,IACHrV,EAAIwW,QAAUnB,GACRrV,GAITwV,SAAW,SAAUxV,GACnB+E,KAAK+R,UAAUtL,SAAQ,SAAU6K,EAAIvV,GACpC,GAAIuV,IAAOrW,EAAK,CACd,MAAMqd,EAAUH,EAAYjU,OAAOlE,MAEnC,OADAA,KAAK+R,UAAUnV,OAAOb,EAAI,EAAG,EAAGuc,GACzBtY,KAAKiR,YAEZjR,OAKLuY,WAAa,SAAUD,GAIrB,GAAyB,QAArBA,EAAQ/H,SACX,OAAO,KAER,MAAMlS,EAAI2B,KAAK+R,UAAUyG,KACvBlH,GACiB,QAAhBA,EAAGf,UACA+H,EAAQtC,QAAU1E,EAAG0E,OACrBsC,EAAQlC,YAAc9E,EAAG8E,WACzBkC,EAAQ/a,UAAY+T,EAAG/T,SAG7B,OAAIc,GAGG,MAIT4T,OAAS,SAAUqG,GAGjB,QAAgBjZ,IAAZiZ,EAKH,OAFAA,EAAUH,EAAYjU,OAAOlE,MAC7BA,KAAK+R,UAAU5U,KAAKmb,GACbA,EAGR,OAAQA,EAAQ,UAEhB,UAAKjZ,EAEJ,QAA0BA,IAAtBiZ,EAAgB,OAAiB,CACnC,GAAyB,QAArBA,EAAQ/H,UACa,aAArB+H,EAAQ/H,UACc,gBAArB+H,EAAQ/H,SAEX,YADA1Q,MAAMsD,IAAI,IAAK,2CAKjBmV,EAAQhI,OAAOtQ,MAEf,MAAMyY,EAAOzY,KAAKuY,WAAWD,GAC7B,OAAa,OAATG,GACFzY,KAAK+R,UAAU5U,KAAKmb,GACbA,GAEFG,EAIT,YADA5Y,MAAMsD,IAAI,IAAK,wCAGhB,IAAK,YAEJ,MAAMiU,EAAMW,EAAS7T,OAAOlE,KAAMsY,GAClC,QAAYjZ,IAAR+X,EACF,OAEF,MAAMqB,EAAOzY,KAAKuY,WAAWnB,GAC7B,OAAa,OAATqB,GACFzY,KAAK+R,UAAU5U,KAAKia,GACbA,GAEFqB,EAER,IAAK,iBAGJ,MAAMC,EAAWL,EAAcnU,OAAOlE,KAAMsY,GAC5C,QAAiBjZ,IAAbqZ,EACF,OAGF,OAAIA,EAASlI,cAAgBxQ,KAAKwQ,aAC/BkI,EAASC,WAAWlS,SAAQ,SAAS6K,GAEvB,OADAtR,KAAKuY,WAAWjH,KAE3BtR,KAAK+R,UAAU5U,KAAKmU,GACpBA,EAAGhB,OAAOtQ,SAEXA,MACH0Y,EAAS3G,UAAY,GACrB2G,EAASlM,UACFxM,OAETA,KAAK+R,UAAU5U,KAAKub,GACbA,GAER,IAAK,oBAEH,MAAME,EAAclD,EAAiBxR,OAAOlE,KAAMsY,GAElD,QAAoBjZ,IAAhBuZ,EACF,OAcF,OADD5Y,KAAK+R,UAAU5U,KAAKyb,GACZA,EAET,QAEC,YADA/Y,MAAMsD,IAAI,IAAK,6CAMlB8N,OAAS,WACP,MAAMnK,EAAI9G,KAIV,GAA2B,IAAvB8G,EAAEiL,UAAUzV,OAAc,CAE7B,MAAMgU,EAASxJ,EAAEwJ,SACXgB,EAAKxK,EAAE+R,WAAW,GAOxB,OAHA/R,EAAEiL,UAAY,GAGU,OAApBzB,EAAOC,SACFD,EAAOmF,eAAe3O,EAAGwK,GAAIL,UAIpCnK,EAAE0F,UAEF8D,EAAO4B,KAAKZ,GACZA,EAAGhB,OAAOA,GACHA,EAAO4B,QAIjB,QAAc7S,IAAVyH,EAAE7B,IACL,OAAO6B,EAER,MAAMkL,EAAQlL,EAAE7B,IAChB+M,EAAMpI,aAAa,iBAAkB9C,EAAE0J,aAEvC7P,EAAgBqR,GAGhBlL,EAAEiL,UAAUtL,QACV6K,GAAMU,EAAM7P,YAAYmP,EAAGvM,YAI7B,IAAIuM,EAAKxK,EAAEqL,UACO,OAAjBrL,EAAE0J,YACe,MAAjB1J,EAAE0J,aACF,GAWD,OARAwB,EAAM7P,YAAYmP,EAAGvM,WAEjBlF,MAAMqV,IACRrV,MAAMqV,GAAGnQ,UAAUoQ,cACjB,IAAIC,YAAY,WAAY,CAACC,OAAWvO,KAIrCA,GAIT/B,QAAU,WACR,MAAM+B,EAAI9G,KAEV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE7B,IAEV,MAAMvG,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,OAMzC,OALA3D,EAAEkL,aAAa,QAAS,YAGxB9C,EAAEmK,SAEKvS,GAIT8R,UAAY,SAAUc,GACpB,GAAyB,IAArBpU,UAAUZ,OAAc,CAC3B,IAAI8b,EAAgB5b,KAAK8U,GAKvB,YADAzR,MAAMsD,IAAI,IAAK,0BAHfnD,KAAK8S,IAAMxB,EAOd,OAAOtR,KAAK8S,KAAO,OAIrB6F,SAAW,WACT,OAAO3Y,KAAK+R,WAId8G,WAAa,SAAUjb,GACrB,OAAOoC,KAAK+R,UAAUnU,IAKxB6X,eAAiB,SAAUqD,EAAOC,GAEhC,IAAK,IAAIhd,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAE1C,GAAIiE,KAAK+R,UAAUhW,KAAO+c,EAkCxB,MA/BuB,QAAnBC,EAAMxI,UACa,QAAnBwI,EAAMxI,UACc,gBAAnBwI,EAAMxI,UAGPwI,EAAMvI,aAAexQ,KAAKwQ,aAC5BxQ,KAAK+R,UAAUhW,GAAKgd,EACpBA,EAAMzI,OAAOtQ,QAObA,KAAK+R,UAAUnV,OAAOb,EAAG,GAGxBgd,EAAMJ,WAAWK,UAAUvS,SACzB,SAAS6K,GACRtR,KAAK+R,UAAUnV,OAAOb,EAAG,EAAGuV,GAC5BA,EAAGhB,OAAOtQ,QAEXA,MAIH+Y,EAAMhH,UAAY,GAClBgH,EAAMvM,WAGRsM,EAAMtM,UACCxM,KAGV,OAAO,GAKTgR,WAAa,SAAU/V,GAErB,IAAK,IAAIc,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAC1C,GAAIiE,KAAK+R,UAAUhW,KAAOd,EAQxB,OALA+E,KAAK+R,UAAUnV,OAAOb,EAAE,GAGxBd,EAAIuR,UAEGxM,MAUZ4S,SAAW,SAAUD,GAEnB,QAAatT,IAATsT,EACH,OAAO3S,KAER,QAAsBX,IAAlBsT,EAAK,SAER,YADA9S,MAAMsD,IAAI,IAAK,wCAIhB,QAA0B9D,IAAtBsT,EAAgB,WACY,iBAAtBA,EAAgB,UAEzB,YADA9S,MAAMsD,IAAI,IAAK,oCAIhB,MAAMqN,EAAYmC,EAAgB,UAIlC,GAFA3S,KAAKwQ,UAAUA,EAAU/T,QAAQ,cAAc,UAEtB4C,IAArBsT,EAAe,UACdA,EAAe,oBAAajH,MAQjC,OAFAiH,EAAe,SAAElM,QAAQ1K,GAAKiE,KAAKiS,OAAOlW,IAEnCiE,KAPNH,MAAMsD,IAAI,IAAK,iCAWlBiP,OAAS,WACP,MAAM6G,EAAU,IAAIvN,MAMpB,OALA1L,KAAK+R,UAAUtL,SAAQ,SAAS6K,GACX,QAAhBA,EAAGf,UACL0I,EAAQ9b,KAAKmU,EAAGc,aAGZ,CACNC,QAAc,SAAWrS,KAAKuQ,SAC9BC,UAAc,aAAexQ,KAAKwQ,YAClCmI,SAAcM,IAKjBzG,QAAU,SAAU0G,GAClB,IAAIjO,EAAOjL,KAAK+R,UACZoH,QAAO,SAAU7H,GACf,OAAQA,EAAGiB,gBAEbnW,KAAI,SAAUkV,GACb,MAAwB,aAAhBA,EAAGf,SACTe,EAAGkB,SAAQ,GACXlB,EAAGkB,aAGV,GAAoB,IAAhBvH,EAAK3O,OACR,OAAO2O,EAAKpO,KAAK,IACb,CACJ,MAAMqW,EAAMjI,EAAKpO,KAA0B,OAArBmD,KAAKwQ,YAAuB,MAAQ,OAC1D,OAAO0I,EAAW,IAAMhG,EAAM,IAAMA,KAKzC,OAAOmF,KAMTte,EAAO,UAAU,CAAC,YAAa,SAAS,SAAU4T,GAEhD,MAAMhL,EAAM9C,MAAM6C,OAElB,MAAO,CASLwB,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MACVoE,MAAMD,IAKVC,MAAQ,SAAUD,GAChB,MAAM2C,EAAI9G,KAEV,QAAkBX,IAAd8E,EAAO,GACV,MAAM,IAAI1G,MAAM,sBAEjBqJ,EAAEoQ,KAAO/S,EAAO,GAChB2C,EAAEwQ,MAASnT,EAAO,GAElB,MAAM8R,EAAInP,EAAEoQ,KAKZ,OAJApQ,EAAEsS,MAASzW,EAAI,MAAQsT,GAAKtT,EAAI,MAAQsT,GAAKA,EAE7CnP,EAAElC,SAAW,IAAMkC,EAAEsS,MAAM7X,cAEpBuF,GAQT3B,QAAU,SAAUzG,GAClBsB,KAAKkH,OAAOmS,QACXrZ,KAAKkX,KACLlX,KAAKsX,OAEN5Y,EAAEqB,QASJ1E,KAAO,WACL,OAAO2E,KAAKoZ,OAOdhW,KAAO,WACL,OAAOpD,KAAKsX,OAOdtB,IAAM,WACJ,OAAOhW,KAAKkX,MAOdnS,QAAU,WACR,MAAM+B,EAAI9G,KAGV,QAAcX,IAAVyH,EAAE7B,IACL,OAAO6B,EAAE7B,IAGV,IAAIC,EAAK9C,SAASC,cAAc,MAUhC,OATIyE,EAAEwQ,OACJpS,EAAG0E,aAAa,YAAa9C,EAAEwQ,OAEjCpS,EAAG0E,aAAa,WAAa9C,EAAEoQ,MAG/BhS,EAAY,QAAI4B,EAAE3B,QAAQC,KAAK0B,GAE/B5B,EAAG5C,KAAKwE,EAAEsS,OACHtS,EAAE7B,IAAMC,OAOrBnL,EAAO,YAAY,CAAC,gBAAgB,SAAUuf,GAC5C,MAAO,CAKLpV,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOoV,GACpBjV,UAAUrE,MAAMoE,MAAMD,IAOzBgB,QAAU,SAAUzG,GAClB,IAAIuI,EAAIjH,KAAKkH,OACT3J,EAAQyC,KAAKzC,QACjB0J,EAAEoS,QAAQ9b,EAAO,eAUvBxD,EAAO,UAAU,CACf,OACA,UACA,cACC,SACDwU,EACAZ,EACA2L,GAEA,MAAO,CAELpV,OAAS,SAAUC,GACjB,MAAMlJ,EAAMP,OAAOwJ,OAAOqK,GACnBlK,UAAUrE,MACVoE,MAAMD,EAAQ,CACbwJ,UAAYA,EACZ2L,YAAcA,IAWtB,OATAre,EAAI8M,MAAM,GAGV9M,EAAI8J,UAAU+E,iBACZ,QAAQ,SAAUpL,GAChBsB,KAAKkH,KAAKC,UAIPlM,GAOTkc,SAAW,SAAU3H,GACnBxP,KAAKuZ,IAAM/J,GAOb6J,QAAU,SAAUrD,EAAK5S,QACN/D,IAAbW,KAAKuZ,KACPvZ,KAAKuZ,IAAIvD,EAAK5S,IASlBuT,OAAS,SAAUX,GACjB,MAAMwD,EAAQxZ,KAAKyL,OAAO+M,KAAKzc,GAAKA,EAAEia,QAAUA,GAEhD,GAAIwD,EACF,OAAOA,EAAMpW,YAerBrJ,EAAO,eAAe,CAAE,SAAU,WAEhC,MAAO,CAKLmK,OAAS,SAAUuV,GACjB,OAAO/e,OAAOwJ,OAAOlE,MAAMoE,MAAMqV,IAOnCrV,MAAQ,SAAUqV,GAChB,QAAkBpa,IAAdoa,EACF,MAAM,IAAIhc,MAAM,qBAGhB,OADAuC,KAAK0Z,WAAaD,EACXzZ,MAQX+E,QAAU,WAGR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAId,MAAM0U,EAASvX,SAASC,cAAc,MACtCsX,EAAO9X,UAAUE,IAAI,QAErB,MAAM0X,EAAYzZ,KAAK0Z,WACvB,IAAIE,EAAQC,EAAQC,EAYpB,OAVApf,OAAOqf,KAAKN,GAAWhT,SAAQ,SAAUwP,GACvC2D,EAASD,EAAO1X,KAAK,OACrB4X,EAASD,EAAO3X,KAAK,MACrB4X,EAAOvX,KAAK2T,GACZ4D,EAAOjQ,aAAa,QAASqM,GAC7B6D,EAASF,EAAO3X,KAAK,MACrB6X,EAAOxX,KAAK,IAAI0X,OAAOP,EAAUxD,IAAIgE,qBAGvCja,KAAKiF,IAAM0U,EACJ3Z,KAAKiF,SAclBlL,EAAO,aAAa,CAAC,SAAS,WAE5B8F,MAAMmX,kBAAoB,IAAI5W,OAAO,oBACrCP,MAAMkX,aAAoB,IAAI3W,OAAO,wCAKrC,MAAMuC,EAAM9C,MAAM6C,OAClBC,EAAIuX,KAAOvX,EAAIuX,MAAQ,CACrB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAEtCvX,EAAIwX,MAAQxX,EAAIwX,OAAS,CACvB,UAAW,WAAY,QAAS,QAChC,MAAO,OAAQ,OAAQ,SACvB,YAAa,UAAW,WACxB,YAGF,MAAMC,EAAIhY,SAGV,MAAO,CAKL8B,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAK7BA,MAAQ,WAEN,OADApE,KAAKqa,UAAY,GACVra,MAOTsa,OAAS,SAAUC,EAAMC,EAAOC,GAC9B,MAAM3T,EAAI9G,KACV,OAAI9C,UAAUZ,QAAU,GACtBwK,EAAEuT,UAAY,CAACE,KAASA,GACxBzT,EAAE4T,UAAYH,EACVrd,UAAUZ,QAAU,IACtBwK,EAAEuT,UAAiB,MAAIG,EACvB1T,EAAE6T,WAAaH,EACXtd,UAAUZ,QAAU,IACtBwK,EAAEuT,UAAe,IAAII,EACrB3T,EAAE8T,SAAWH,IAIV3T,GAGFA,EAAEuT,WAQXQ,IAAM,SAAUN,EAAMC,EAAOC,GAC3Bza,KAAKsa,OAAOC,EAAMC,EAAOC,GACzBza,KAAK8a,UAKPA,OAAS,gBACazb,IAAhBW,KAAK+a,OACP/a,KAAK+a,OAAO/a,KAAKqa,WAEjB9W,QAAQyX,IAAIhb,KAAKqa,YAWrBlV,QAAU,SAAUqK,GAClBxP,KAAK+a,OAASvL,GAOhBsI,MAAQ,WACN,OAAO9X,KAAKoU,QAUd7G,KAAO,SAAUgN,EAAMC,GAErB,MAAM9b,EAAIsB,KAAKiF,IAAMmV,EAAE/X,cAAc,OACrC3D,EAAEkL,aAAa,WAAY,GAC3BlL,EAAEyK,MAAMiC,QAAU,EAClB1M,EAAEmD,UAAUE,IAAI,cAEhB,MAAMkZ,EAAQ,IAAIC,KACZpU,EAAI9G,KAgDV,OA7CA8G,EAAE4T,eAAsBrb,IAATkb,EAAsBA,EAClCzT,EAAEuT,UAAgB,KAAIra,KAAKqa,UAAgB,KAC3CY,EAAME,UAAY,KAGrBrU,EAAE6T,WAAaH,IACZ1T,EAAEuT,UAAiB,MAAIvT,EAAEuT,UAAiB,MACzCY,EAAMG,WAAa,GAGvB1c,EAAEyD,YAAY2E,EAAEuU,gBAChB3c,EAAEyD,YAAY2E,EAAEwU,eAChB5c,EAAEyD,YAAY2E,EAAEyU,cAChBzU,EAAEsN,OAAS1V,EAAEyD,YAAY2E,EAAE0U,iBAG3B9c,EAAEoL,iBACA,YACA,SAAUa,GACR3K,KAAKwU,UAAW,GAChBpP,KAAK0B,IAGTpI,EAAEoL,iBACA,UACA,SAAUa,GACR3K,KAAKwU,UAAW,EAChBxU,KAAKoU,OAAO1J,SACZtF,KAAK0B,IAGTA,EAAEsN,OAAOtK,iBACP,OACA,SAAUa,GACH3K,KAAKwU,UACJxU,KAAK4X,WAAW5X,KAAKoU,OAAO7W,QAC9ByC,KAAK8a,SAGTnQ,EAAG5K,QACHqF,KAAK0B,IAGTA,EAAEsN,OAAO1J,QAEF5D,EAAE7B,KAGXuW,cAAgB,WAId,MAAM1D,EAAQsC,EAAE/X,cAAc,SA4B9B,OA3BAyV,EAAMva,MAAQyC,KAAKoB,WACnB0W,EAAMlO,aAAa,WAAY,GAE/BkO,EAAMhO,iBACJ,QACA,SAAUpL,GACJsB,KAAK4X,WAAWE,EAAMva,SACxByC,KAAKyb,cACLzb,KAAK0b,eACL1b,KAAK2b,eAEPvW,KAAKpF,OAGT8X,EAAMhO,iBACJ,WACA,SAAUpL,GACR,GAAiB,IAAbA,EAAEsC,QAKJ,OAJIhB,KAAK4X,WAAWE,EAAMva,QACxByC,KAAK8a,SAEPpc,EAAEqB,QACK,GAETqF,KAAKpF,OAGF8X,GAOT/S,QAAU,WACR,OAAO/E,KAAKiF,KAOdgW,MAAQ,WACN,MAAMA,EAAQ,IAAIC,KAClB,IAAIhI,EAAM+H,EAAME,UAAY,KAC5B,MAAMlU,EAAIgU,EAAMG,WAAa,EACvBhB,EAAIa,EAAMW,UAGhB,OAFA1I,GAAO,KAAOjM,EAAI,GAAK,IAAMA,EAAIA,GACjCiM,GAAO,KAAOkH,EAAI,GAAK,IAAMA,EAAIA,GAC1BlH,GAOT9R,SAAW,WAET,IAAI2C,EAAI,GACR,MAAMwF,EAAIvJ,KAAKqa,UAYf,OAXI9Q,EAAQ,OACVxF,GAAKwF,EAAQ,KACTA,EAAS,QACXxF,GAAK,IACLA,GAAKwF,EAAS,MAAI,GAAK,IAAMA,EAAS,MAAIA,EAAS,MAC/CA,EAAO,MACTxF,GAAK,IACLA,GAAKwF,EAAO,IAAI,GAAK,IAAMA,EAAO,IAAIA,EAAO,OAI5CxF,GAOT8X,SAAW,WACT,MAAM/U,EAAI9G,KACV,GAAI8G,EAAE4T,UAAY,KAKhB,OAJA5T,EAAE4T,YACF5T,EAAE2U,cACF3U,EAAE4U,eACF5U,EAAE6U,aACK7U,GASXgV,SAAW,WACT,MAAMhV,EAAI9G,KACV,GAAI8G,EAAE4T,UAAY,EAKhB,OAJA5T,EAAE4T,YACF5T,EAAE2U,cACF3U,EAAE4U,eACF5U,EAAE6U,aACK7U,GASXiV,UAAY,WACV,MAAMjV,EAAI9G,KAUV,OATA8G,EAAE6T,aACE7T,EAAE6T,WAAa,IACjB7T,EAAE6T,WAAa,EACf7T,EAAE+U,aAGF/U,EAAE4U,eACF5U,EAAE6U,cAEG7U,GAOTkV,UAAY,WACV,MAAMlV,EAAI9G,KAWV,OAVA8G,EAAE6T,aACE7T,EAAE6T,WAAa,GACjB7T,EAAE6T,WAAa,GACf7T,EAAEgV,aAGFhV,EAAE4U,eACF5U,EAAE6U,cAGG7U,GAKTwU,YAAc,WACZ,MAAMxU,EAAI9G,KACJua,EAAOH,EAAE/X,cAAc,OAmB7B,OAlBAkY,EAAK1Y,UAAUE,IAAI,QAGnBwY,EAAKtY,KAAK,QACPkD,QAAU2B,EAAEgV,SAAS1W,KAAK0B,GAE7BA,EAAEmV,UAAY1B,EAAKtY,KAAK,QACxB6E,EAAEmV,UAAU3Z,KAAKwE,EAAE4T,WAEnB5T,EAAEmV,UAAU9W,QAAU,WACpB2B,EAAE+T,IAAI/T,EAAE4T,YACRtV,KAAK0B,GACPA,EAAEoV,cAGF3B,EAAKtY,KAAK,QACPkD,QAAU2B,EAAE+U,SAASzW,KAAK0B,GAEtByT,GAKTkB,YAAc,WACZzb,KAAKic,UAAUpb,WAAW0O,KAAOvP,KAAK0a,UACtC1a,KAAKkc,eAKPA,YAAc,WACRlc,KAAK0a,YAAc1a,KAAKsa,SAAe,KACzCta,KAAKic,UAAUpa,UAAUE,IAAI,YAE7B/B,KAAKic,UAAUpa,UAAUG,OAAO,aAKpCqZ,aAAe,WACb,MAAMvU,EAAI9G,KACJwa,EAAQJ,EAAE/X,cAAc,OAmB9B,OAlBAmY,EAAM3Y,UAAUE,IAAI,SAGpByY,EAAMvY,KAAK,QACRkD,QAAU2B,EAAEkV,UAAU5W,KAAK0B,GAE9BA,EAAEqV,UAAY3B,EAAMvY,KAAK,QACzB6E,EAAEqV,UAAU7Z,KAAKK,EAAIwX,MAAMrT,EAAE6T,WAAW,IACxC7T,EAAEqV,UAAUhX,QAAU,WACpBnF,KAAK6a,IAAI7a,KAAK0a,UAAW1a,KAAK2a,aAC9BvV,KAAK0B,GAEPA,EAAEsV,eAGF5B,EAAMvY,KAAK,QACRkD,QAAU2B,EAAEiV,UAAU3W,KAAK0B,GAEvB0T,GAITkB,aAAe,iBACWrc,IAApBW,KAAK2a,YAA4B3a,KAAK2a,WAAa,MACrD3a,KAAK2a,WAAa,GAEpB3a,KAAKmc,UAAUtb,WAAW0O,KAAO5M,EAAIwX,MAAMna,KAAK2a,WAAW,GAC3D3a,KAAKoc,gBAKPA,aAAe,WACb,MAAMtV,EAAI9G,KACN8G,EAAE4T,YAAc5T,EAAEwT,SAAe,MACjCxT,EAAE6T,aAAe7T,EAAEwT,SAAgB,MACrCxT,EAAEqV,UAAUta,UAAUE,IAAI,YAE1B+E,EAAEqV,UAAUta,UAAUG,OAAO,aAKjCuZ,WAAa,WACX,MAAMc,EAAQjC,EAAE/X,cAAc,SAGxBia,EAAKD,EAAMpa,KAAK,SAASA,KAAK,MACpC,IAAK,IAAIlG,EAAI,EAAGA,EAAI,EAAGA,IACrBugB,EAAGra,KAAK,MAAMK,KAAKK,EAAIuX,KAAKne,IAM9B,OAHAiE,KAAKuc,WAAavc,KAAKwc,WAEvBH,EAAMla,YAAYnC,KAAKuc,YAChBF,GAKTG,SAAW,WACT,MAAMC,EAAW,IAAIvB,KACnBlb,KAAK0a,UACL1a,KAAK2a,WAAa,EAClB,EACA,EACA,EACA,EACA,GAEI+B,EAAO,IAAIxB,KACflb,KAAK0a,UACL1a,KAAK2a,WAAa,EAClB,EACA,EACA,EACA,EACA,GAEIM,EAAQ,IAAIC,KACZxL,EAAO1P,KAIP2c,EAAQ,WACZjN,EAAKmL,IACHnL,EAAKgL,UACLhL,EAAKiL,WACLlS,SAASzI,KAAKa,WAAW0O,QAK7BmN,EAAKE,QAAQF,EAAKd,WAAcc,EAAKG,SAAW,GAAK,GAErD,MAAMC,EAAK1C,EAAE/X,cAAc,SAErBkH,EAAIvJ,KAAKsa,SAEf,IAAIgC,EAAIvgB,EAAGghB,EAGX,OAAU,CAIR,IADAT,EAAKQ,EAAG7a,KAAK,MACRlG,EAAI,EAAGA,EAAI,EAAGA,IACjBghB,EAAKT,EAAGra,KAAK,MAGTya,EAAKtB,aAAeqB,EAASrB,WAC/B2B,EAAGlb,UAAUE,IAAI,OAGjBgb,EAAG5X,QAAUwX,EAIXD,EAAKd,YAAkBX,EAAMW,WAC7Bc,EAAKtB,aAAkBH,EAAMG,YAC7BsB,EAAKM,gBAAkB/B,EAAM+B,eAC/BD,EAAGlb,UAAUE,IAAI,SAIfwH,GAAKA,EAAO,KACVmT,EAAKd,YAAkBrS,EAAO,KAC9BmT,EAAKtB,aAAkB7R,EAAS,MAAE,GAClCmT,EAAKM,gBAAkBzT,EAAQ,MACjCwT,EAAGlb,UAAUE,IAAI,YAKrBgb,EAAGza,KAAKoa,EAAKd,WAGbc,EAAKE,QAAQF,EAAKd,UAAY,GAGhC,GAAIc,EAAKtB,aAAeqB,EAASrB,WAC/B,MAEJ,OAAO0B,GAITnB,WAAa,WACX,MAAMsB,EAAUjd,KAAKwc,WACrBxc,KAAKuc,WAAW1W,WAAWC,aACzBmX,EACAjd,KAAKuc,YAEPvc,KAAKuc,WAAaU,GAOpBrF,WAAa,SAAU7T,GACrB,QAAU1E,IAAN0E,EACF,OAAO,EAET,IAAKlE,MAAMkX,aAAava,KAAKuH,GAC3B,OAAO,EAET,MAAMqW,EAAIrW,EAAE5H,MAAM,IAAK,GAOvB,OANAie,EAAE,GAAK3R,SAAS2R,EAAE,IACdA,EAAE,KAAIA,EAAE,GAAK3R,SAAS2R,EAAE,KACxBA,EAAE,KAAIA,EAAE,GAAK3R,SAAS2R,EAAE,KAG5Bpa,KAAKsa,OAAOF,EAAE,GAAIA,EAAE,GAAIA,EAAE,KACnB,OAcbrgB,EAAO,QAAQ,CAAC,cAAe,SAAS,SAAUoW,GAEhD,MAAO,CACLjM,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAKnCjL,MAAQ,SAAUiL,GAChB,MAAMvI,EAAI9G,KACV8G,EAAEoW,MAAQ,GAQVpW,EAAEqW,SAAW9N,EACb,MAAM+N,EAAI,CAAC,SAAU,gBAYrB,OAVI/N,GACF+N,EAAEjgB,KAAKC,MAAMggB,EAAE/N,GAEjBvI,EAAEuW,QAAUlN,EAAiBjM,OAAOkZ,GAAGhY,KAAKpF,MAG5C8G,EAAEwW,SAAU,EAGZxW,EAAEuW,QAAQ7O,MAAQ1H,EACXA,GAOT/B,QAAU,WACR,GAAI/E,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMvG,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UACbD,EAAGG,IAAI,SAEH/B,KAAKmd,UACPvb,EAAGG,IAAI3E,MAAMwE,EAAI5B,KAAKmd,UAExBnd,KAAKud,OAAS7e,EAAEuD,KAAK,OAIrB,MAAMub,EAAQxd,KAAKqd,QAAQtY,UAI3B,OAHKyY,EAAM3X,YACTnH,EAAEyD,YAAYqb,GAETxd,KAAKiF,IAAMvG,GAOpB+e,aAAe,WAEb,OADAzd,KAAK+E,UACE/E,KAAKud,QAOdxb,IAAM,SAAU2b,GAGd1d,KAAKkd,MAAM/f,KAAKugB,GAGZ1d,KAAKsd,QACPtd,KAAKyd,eAAeH,QAClBI,EAAK3Y,WAIP/E,KAAKyd,eAAetb,YAClBub,EAAK3Y,WAIL2Y,EAAKC,YACPD,EAAKC,aAEPD,EAAKlP,MAAQxO,MAOf4d,QAAU,SAAUF,GAClB1d,KAAKkd,MAAMzW,SAAQ,SAAS/H,EAAG3C,EAAG4X,GAC5BjV,IAAMgf,IACR/J,EAAE5X,QAAKsD,OAWbgF,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,UAYbjG,EAAO,OAAO,CAAC,cAAe,SAAS,SAAUoW,GAE/C,MAAMxN,EAAM9C,MAAM6C,OAGlB,OAFAC,EAAIkb,MAAQlb,EAAIkb,OAAa,QAEtB,CACL3Z,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOlE,MAAMoE,MAAMiL,IAInCjL,MAAQ,SAAUiL,GAChBrP,KAAKwO,WAAQnP,EACbW,KAAKmd,SAAW9N,EAChBrP,KAAK8d,QAAS,EAGd,MAAMV,EAAI,CAAC,SAAU,eAarB,OAZI/N,GACF+N,EAAEjgB,KAAKC,MAAMggB,EAAE/N,GAEjBrP,KAAKqd,QAAUlN,EAAiBjM,OAAOkZ,GAAGhY,KAAKpF,MAE/CA,KAAKqd,QAAQtb,IAAIY,EAAIkb,MAAO,CAACtM,IAAM,CAAC,cAAc,WAAW,SAAU7S,GACrEsB,KAAK+d,WAIP/d,KAAKqd,QAAQK,KAAO1d,KAEbA,MAOT+E,QAAU,WACR,GAAI/E,KAAKiF,IAEP,OADAjF,KAAKiF,IAAIpD,UAAUE,IAAI,QAChB/B,KAAKiF,IAId,MAAMvG,EAAI0D,SAASC,cAAc,OAC3BT,EAAKlD,EAAEmD,UAOb,GALAD,EAAGG,IAAI,OAAQ,QACX/B,KAAKmd,UACPvb,EAAGG,IAAI3E,MAAMwE,EAAI5B,KAAKmd,eAGN9d,IAAdW,KAAKuN,KAAoB,CAC3B,MAAMhE,EAAIvJ,KAAKuN,OACf,IAAIhE,EAGF,OAAO7K,EAFPA,EAAEyD,YAAYoH,GAUlB,OAJAvJ,KAAK8d,QAAS,EAEdpf,EAAEyD,YAAYnC,KAAKqd,QAAQtY,WAEpB/E,KAAKiF,IAAMvG,GAOpB4P,MAAQ,WACN,OAAOtO,KAAK8d,QAOdE,SAAW,WACLhe,KAAKiF,KACPjF,KAAKiF,IAAIpD,UAAUG,OAAO,SAW9B+b,MAAQ,WAGF/d,KAAKie,SACPje,KAAKie,UAEP,MAAMvf,EAAIsB,KAAK+E,UACXrG,EAAEmH,YACJnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAKwO,MAAMoP,QAAQ5d,MACnBA,KAAK8d,QAAS,GAUhBzZ,UAAY,SAAUC,GACpB,IAAK,IAAIpJ,KAAQoJ,EACftE,KAAK9E,GAAQoJ,EAAMpJ,GAErB,OAAO8E,UAYbjG,EAAO,oBAAoB,CAAC,OAAQ,eAAgB,gBAC7C,SAAUmkB,EAAWC,EAAWC,GAGrC,MAAMzb,EAAQ9C,MAAM6C,OAGpB,OAFAC,EAAI0b,QAAU1b,EAAI0b,SAAW,UAEtB,CACLna,OAAS,SAASgR,EAAI1G,GACpB,OAAO9T,OAAOwJ,OAAOga,GACnB9Z,MAAM,CAAE,gBACRC,UAAUrE,MACVoE,MAAM8Q,EAAI1G,IAGdpK,MAAQ,SAAS8Q,EAAI1G,GAGnB,OAFAxO,KAAKkV,GAAKA,EACVlV,KAAKwO,MAAQA,EACNxO,MASTse,MAAQ,WACN,OAAOte,KAAKkV,IAOdqJ,aAAe,SAAU/O,GACvB,MAAM0F,EAAKlV,KAAKkV,GAEhB,IACErV,MAAM4C,IAAI+b,YAAYtJ,EAAG1C,WAAW,SAASiM,GAC3C,GAAqB,OAAjBA,EAIJ,QAAqBpf,IAAjBof,EAAJ,CAMA,GAAsC,OAAlCA,EAA4B,oBACSpf,IAAlCof,EAA4B,cAAiB,CAClD,MAAMC,EAAQD,EAA4B,cAG1C,OAFA5e,MAAMsD,IAAI,EAAGub,EAAM,GAAG,SACtBlP,EAAG,MAILA,EAAGiP,QAbDjP,EAAG,WAJHA,EAAG,SAqBT,MAAO9Q,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAQPjC,KAAO,WAEL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAMC,EAAYxc,SAASC,cAAc,OAkBzC,OAjBAuc,EAAU/c,UAAUE,IAAI,YAAa,WAMrC/B,KAAKue,cAAa,SAAS9E,GACzBmF,EAAU/c,UAAUG,OAAO,WAET,OAAdyX,GAGJmF,EAAUzc,YACRgc,EAAUja,OAAOuV,GAAW1U,cAIzB/E,KAAK2e,MAAQC,GAOtBC,gBAAkB,WAChB,IAAIC,EAAYjf,MAAMqV,GAAG1C,UACzB,MAAMuM,EAAY/e,KAAKkV,GAAG8J,YAStBF,GAA2B,KAAdA,KACXA,EAAUG,WAAW,OACvBH,EAAYA,EAAUhkB,MAAM,EAAGgkB,EAAUxiB,OAAO,IAG9CwiB,GAAaC,GACf/e,KAAKkf,gBAUXA,YAAc,WACZ,MAAMC,EAAQnf,KAAK2e,MAEnB,GAA0D,GAAtDQ,EAAMC,uBAAuB,eAAe9iB,OAAa,CAC3D,MAAM+iB,EAAMjB,EAAYla,OAAO,CAAC,cAAe,iBAE/Cmb,EAAItd,IAAIY,EAAI0b,QAAS,CAAC9M,IAAM,CAAC,UAAW,gBAAiB,SAAU7S,GACjEygB,EAAMtd,UAAUG,OAAO,cACvBhC,KAAKwO,MAAM8Q,kBACXla,KAAKpF,OAEPmf,EAAMhd,YAAYkd,EAAIta,WACtBoa,EAAMtd,UAAUE,IAAI,gBAQxBkc,QAAU,WACRje,KAAKkV,QAAK7V,OAgBhBtF,EAAO,WAAW,CAChB,QACA,sBACC,SAAUwlB,EAAYC,GAEbpd,SAAV,MAGMO,EAAM9C,MAAM6C,OAIlB,OAHAC,EAAI8c,UAAW9c,EAAI8c,WAAa,aAChC9c,EAAI+c,cAAgB/c,EAAI+c,eAAoB,oBAErC,CACLxb,OAAS,SAAUgR,GACjB,OAAOxa,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,WAAWC,UAAUrE,MAAMoE,MAAM8Q,IAG3E9Q,MAAQ,SAAS8Q,GAChBlV,KAAKkV,GAAKA,EAKT,OAJelV,KAAKqd,QACZtb,IAAIY,EAAI8c,UAAW,CAAClO,IAAM,CAAC,cAAe,WAChDvR,KAAK2f,eACLva,KAAKpF,OACAA,MAOT2f,YAAa,WACX,MAAM7Y,EAAI9G,KAGV,QAAmBX,IAAfyH,EAAE8Y,UAA0B9Y,EAAE8Y,SAAStR,QAAQ,CACjD,IAAI6Q,EAAQrY,EAAE8Y,SAASrS,OACnB4R,EAAMtd,UAAUC,SAAS,gBAC3BgF,EAAEwY,iBACFH,EAAMtd,UAAUG,OAAO,oBAKR3C,IAAfyH,EAAE8Y,UAA2B9Y,EAAE8Y,SAAStR,UAC1CxH,EAAE8Y,SAAWJ,EAAetb,OAAO4C,EAAEoO,GAAGpO,GACxCA,EAAE/E,IAAI+E,EAAE8Y,UACR9Y,EAAEoO,GAAG8J,WAAanf,MAAMqV,GAAG1C,YAQ/B8M,eAAgB,WACdtf,KAAK4f,SAAS7B,QACd/d,KAAK2f,mBAoDX5lB,EAAO,KAAK,CACV,iBACA,SACA,cACA,iBACA,UACA,eACA,aACA,cACA,WACA,oBACA,cACA,SACC,SACD8lB,EACA9H,EACAM,EACA3C,EACAnH,EACA4P,EACA2B,EACAC,EACAC,EACAR,EACArP,GAEAtQ,MAAM+W,oBAAsB,IAAIxW,OAC9B,yCACFP,MAAMgX,oBAAsB,IAAIzW,OAAO,eACvCP,MAAMiX,kBAAoBjX,MAAM+W,oBAChC/W,MAAMogB,sBAAwB,IAAI7f,OAChC,mCACFP,MAAMqgB,iBAAkB,EAGxB,MAAMvd,EAAM9C,MAAM6C,OAsClB,OArCAC,EAAI8c,UAAmB9c,EAAI8c,WAAoB,aAC/C9c,EAAI+c,cAAmB/c,EAAI+c,eAAoB,oBAC/C/c,EAAIwd,cAAmBxd,EAAIwd,eAAoB,cAC/Cxd,EAAIyd,iBAAmBzd,EAAIyd,kBAAoB,mBAC/Czd,EAAI0d,SAAmB1d,EAAI0d,UAAoB,WAE/CxgB,MAAM6W,gBAAarX,EACnBQ,MAAM8X,cAAgBmI,EAAQ5b,SAG9BrE,MAAM2X,eAAiB,CACrB/P,OAAW8G,EAAUrK,OAAO,CAC1B,CAAE,KAAM,MACR,CAAE,KAAM,QAEV3B,KAASgM,EAAUrK,OAAO,CACxB,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,WAAY,MACd,CAAE,cAAe,QAEnBwY,KAASnO,EAAUrK,OAAO,CACxB,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,MAAO,MACT,CAAE,MAAO,QAEX2P,MAAUtF,EAAUrK,OAAO,CACzB,CAAE,KAAM,MACR,CAAE,KAAM,SAQL,CAKLqM,OAAS,WACP,OAAO,MAKTnM,MAAQ,SAASkc,GAGf,IAAKzgB,MAAMqgB,gBAAiB,CAE1B,MAAMhd,EAAQrD,MAAMiD,gBAGpBI,EAAMqd,WAAW,oHAEmB5d,EAAIC,GAAK,MAAO,GAGpDM,EAAMqd,WACJ,sHAEqB5d,EAAIE,IAAM,MAAO,GAExChD,MAAMqgB,iBAAkB,EAG1B,IAAIM,EAaJ,OAZIF,GACFE,EAAIF,EAAQxlB,QACZ0lB,EAAEC,QAAQ,CAAC,UAAW,SAGtBD,EAAI,CAAC,CAAC,UAAW,QAInB3gB,MAAM6W,WAAanI,EAAUrK,OAAOsc,GACpC3gB,MAAM6W,WAAW3O,MAAM,GAEhB/H,MAOTkE,OAAS,SAAUoc,GACjB,MAAMrlB,EAAMP,OAAOwJ,OAAOlE,MAAMoE,MAAMkc,GAEtC,OADArlB,EAAIylB,MAAQb,EAAe3b,OAAOjJ,GAC3BA,GAQT2X,SAAW,SAASD,GAElB,IAAI1X,EAEJ,QAAaoE,IAATsT,EAGF,GAAqB,aAAjBA,EAAK,SACP1X,EAAM8c,EAAS7T,OAAOlE,KAAM2S,QAIzB,GAAqB,kBAAjBA,EAAK,SACZ1X,EAAMod,EAAcnU,OAAOlE,KAAM2S,OAI9B,CAAA,GAAqB,qBAAjBA,EAAK,SAOZ,YADA9S,MAAMsD,IAAI,IAAK,oCALflI,EAAMya,EAAiBxR,OAAOlE,KAAM2S,QAYtC1X,EAAM4kB,EAAe3b,OAAOlE,MAM9B,OAFAA,KAAKkS,KAAKjX,GAEH+E,MAKT2gB,aAAe,SAAU1lB,GAOvB,OALyB,IAArBiC,UAAUZ,SACZrB,EAAM+E,KAAK0gB,UAITzlB,EAAIqX,YAAcrX,EAAIqX,WAAWhW,SAAW,IAKtB,aAAjBrB,EAAIsV,eAG8ClR,IAArDpE,EAAI0d,WAAWH,KAAKlH,GAAMtR,KAAK2gB,aAAarP,KAYpDJ,MAAQ,WACN,MAAMpK,EAAI9G,KAQV,MAPyB,QAArB8G,EAAE4Z,MAAMnQ,WACVzJ,EAAE4Z,MAAMlU,UACR1F,EAAEoL,KAAK2N,EAAe3b,OAAO4C,KAI/BA,EAAEmK,SACKnK,GAOToL,KAAO,SAASjX,GACd,GAAyB,IAArBiC,UAAUZ,OAAc,CAC1B,MAAMoC,EAAIsB,KAAK4gB,UAEM,OAAjBliB,EAAEmC,WAGAnC,EAAEmC,aAAe5F,EAAI8J,WACvBrG,EAAEoH,aAAa7K,EAAI8J,UAAWrG,EAAEmC,YAMlCnC,EAAEyD,YAAYlH,EAAI8J,WAIpB/E,KAAK0gB,MAAQzlB,EACbA,EAAIqV,OAAOtQ,MAEXA,KAAKiR,SAGP,OAAOjR,KAAK0gB,OAOdE,QAAU,WACR,MAAM9Z,EAAI9G,KAGV,YAAmBX,IAAfyH,EAAE+Z,UAGN/Z,EAAE/B,UAFO+B,EAAE+Z,UAUb9b,QAAU,WACR,MAAM+B,EAAI9G,KACV,IAAItB,EAAIoI,EAAE7B,IAEV,QAAU5F,IAANX,EACF,OAAOA,EAGTA,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,OACnC3D,EAAEmD,UAAUE,IAAI,MAGhB+E,EAAE+Z,SAAWniB,EAAEuD,KAAK,OACpB6E,EAAE+Z,SAASjX,aAAa,QAAS,WAEjC,MAAMgF,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAoBZ,OAjBA0K,EAAI7M,IAAIY,EAAI0d,SAAU,CAAC9O,IAAM,CAAC,cAAc,aAAc,WACxDvR,KAAKge,YACL5Y,KAAK0B,IAEPpI,EAAEyD,YAAYyM,EAAI7J,WAGlB+B,EAAE+Z,SAAS1e,YAAY2E,EAAE4Z,MAAM3b,WAG/B+B,EAAEga,gBAGFha,EAAE7B,IAAI6E,iBAAiB,WAAY,SAAUpL,GAC3CsB,KAAK6e,gBAAgBngB,EAAE2W,SACvBjQ,KAAK0B,IAAI,GAEJpI,GAOTqiB,OAAS,WACP,QAAK/gB,KAAKiF,KAEHjF,KAAKiF,IAAIpD,UAAUC,SAAS,WAOrCkf,KAAO,WACLhhB,KAAK+E,UAAUlD,UAAUE,IAAI,UACzB/B,KAAKihB,QACPjhB,KAAKihB,UAOTjD,SAAW,WACThe,KAAK+E,UAAUlD,UAAUG,OAAO,UAC5BhC,KAAKkhB,YACPlhB,KAAKkhB,cAOTjQ,OAAS,WAOP,OANAjR,KAAK0gB,MAAMzP,SACPpR,MAAMqV,IACRlV,KAAK+E,UAAUoQ,cACb,IAAIC,YAAY,WAAY,CAACC,OAASrV,QAGnCA,MAqCTmhB,QAAU,WACR,MAA4B,QAAxBnhB,KAAK0gB,MAAMnQ,SACN5N,EAAIwd,cAEoB,gBAAxBngB,KAAK0gB,MAAMnQ,SACXvQ,KAAK0gB,MAAM3L,MAGXpS,EAAIyd,kBAMfgB,YAAc,SAAUhK,GACtB,MAAMlF,EAAOlS,KAAKkS,OACZ3B,EAAS2B,EAAK3B,SACdD,EAAS4B,EAAK5B,SAEpB,GAAe,QAAXC,EACFD,EAAO4B,KAAKkF,QAIT,GACQ,QAAX7G,GACa,gBAAXA,GACY,aAAXA,GACqB,OAArB2B,EAAK1B,YACH,CACL,MAAMwB,EAAQlY,EAAQ,eAAeoK,OACnCoM,GAEF0B,EAAMxB,UAAU,OAChBwB,EAAMC,OAAOC,GACbF,EAAMC,OAAOmF,GACbpF,EAAMjN,UACNuL,EAAO4B,KAAKF,OAKM,aAAXzB,EACP2B,EAAKD,OAAOmF,GAKZ7T,QAAQJ,IAAI,uBAIdnD,KAAKiR,UAOPmB,OAAS,WACP,OAAOpS,KAAK0gB,MAAMtO,UAOpBI,QAAU,WACR,OAAOxS,KAAK0gB,MAAMlO,WAOpBsO,cAAgB,WAEd9gB,KAAKwO,MAAQwR,EAAa9b,OAAOlE,MACjCA,KAAKiF,IAAIhD,KAAK,OAAOE,YAAYnC,KAAKwO,MAAMzJ,YAQ9C8Z,gBAAkB,gBACGxf,IAAfW,KAAKwO,YAA+CnP,IAAxBW,KAAKwO,MAAMoR,UACzC5f,KAAKwO,MAAMoR,SAASf,uBAc5B9kB,EAAO,aAAa,CAAC,KAAM,WAAW,SAAUsnB,EAAStJ,GACvD,MAAMpV,EAAM9C,MAAM6C,OAGlBC,EAAI2e,cAAgB,SAGpB3e,EAAI4e,aAAe,CACflP,QAAU,YACV2D,IAAQ,WACRqB,MAAS,WACT9Z,MAAU,aAGdoF,EAAI6e,eAAiB,eAMvBznB,EAAO,SAAS,IAAG,WACjB,MAAM4I,EAAM9C,MAAM6C,OAClBC,EAAIC,GAAK,OACTD,EAAIE,IAAM,MAIVF,EAAIwd,cAAgB,gBACpBxd,EAAIyd,iBAAmB,0BAGvBzd,EAAI+Q,WAAa/Q,EAAI+Q,YAAc,+BAGnC/Q,EAAIuX,KAAO,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAChDvX,EAAIwX,MAAQ,CACV,SAAU,UAAW,OAAQ,QAC7B,MAAO,OAAQ,OAAQ,SACvB,YAAa,UAAW,WACxB,YAIFxX,EAAI8e,QAAY,aAChB9e,EAAI+e,SAAY,QAChB/e,EAAIgf,SAAY,gBAChBhf,EAAIkb,MAAY,YAChBlb,EAAI0d,SAAY,YAChB1d,EAAIif,SAAY,gBAChBjf,EAAIkf,aAAe,0BACnBlf,EAAImf,QAAe,mBACnBnf,EAAIof,UAAe,YACnBpf,EAAIqf,UAAY,eAGhBrf,EAAI8c,UAAY,kBAChB9c,EAAI0b,QAAU,YAId1b,EAAIsf,eAAiB,iBAGrBtf,EAAIuf,WAAa,YACjBvf,EAAIwf,WAAa,SACjBxf,EAAIyf,WAAa,SACjBzf,EAAI0f,WAAa,UACjB1f,EAAI2f,iBAAmB,SAGvB3f,EAAI4f,UAAY,4OAGhB5f,EAAI6f,WAAa,yDAA2D7f,EAAI2e,cAAgB,KAChG3e,EAAI8f,eAAgB,gFACpB9f,EAAI+f,cAAgB,0FACpB/f,EAAIggB,YAAc,+BAClBhgB,EAAIigB,YAAc,iFAClBjgB,EAAIkgB,aAAe,8DACnBlgB,EAAImgB,aAAe,kBACnBngB,EAAIogB,aAAe,gGACnBpgB,EAAIqgB,aAAe,sHACnBrgB,EAAIsgB,UAAY,iBAChBtgB,EAAIugB,YAAc,sBAIlBvgB,EAAIwgB,UAAY,yDAChBxgB,EAAIygB,aAAe,yEACnBzgB,EAAI0gB,cAAgB,uBACpB1gB,EAAI2gB,eAAiB,gEACrB3gB,EAAI4gB,cAAgB,wBACpB5gB,EAAI6gB,YAAc7gB,EAAI6gB,aAAe,iCACrC7gB,EAAI8gB,WAAa9gB,EAAI8gB,YAAc,2CACnC9gB,EAAI+gB,WAAa/gB,EAAIghB,WAAa,6BAClChhB,EAAIghB,UAAYhhB,EAAIghB,WAAa,2EACjChhB,EAAIihB,cAAgB,0BAOtB7pB,EAAO,iBAAiB,CAAC,cAAc,SAAU4T,GAM/C,MAAO,CAMLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MAAMoE,MAAMD,IAO1BI,QAAU,SAAUA,GAIlB,OAHyB,IAArBrH,UAAUZ,SACb0D,KAAKwE,SAAWD,GAEVvE,KAAKwE,UAOdqf,QAAU,WACR,OAAO7jB,KAAK8jB,UAOdC,MAAQ,WACN,OAAO/jB,KAAKgkB,QAQd5gB,KAAO,WACL,OAAOpD,KAAKsX,OAOdnS,QAAU,SAAUzG,GAClB,MAAMwI,EAAOlH,KAAKkH,OAClBA,EAAKC,OACLzI,EAAEqB,YAEmBV,IAAjB6H,EAAKsH,SACRtH,EAAKsH,QAAQyV,QAAQjkB,KAAK8jB,SAAU9jB,KAAKgkB,OAAQhkB,KAAKsX,QAMzDlT,MAAQ,SAAUD,GAChB,QAAkB9E,IAAd8E,EAAO,GACV,MAAM,IAAI1G,MAAM,sBAEjB,MAAMqJ,EAAI9G,KAQV,OANA8G,EAAEsS,MAAWjV,EAAO,GACpB2C,EAAEgd,SAAW3f,EAAO,GACpB2C,EAAEkd,OAAW7f,EAAO,GACpB2C,EAAEwQ,MAAWnT,EAAO,GACpB2C,EAAEtC,SAAWpC,SAASI,eAAesE,EAAEsS,OACvCtS,EAAElC,SAAW,IAAMkC,EAAEvC,UAAUyC,YAAYzF,cACpCuF,OAcb/M,EAAO,qBAAqB,CAAC,SAAS,WAUpC,MAAM4I,EAAM9C,MAAM6C,OAClBC,EAAIqf,UAAYrf,EAAIqf,WAAa,YAEjC,MAAMkC,EAAM9jB,OAAO,eAEnB,SAAS+jB,EAAcC,GACrB,OAA2B,MAAvBA,EAAS/M,MAAM6M,GACV,IAAME,EAAS3nB,QAAQ,MAAO,QAAQA,QAAQ,KAAM,OAAS,IAE/D2nB,EAGT,SAASC,EAAgB1mB,EAAQ2mB,GAG/B,GAAIA,EAAO7e,WAAWnJ,OAAS,EAAG,CAChC,IAAIioB,EAAU,GAOd,OAJAD,EAAO7e,WAAWgB,SAAQ,SAAU4G,GACZ,IAAlBA,EAAKnH,UACPqe,EAAQpnB,KAAKQ,EAASwmB,EAAa9W,EAAKkC,UAErC,IAAMgV,EAAQC,OAAO3nB,KAAK,OAAS,IAK1C,MAAwB,IAApBynB,EAAOG,UACF,GAEF9mB,EAASwmB,EAAaG,EAAOG,WAIxC,MAAO,CAKLvgB,OAAS,SAAUwgB,GACjB,OAAOhqB,OAAOwJ,OAAOlE,MAAMoE,MAAMsgB,IAInCtgB,MAAQ,SAAUsgB,GAGhB,QAAmBrlB,IAAfqlB,EACF,MAAM,IAAIjnB,MAAM,sBACb,KAAMinB,aAAsBC,MAC/B,MAAM,IAAIlnB,MAAM,oBAElB,MAAMqJ,EAAI9G,KAGV8G,EAAE8d,OAAS,GAGX9d,EAAE+d,YAAcH,EAGhB5d,EAAE+d,YAAY/a,iBACZ,QAAShD,EAAEge,YAAY1f,KAAK0B,IAAI,GAIlC,MAAMpI,EAAIoI,EAAE7B,IAAM7C,SAASC,cAAc,KAoBzC,OAnBA3D,EAAEmD,UAAUE,IAAI,QAAQ,YAGxBrD,EAAEuD,KAAK,QAAQK,KAAKK,EAAIqf,UAAY,KAGpClb,EAAEie,eAAiBrmB,EAAEuD,KAAK,QAG1BvD,EAAEoL,iBAAiB,QAAShD,EAAEke,WAAW5f,KAAK0B,GAAI,GAMlDA,EAAEme,IAAM7iB,SAAS8iB,eAAe,YACjCpe,EAAEqe,GAAK/iB,SAAS8iB,eAAe,WAE9Bpe,EAAEgX,QAAS,EACJhX,GAKTge,YAAc,SAAUM,GAGtB,GAAIA,EAAMd,SAAWc,EAAMC,cAAe,CAGxC,MAAMf,EAASc,EAAMd,OAErB,IAAIrhB,EAAM4gB,EAASE,EAAOhoB,EAAGupB,EAAKC,EAElC,GAAsB,MAAlBjB,EAAOkB,QAAiB,CAE1B,GAAwB,IAApBlB,EAAOG,UACT,OAEF,GAAIH,EAAOziB,UAAUC,SAAS,kBAC5B,OAWF,IAPAmB,EAAUqhB,EAAOze,WAAWD,qBAAqB,MACjDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAGlB1oB,GAAK,EACLupB,EAAMhB,EACgC,OAA9BgB,EAAMA,EAAIG,kBACK,IAAjBH,EAAIpf,UACNnK,IAIJwpB,EAAalB,EAAeR,EAAU,IAAME,EAAQ,IAAKO,GAEtC,KAAfiB,GAGFvlB,KAAK0lB,cAAcpB,EAAQvoB,EAAGwpB,QAK7B,GAAsB,QAAlBjB,EAAOkB,SAAuC,OAAlBlB,EAAOkB,QAAkB,CAE5D,GAAwB,IAApBlB,EAAOG,UACT,OAEoB,QAAlBH,EAAOkB,UACTlB,EAASA,EAAOze,YAIlB,MAAM8f,EAAarB,EAAOze,WAQ1B,IAPA5C,EAAU0iB,EAAW9f,WAAWD,qBAAqB,MACrDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAGlB1oB,GAAK,EACLupB,EAAMK,EAC+B,OAA9BL,EAAMA,EAAIG,kBACM,IAAjBH,EAAIpf,UACNnK,IAIJwpB,EAAalB,EAAeR,EAAU,IAAME,EAAQ,IAAKO,GAEtC,KAAfiB,GAGFvlB,KAAK0lB,cAAcpB,EAAQvoB,EAAGwpB,QAK7B,GAAsB,MAAlBjB,EAAOkB,QAGd,GAA4C,SAAxClB,EAAOze,WAAWA,WAAW2f,QAAoB,CAGnD,GAAIlB,EAAOziB,UAAUC,SAAS,UAC5B,OAKF,IAFA/F,GAAK,EACLupB,EAAMhB,EACgC,OAA9BgB,EAAMA,EAAIG,kBACK,IAAjBH,EAAIpf,UACNnK,IAIAA,GAAK,GACPiE,KAAK0lB,cAAcpB,EAAQvoB,EAAGsoB,EAAe,QAAQC,QAMpD,CAGHrhB,EAAUqhB,EAAOze,WAAWD,qBAAqB,MACjDie,EAAU5gB,EAAK,GAAGwhB,UAClBV,EAAU9gB,EAAK,GAAGwhB,UAClB,MAAM9mB,EAASkmB,EAAU,IAAME,EAAQ,IAKvC,IAFAhoB,EAAI,EACJupB,EAAMhB,EAC4B,OAA1BgB,EAAMA,EAAIM,cACK,IAAjBN,EAAIpf,UAAkC,OAAhBof,EAAIE,UAI1BF,EAAIzjB,UAAUC,SAAS,kBAEzB4J,MAAMma,KACJP,EAAI1f,qBAAqB,QACzBa,SAAQ,SAASqf,GAGjBP,EAAalB,EAAe1mB,EAAQmoB,GAEjB,KAAfP,IAGFvlB,KAAK+lB,YAAYhqB,EAAGwpB,GACpBO,EAAajkB,UAAUE,IAAI,aAE5B/B,OAOHulB,EAAalB,EAAe1mB,EAAQ2nB,GAEjB,KAAfC,IAGFvlB,KAAK+lB,YAAYhqB,EAAGwpB,GACpBD,EAAIzjB,UAAUE,IAAI,YAItBhG,MAMRqpB,EAAMnlB,mBAKR8lB,YAAc,SAAUnoB,EAAOooB,GAE7B,IAAIC,EAAQjmB,KAAK4kB,OAAOhnB,QAGVyB,IAAV4mB,IACFA,EAAQjmB,KAAK4kB,OAAOhnB,GAAS,IAI/BqoB,EAAM9oB,KAAK6oB,GAGXhmB,KAAK4kB,OAAOhnB,GAASqoB,EAAM9M,QACzB,SAAUza,EAAG3C,EAAGmqB,GACd,OAAOA,EAAIC,YAAYznB,KAAO3C,KAIlCiE,KAAKuN,QAKP6Y,iBAAmB,SAAUxoB,EAAOooB,GAClC,IAAIC,EAAQjmB,KAAK4kB,OAAOhnB,QAEVyB,IAAV4mB,IAGJA,EAAMrpB,OAAOqpB,EAAMpoB,QAAQmoB,GAAO,GAElChmB,KAAK4kB,OAAOhnB,GAASqoB,EAAM3pB,OAAS,EAAI2pB,OAAQ5mB,EAEhDW,KAAKuN,SAKPxI,QAAU,WACR,OAAO/E,KAAKiF,KAKdqJ,MAAQ,WACN,OAAOtO,KAAK8d,QAKdvQ,KAAO,WAEL,MAAMzG,EAAI9G,KACJkT,EAAMpM,EAAE1F,WACR6F,EAAIH,EAAE+d,YAGA,KAAR3R,GAGe,IAAbpM,EAAEgX,SACJ7W,EAAEpB,WAAW/E,YAAYgG,EAAE7B,KAC3B6B,EAAEgX,QAAS,KAOI,IAAbhX,EAAEgX,SAGJ7W,EAAEpB,WAAWa,aACXI,EAAE7B,IAAKgC,EAAE2e,aAEX9e,EAAEgX,QAAS,GAIbhX,EAAEie,eAAeN,UAAYvR,IAMjCwS,cAAgB,SAAU9kB,EAAMhD,EAAOooB,GACrC,MAAMpkB,EAAKhB,EAAKiB,UACZD,EAAGE,SAAS,WACd9B,KAAKomB,iBAAiBxoB,EAAOooB,GAC7BpkB,EAAGI,OAAO,YAGVhC,KAAK+lB,YAAYnoB,EAAOooB,GACxBpkB,EAAGG,IAAI,YAMXX,SAAW,WACT,IAKI6kB,EALA/S,EAAM,GACNmT,EAAW,EAKf,IAAK,IAAItqB,EAAI,EAAGA,EAAIiE,KAAK4kB,OAAOtoB,OAAQP,IACtCkqB,EAAQjmB,KAAK4kB,OAAO7oB,QAGNsD,IAAV4mB,GACEI,EAAW,IACbnT,GAAO,KACHmT,EAAW,IACbnT,GAAO,IAAMmT,EAAW,KAE1BA,EAAW,GAGbnT,GAAO,IAAM+S,EAAMzB,OAAO3nB,KAAK,OAAS,KAIzB,KAARqW,GACPmT,IAIJ,OAAOnT,GAKT8R,WAAa,SAAUtmB,GACrB,MAAMoI,EAAI9G,KAEV,QAAcX,IAAVyH,EAAEme,UAA8B5lB,IAATyH,EAAEqe,IAA8B,OAAVre,EAAEme,IAEjD,YADA1hB,QAAQJ,IAAI,oCAKd,MAAMmjB,EAAK5a,MAAMma,KACf/e,EAAEme,IAAIsB,SACN/N,KAAK9Z,GAAgB,YAAXA,EAAEnB,OAEV+oB,IACFA,EAAGzO,UAAW,GAGhB/Q,EAAEqe,GAAG5nB,MAAQuJ,EAAE1F,WAGfxB,OAAO4mB,SAAS,EAAG,QAWzBzsB,EAAO,cAAc,CACnB,qBACA,SACC,SAAU0sB,GAQX,MAAMC,EAAU,IAAItmB,OAAO,kCACrBga,EAAIhY,SAEV,MAAO,CAML8B,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MAAMoE,MAAMuiB,IAInCviB,MAAQ,SAAUuiB,GAGhB,MAAMC,EAAOxM,EAAE/X,cAAc,OACvByE,EAAI9G,KAgBV,OAfA4mB,EAAKrf,UAAYof,EAEjB7f,EAAE+f,KAAW,EACb/f,EAAEggB,OAAW,GACbhgB,EAAEigB,MAAW,GACbjgB,EAAEkgB,YAAW3nB,EACbyH,EAAEmgB,QAAW,GACbngB,EAAEogB,MAAW,GACbpgB,EAAEgd,SAAW,GACbhd,EAAEkd,OAAW,GAGbld,EAAEqgB,OAAOP,EAAKnhB,YAAY,GAE1BmhB,EAAKrf,UAAY,GACVT,GAKT0F,QAAU,WACRxM,KAAKonB,mBAAgB/nB,GASvB/C,OAAS,WACP,OAAO0D,KAAK6mB,MAOdQ,OAAS,gBACahoB,IAAhBW,KAAKgnB,QAEThnB,KAAKgnB,OAAOM,eAAe,CACzBC,OAAQ,QACRC,MAAO,aAWXC,SAAW,SAAUlhB,GACnB,YAAYlH,IAARkH,EACKvG,KAAK8mB,OACP9mB,KAAK8mB,OAAOvgB,IAarBmhB,SAAW,SAAUnhB,EAAKsd,EAASE,GACjC,OAAO/jB,KAAKknB,MAAM3gB,GAAKsd,EAAU,IAAME,IAKzCoD,OAAS,SAAU3hB,EAAUmiB,GAG3BniB,EAASiB,SAAQ,SAAS2W,GACxB,MAAMtW,EAAI9G,UAGcX,IAApByH,EAAEogB,MAAMpgB,EAAE+f,QACZ/f,EAAEogB,MAAMpgB,EAAE+f,MAAQ,IAIpB,MAAMrN,EAAQ1S,EAAEogB,MAAMpgB,EAAE+f,MAGxB,GAAmB,IAAfzJ,EAAElX,SAAgB,CACpB,IAAI0hB,EAAUD,EAEd,GAAkB,SAAdvK,EAAEoI,QACJoC,GAAU,OAGP,GAAIxK,EAAEyK,aAAa,UACpBnB,EAAQoB,KAAK1K,EAAE2K,aAAa,UAAW,CAGzC,IAAIlE,EAASE,EAAOxmB,EAChB6C,OAAO4nB,IACTnE,EAAUzjB,OAAO6nB,GACjBlE,EAAU3jB,OAAO4nB,KAGjBnE,EAAU,OACVE,EAAU3jB,OAAO6nB,IAGnB1qB,EAAQ6C,OAAO8nB,QAEsB7oB,IAAjCma,EAAMqK,EAAU,IAAME,GACxBvK,EAAMqK,EAAU,IAAME,GAAS,CAACxmB,GAI3Bic,EAAMqK,EAAU,IAAME,GAAOjgB,SAASvG,IAEzCic,EAAMqK,EAAU,IAAME,GAAO5mB,KAAKI,QAKV8B,IAAxByH,EAAEgd,SAASD,KACb/c,EAAEgd,SAASD,GAAW,IACxB/c,EAAEgd,SAASD,GAASE,GAAS,OAGL1kB,IAApByH,EAAEkd,OAAOD,KACXjd,EAAEkd,OAAOD,GAAS,IACpBjd,EAAEkd,OAAOD,GAAOF,GAAW,OAIpBzG,EAAEyK,aAAa,UAAuC,UAA3BzK,EAAE2K,aAAa,WACjDjhB,EAAEmgB,QAAQ9pB,KAAK2J,EAAE+f,MACjB/f,EAAEggB,OAAOhgB,EAAE+f,QAAU,IAInBzJ,EAAE+K,iBACJrhB,EAAEqgB,OAAO/J,EAAE3X,WAAYmiB,QAKH,IAAfxK,EAAElX,UACLkX,EAAErX,UAAUsR,MAAM,sBACpBvQ,EAAEigB,MAAMjgB,EAAE+f,QAAQc,EAClB7gB,EAAEggB,OAAOhgB,EAAE+f,QAAUzJ,EAAErX,aAG1B/F,aAEIA,KAAKknB,MAAMlnB,KAAK6mB,OAOzB9hB,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAM0L,EAAOyJ,EAAE/X,cAAc,OAEvBga,EAAQ1L,EAAK1O,KAAK,SAExBjC,KAAKiF,IAAM0L,EAGX,IAAI2L,EAAKD,EAAMpa,KAAK,SAASA,KAAK,MAElC,MAAMyB,EAAK7D,MAAM2D,kBAAoB,CAAEG,QAAY,cAG7CykB,EAAU,SAAUhlB,EAAM4S,EAAKzY,GACnC,MAAM6f,EAAIpd,KAAKiC,KAAKmB,GAEpB,QAAc/D,IAAV9B,EACF,OAAO6f,EAET,GAAIpH,GAAOzY,aAAiBmO,YAAsBrM,IAAb9B,EAAM,GAAkB,CAK3D,IAAImB,EAAGmF,EAFPuZ,EAAEvb,UAAUE,IAAI,kBAGhBxE,EAAMkJ,SAAQ,SAAS1C,GACrBrF,EAAI0e,EAAEnb,KAAK,OACXvD,EAAE4D,KAAKyB,GAEPF,EAAOH,EAAGC,QAAQqS,EAAKjS,GAEnBF,GACFnF,EAAEkL,aAAa,QAAS/F,UAIzB,CAECtG,aAAiBmO,QACnBnO,EAAQA,EAAM,IAEhB6f,EAAE9a,KAAK/E,GAGP,MAAMsG,EAAOH,EAAGC,QAAQqS,EAAKzY,GACzBsG,GACFuZ,EAAExT,aAAa,QAAS/F,GAG5B,OAAOuZ,GAGTd,EAAG8L,QAAUA,EAGb9L,EAAG8L,QAAQ,UAAM/oB,EAAW,WAC5Bid,EAAG8L,QAAQ,UAAM/oB,EAAW,SAG5B3E,OAAOqf,KAAK/Z,KAAK8mB,QAAQrgB,SAAQ,SAAS1K,GACxC,MAAMssB,EAAUroB,KAAKynB,SAAS1rB,GACxBqhB,EAAId,EAAG8L,QAAQ,UAAM/oB,EAAWgpB,GAClCroB,KAAK+mB,MAAMhrB,IACbqhB,EAAEvb,UAAUE,IAAI,aACI1C,IAAhBW,KAAKgnB,SACPhnB,KAAKgnB,OAAS5J,IAGTpd,KAAKinB,QAAQ,IAAMlrB,GAAKiE,KAAKinB,QAAQ,IAAMlrB,GAClDqhB,EAAEvb,UAAUE,IAAI,UAIdsmB,EAAQ/rB,OAAS,IACnB8gB,EAAExT,aAAa,QAASye,KAEzBroB,MAEH,MAAMsoB,EAAQjM,EAAMpa,KAAK,SAEzB,IAAe+T,EAAKjS,EAAGxG,EAAOgrB,EAsC9B,OApCA7tB,OAAOqf,KAAK/Z,KAAK8jB,UAAUU,OAAO/d,SAAQ,SAASod,GAE7CnpB,OAAOqf,KAAK/Z,KAAK8jB,SAASD,IAAUW,OAE9B/d,SAAQ,SAASsd,GAUzB,IARAzH,EAAKgM,EAAMrmB,KAAK,MAChBqa,EAAG1S,aAAa,WAAY,GAC5B0S,EAAG8L,QAAUA,EACb9L,EAAG8L,QAAQ,UAAM/oB,EAAWwkB,GAC5BvH,EAAG8L,QAAQ,UAAM/oB,EAAW0kB,GAE5B/N,EAAM6N,EAAU,IAAME,EAAQ,IAEzBhgB,EAAI,EAAGA,EAAI/D,KAAK1D,SAAUyH,IAG7BxG,EAAQyC,KAAK0nB,SAAS3jB,EAAG8f,EAASE,GAGlCwE,EAAOjM,EAAG8L,QACR,KACApS,EACAzY,GAGEyC,KAAK+mB,MAAMhjB,IACbwkB,EAAK1mB,UAAUE,IAAI,UAGtB/B,QACFA,MAGHA,KAAKonB,cAAgBX,EAAkBviB,OAAOlE,KAAKiF,KAE5CjF,KAAKiF,SAWlBlL,EAAO,kBAAkB,IAAG,WAE1B,MAAMyuB,EACJ,IAAIpoB,OAAO,gDAEb,MAAO,CAUL8D,OAAS,SAAU2f,EAASE,EAAO3gB,GACjC,OAAO1I,OAAOwJ,OAAOlE,MAAMoE,MAAMyf,EAASE,EAAO3gB,IAKnDgB,MAAQ,SAAUyf,EAASE,EAAO3gB,GAChC,QAAgB/D,IAAZwkB,EACH,MAAM,IAAIpmB,MAAM,sBAEjB,MAAMqJ,EAAI9G,KAEV,QAAcX,IAAV0kB,EAAqB,CACxB,IAAIyE,EAAaV,KAAKjE,GAMpB,MAAM,IAAIpmB,MAAM,sBALhBqJ,EAAE+c,QAAUzjB,OAAO6nB,GACnBnhB,EAAEid,MAAQ3jB,OAAO4nB,GACjBlhB,EAAE1D,KAAOhD,OAAO8nB,QAOlBphB,EAAE+c,QAAUA,EACZ/c,EAAEid,MAAQA,EACVjd,EAAE1D,KAAOA,EAMV,YAHe/D,IAAXyH,EAAE1D,OACL0D,EAAE1D,KAAO,UAEH0D,OAQb/M,EAAO,wBAAwB,CAC7B,OACA,cACA,oBACC,SAAUmkB,EAAWuK,EAAiBC,GAEvC,MAAMtO,EAAIhY,SAEV,MAAO,CACL8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,eACPC,UAAUrE,MACVoE,MAAMiT,IAIXjT,MAAQ,SAAUiT,GAEhB,OADArX,KAAK2oB,OAAStR,EACPrX,MAOTuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAGd,MAAMiK,EAAaxO,EAAE/X,cAAc,OAGnC,OAFAumB,EAAW/mB,UAAUE,IAAI,aAAc,WACvC/B,KAAK2e,MAAQiK,EACNA,GAOTjL,WAAa,WASX,MAAMiL,EAAa5oB,KAAK2e,MAGxB3e,KAAK6oB,aAAQxpB,GAAW,SAAUgd,GAElB,OAAVA,IACFuM,EAAWzmB,YAAYka,EAAMtX,WAC7BsX,EAAMgL,aAKVuB,EAAW/mB,UAAUG,OAAO,YAO9BqV,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUC,EAAQtZ,GAC1B,IAAI9E,EAAQ,QAGGrL,IAAXypB,EACFpe,EAAQ1K,KAAK2oB,OAAOI,YAOpBD,EAAOriB,SAAQ,SAASuf,GACtB,IAEE,MAAMjC,EAAQ2E,EAAexkB,OAAO8hB,GACpCjC,EAAM3gB,KAAO,SACbsH,EAAMvN,KAAK4mB,GAEb,MAAOrlB,GACL,WAMc,GAAhBgM,EAAMpO,QACRkT,EAAG,MAEL,IAEE3P,MAAM4C,IAAIumB,aACRhpB,KAAK2oB,OACL,CAAEM,OAAU,EAAOlF,MAAUrZ,GAG7B,SAAUwe,QAEc7pB,IAAlB6pB,GACF1Z,EAAG,WAG4BnQ,IAA7B6pB,EAAuB,SACzB1Z,EACExP,KAAKmpB,OAASV,EAAgBvkB,OAAOglB,EAAuB,WAGhE9jB,KAAKpF,OAGX,MAAOtB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAWPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAepBtF,EAAO,cAAc,CAAC,SAAU,SAAS,SAAUge,GAEjD,MAAMpV,EAAM9C,MAAM6C,OAIlB,SAAS0mB,EAAM9X,GACb,MAAM8F,EAAMhV,SAASC,cAAc,OACnC+U,EAAIxN,aAAa,QAAQ,OAEzB,MAAMoM,EAAMoB,EAAInV,KAAK,QACrB+T,EAAIpM,aAAa,QAAQ,OACzBoM,EAAI1T,KAAKgP,EAAG,IAEZ,MAAM+F,EAAQD,EAAInV,KAAK,QACvBoV,EAAMzN,aAAa,QAAQ,SAC3ByN,EAAM/U,KAAK,MAEX,MAAM/E,EAAQ6Z,EAAInV,KAAK,QAIvB,OAHA1E,EAAMqM,aAAa,QAAS,SAC5BrM,EAAM+E,KAAKgP,EAAG,IAEP8F,EAKT,OAxBAzU,EAAIsf,eAAiBtf,EAAIsf,gBAAkB,iBAwBpC,CAKL/d,OAAS,WACP,MAAMjJ,EAAMP,OAAOwJ,OAAOlE,MAE1B,OADA/E,EAAI8W,UAAY,GACT9W,GAOT8G,IAAM,SAAUiU,EAAKzY,EAAO6F,GAC1BpD,KAAK+R,UAAUtL,SAAQ,SAAU6K,EAAIvV,EAAGmqB,GAClC5U,EAAG,KAAO0E,GAAO1E,EAAG,KAAO/T,GAC7B2oB,EAAItpB,OAAOb,EAAE,MAGjBiE,KAAK+R,UAAU5U,KAAK,CAAC6Y,EAAKzY,EAAO6F,IACjCpD,KAAKiR,UAOPjP,OAAS,SAAUgU,EAAKzY,GACtB,IAAK,IAAIxB,EAAI,EAAGA,EAAIiE,KAAK+R,UAAUzV,OAAQP,IAAK,CAC9C,IAAIuV,EAAKtR,KAAK+R,UAAUhW,GACxB,GAAIuV,EAAG,KAAO0E,GAAO1E,EAAG,KAAO/T,EAG7B,OAFAyC,KAAK+R,UAAUnV,OAAOb,EAAG,QACzBiE,KAAKiR,WAWXoY,QAAU,WACR,QAAOrpB,KAAK+R,UAAUzV,OAAS,IAOjCyI,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAId,MAAMvG,EAAIsB,KAAKiF,IAAM7C,SAASC,cAAc,OAO5C,OANA3D,EAAEmD,UAAUE,IAAI,KAAM,YAGtBrD,EAAEuD,KAAK,QAAQK,KAAKK,EAAIsf,eAAiB,KACzCjiB,KAAKspB,MAAQ5qB,EAAEuD,KAAK,OAEbvD,GAOT6qB,UAAY,WACV,OAAOvpB,KAAK+R,UAAU3V,KACpB,SAAUiR,GACR,MAAM+J,EAAMW,EAAS7T,SAKrB,OAJAkT,EAAIpB,IAAI3I,EAAK,IACb+J,EAAIhB,QAAQ,MACZgB,EAAI7Z,MAAM8P,EAAK,IACf+J,EAAIhU,KAAiB,SAAZiK,EAAK,GAAgB,OAAS,UAChC+J,MASbnG,OAAS,WASP,IAAIiB,EACJ,MAAMsO,EAAIxgB,KAAK+R,UAAUzV,OAErBkkB,EAAI,GACNtO,EAAO9P,SAASC,cAAc,OAC9B6P,EAAKtI,aAAa,QAAQ,YAC1BsI,EAAKtI,aAAa,iBAAkB,OACpC5J,KAAK+R,UAAUtL,QAAQ1K,GAAKmW,EAAK/P,YAAYinB,EAAKrtB,MAGtC,GAALykB,IACPtO,EAAOkX,EAAKppB,KAAK+R,UAAU,KAI7B/R,KAAK+E,UAEL,MAAMrG,EAAIsB,KAAKspB,MASf,OARU,IAAN9I,EACF7f,EAAgBjC,GAETA,EAAEmC,WACTnC,EAAEoH,aAAaoM,EAAMxT,EAAEmC,YAEvBnC,EAAEyD,YAAY+P,GAETlS,MAOTwS,QAAU,WAER,OAA8B,IAA1BxS,KAAK+R,UAAUzV,OACV,GAEF0D,KAAK+R,UAAU3V,KACpB,SAAUiR,GACR,MAAgB,SAAZA,EAAK,GACAA,EAAK,GAAK,OAASA,EAAK,GAE1BA,EAAK,GAAK,MAAQ,IAAIhN,OAAOgN,EAAK,IAAI/M,WAE/CzD,KAAK,YAOb9C,EAAO,sBAAsB,CAAC,cAAe,SAAS,SAAUyvB,GAE9D,MAAO,CAKLtlB,OAAS,SAAUulB,GACjB,OAAO/uB,OAAOwJ,OAAOlE,MAAMoE,MAAMqlB,IAKnCrlB,MAAQ,SAAUqlB,GAChB,MAAM3iB,EAAI9G,KAGV,QAAaX,IAAToqB,EACF,MAAM,IAAIhsB,MAAM,sBAEb,KAAMgsB,aAAgB9E,MACzB,MAAM,IAAIlnB,MAAM,oBAelB,OAXAqJ,EAAE4iB,IAAM,GAGR5iB,EAAE6iB,MAAQF,EAQN5pB,MAAM+pB,MAAQ/pB,MAAM+pB,KAA4B,uBAClD9iB,EAAE6iB,MAAM9nB,UAAUE,IAAI,gBACf+E,IAGTA,EAAE6iB,MAAM7f,iBACN,QAAShD,EAAE+iB,YAAYzkB,KAAK0B,IAAI,GAGlCA,EAAEgjB,UAAYN,EAAgBtlB,SAE9B4C,EAAEgjB,UAAU/kB,UAAU+E,iBACpB,QAAShD,EAAEijB,YAAY3kB,KAAK0B,IAAI,GAG3BA,IAOTijB,YAAc,SAAUrrB,GAItB,GAHIA,GACFA,EAAEuB,kBAEAD,KAAK8pB,UAAUT,UACjB,OAEF,MAAMnU,EAAKrV,MAAMqV,GACjB,GAAKA,EAAL,CAKA,IAAK,MAAMkC,KAAOpX,KAAK8pB,UAAUP,YAC/BrU,EAAGkM,YAAYhK,GAGZlC,EAAG6L,UACN7L,EAAG8L,OAGLphB,OAAO4mB,SAAS,EAAG,QAZjBjjB,QAAQJ,IAAI,8BAiBhB0mB,YAAc,SAAUnrB,GAEtB,GADAA,EAAEuB,kBACEvB,EAAE4lB,SAAW5lB,EAAE2mB,cACjB,OAIF,MAAMf,EAAS5lB,EAAE4lB,OAEjB,IAAItO,EAAKzY,EAAO6F,EAiBhB,GAduB,OAAnBkhB,EAAOkB,SACTpiB,EAAOkhB,EAAOyD,aAAa,aAC3B/R,EAAOsO,EAAO0F,uBAAuBvF,UACrClnB,EAAQ+mB,EAAOG,WAIW,QAAnBH,EAAOkB,UACdpiB,EAAOkhB,EAAOze,WAAWkiB,aAAa,aACtC/R,EAAMsO,EAAOze,WAAWmkB,uBAAuBvF,UAC/ClnB,EAAQ+mB,EAAOG,WAIJ,eAATrhB,GAAkC,qBAATA,IAG7BA,EAAOA,GAAQ,cAGX4S,GAAOzY,GAAO,CAChB,MAAMuJ,EAAI9G,KACNskB,EAAOziB,UAAUC,SAAS,WAC5BwiB,EAAOziB,UAAUG,OAAO,UACxB8E,EAAE9E,OAAOgU,EAAKzY,KAGd+mB,EAAOziB,UAAUE,IAAI,UACrB+E,EAAE/E,IAAIiU,EAAKzY,EAAO6F,IAKf0D,EAAEgjB,UAAUT,UASfviB,EAAE6iB,MAAM9jB,WAAW/E,YACjBgG,EAAEgjB,UAAU/kB,WATd+B,EAAE6iB,MAAM9jB,WAAWa,aACjBI,EAAEgjB,UAAU/kB,UACZ+B,EAAE6iB,MAAM/D,eAgBhB7jB,IAAM,SAAUiU,EAAKzY,EAAO6F,GAC1BA,EAAOA,EAAK3G,QAAQ,SAAU,IAC9BuD,KAAK8pB,UAAU/nB,IAAIiU,EAAKzY,EAAO6F,IAOjCpB,OAAS,SAAUgU,EAAKzY,GACtByC,KAAK8pB,UAAU9nB,OAAOgU,EAAKzY,IAM7BiV,QAAU,WACR,OAAOxS,KAAK8pB,UAAUtX,eAkB5BzY,EAAO,oBAAoB,IAAG,WAE5B,MAAMkwB,EAAQ,IAAI7pB,OAAO,gDACnB8pB,EAAQ,IAAI9pB,OAAO,4BAEzB,MAAO,CAKL8D,OAAS,SAAUimB,GACjB,OAAOzvB,OAAOwJ,OAAOlE,MAAMoE,MAAM+lB,IAInC/lB,MAAQ,SAAU+lB,GAChB,MAAMrjB,EAAI9G,KAKV,GAFAmqB,EAAMC,mBAAmBD,IAEpBF,EAAMnC,KAAKqC,GACd,OAEFrjB,EAAEujB,QAAUjqB,OAAO4nB,GAEnB,IAAI5rB,EAAM,GACNkuB,EAAQ,EA8BZ,OA7BAxjB,EAAEyjB,QAAS,EACXzjB,EAAE0jB,QAAS,EACX1jB,EAAE2jB,YAAc,aAGhBrqB,OAAO6nB,GAAG9rB,MAAM,SAASC,IAAI,SAAUiR,GACrC,MAAMvG,EAAI9G,MAGLsqB,KAAWjd,EAAKgK,MAAM,sBACzBvQ,EAAE2jB,YAAcpd,EAEH,6BAATA,IACFvG,EAAE0jB,QAAS,IAIgB,UAAtBnd,EAAK9L,eACZuF,EAAEyjB,QAAS,EACXzjB,EAAEujB,QAAUzqB,OAAO8qB,KAAK5jB,EAAEujB,UAInBH,EAAMpC,KAAKza,KAClBjR,EAAIgE,OAAO6nB,IAAM7nB,OAAO4nB,KAE1B5iB,KAAK0B,IAEPA,EAAEc,MAAQxL,EACH0K,GAOTygB,OAAS,WACP,GAAIvnB,KAAKwqB,OAAQ,CACf,MAAMlb,EAAQtP,KAAK4H,MAAa,OAAK5H,KAAKqqB,QACpC1W,EAAIvR,SAASC,cAAc,KAIjC,OAHAsR,EAAE/J,aAAa,OAAQ5J,KAAKqqB,SAC5B1W,EAAE/J,aAAa,MAAO,uBACtB+J,EAAErR,KAAKgN,GACAqE,EAGT,OAAOvR,SAASI,eAAexC,KAAKqqB,cAO1CtwB,EAAO,aAAa,CAAC,sBAAsB,oBAAoB,SAAS,SAAU4wB,EAAUC,GAG1F,MAAMjoB,EAAQ9C,MAAM6C,OAGpB,OAFAC,EAAIkoB,SAAWloB,EAAIkoB,UAAY,WAExB,CAKL3mB,OAAS,SAAUmT,EAAOyT,GACxB,OAAOpwB,OAAOwJ,OAAOlE,MAAMoE,MAAMiT,EAAOyT,IAO1C1mB,MAAQ,SAAUiT,EAAOyT,GAGvB,OAFA9qB,KAAK2oB,OAAStR,EACdrX,KAAK+qB,QAAUD,EACR9qB,MAOTqX,MAAQ,WACN,OAAOrX,KAAK2oB,QAOd5jB,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAEd,GAAqB,OAAjBjF,KAAK+qB,QACP,OAEF,MAAMC,EAAS5oB,SAASC,cAAc,MACtC2oB,EAAOnpB,UAAUE,IAAI,QAErB/B,KAAKiF,IAAM+lB,EAEX,MAAMF,EAAS9qB,KAAK+qB,QAIdE,EAAiB,GA2DvB,OA1DAH,EAAOrkB,QAAQ,CAACpI,EAAEtC,IAAMkvB,EAAe5sB,EAAO,KAAKtC,GAKnDrB,OAAOqf,KAAKkR,GAAgBzG,OAAO/d,SAAQ,SAASwP,GAClD,IAEIiV,EAAOC,EAAIC,EAAWC,EAAQC,EAF9BC,EAAQT,EAAOG,EAAehV,IAKxB,QAANA,GACM,aAANA,GACM,UAANA,GACM,WAANA,GACM,eAANA,IAEFiV,EAAQ9oB,SAASC,cAAc,OAE/B8oB,EAAKD,EAAMjpB,KAAK,MAChBkpB,EAAG7oB,KAAK2T,GACRkV,EAAGvhB,aAAa,QAASqM,GAEzBmV,EAAYG,EAAa,MACzBF,EAASH,EAAMjpB,KAAK,MACpBopB,EAAOzhB,aAAa,YAAa2hB,EAAY,MAE1CH,aAAqB1f,OACvB2f,EAAOxpB,UAAUE,IAAI,iBACpBqpB,EAAU3kB,SAAQ,SAAS+kB,GACH,qBAAlBD,EAAY,MACdD,EAAMV,EAAS1mB,OAAOsnB,GAClBF,GACHD,EAAOppB,KAAK,OAAOE,YAAYmpB,EAAI/D,WAGrC8D,EAAOppB,KAAK,OAAOK,KAAKkpB,OAKL,qBAAlBD,EAAY,MACdD,EAAMV,EAAS1mB,OAAOqnB,EAAa,OAC/BD,GACFD,EAAOlpB,YAAYmpB,EAAI/D,WAGzB8D,EAAO/oB,KAAKipB,EAAa,OAI7BP,EAAO7oB,YAAY+oB,OAKvBlrB,KAAKyrB,eAAiBd,EAASzmB,OAAOlE,KAAKiF,KAEpCjF,KAAKiF,SAOlBlL,EAAO,kBAAkB,CACvB,OACA,eACC,SAAUmkB,EAAWwN,GAEZtpB,SAEV,MAAO,CACL8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,cACPC,UAAUrE,MACVoE,MAAMiT,IAIXjT,MAAQ,SAAUiT,GAEhB,OADArX,KAAK2oB,OAAStR,EACPrX,MAOTuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAMgN,EAAYvpB,SAASC,cAAc,OAiBzC,OAhBAspB,EAAU9pB,UAAUE,IAAI,YAAa,WAErC/B,KAAK6oB,SAAQ,SAAUY,GACR,OAATA,IAIJkC,EAAU9pB,UAAUG,OAAO,WAC3B2pB,EAAUxpB,YAAYsnB,EAAK1kB,eAQtB/E,KAAK2e,MAAQgN,GAOtBtU,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUrZ,GAElB,MAAM6H,EAAQrX,KAAK2oB,OACnB,IACE9oB,MAAM4C,IAAImpB,YACRvU,EAAO,IAAI,SAAUwU,GAEnB,QAAqBxsB,IAAjBwsB,EAEF,YADArc,EAAG,MAIL,MAAM4H,EAAMyU,EAAuB,SACnC,QAAYxsB,IAAR+X,EAEF,YADA5H,EAAG,MAIL,MAAMsb,EAAS1T,EAAY,OAO3B5H,OANenQ,IAAXyrB,EAMDY,EAAexnB,OAChBmT,EAAOyT,GANJ,SAWX,MAAOpsB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAMPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAKnB,SAASX,GAAG,GAAG,iBAAiBD,SAAS,oBAAoBE,OAAOA,OAAOF,QAAQC,SAAS,GAAG,mBAAmB3E,GAAQA,EAAO2F,IAAI3F,EAAO,YAAY,GAAG2E,OAAO,CAAC,IAAIL,EAAE,oBAAoBuB,OAAOvB,EAAEuB,OAAO,oBAAoBksB,OAAOztB,EAAEytB,OAAO,oBAAoBC,OAAO1tB,EAAE0tB,MAAM1tB,EAAE2tB,MAAMttB,KAA5R,EAAkS,WAAqC,OAAO,SAAUA,EAAEoI,EAAExI,EAAEgW,GAAG,SAAS/K,EAAE0iB,EAAEC,GAAG,IAAI5tB,EAAE2tB,GAAG,CAAC,IAAInlB,EAAEmlB,GAAG,CAAC,IAAItY,EAAkB,mBAAT7Z,GAAqBA,EAAQ,IAAIoyB,GAAGvY,EAAE,OAAOA,EAAEsY,GAAE,GAAI,GAAGlwB,EAAE,OAAOA,EAAEkwB,GAAE,GAAI,IAAI5tB,EAAE,IAAIZ,MAAM,uBAAuBwuB,EAAE,KAAK,MAAM5tB,EAAE8tB,KAAK,mBAAmB9tB,EAAE,IAAImiB,EAAEliB,EAAE2tB,GAAG,CAACxtB,QAAQ,IAAIqI,EAAEmlB,GAAG,GAAG9wB,KAAKqlB,EAAE/hB,SAAQ,SAASC,GAAG,IAAIJ,EAAEwI,EAAEmlB,GAAG,GAAGvtB,GAAG,OAAO6K,EAAEjL,GAAII,KAAI8hB,EAAEA,EAAE/hB,QAAQC,EAAEoI,EAAExI,EAAEgW,GAAG,OAAOhW,EAAE2tB,GAAGxtB,QAAkD,IAA1C,IAAI1C,EAAkB,mBAATjC,GAAqBA,EAAgBmyB,EAAE,EAAEA,EAAE3X,EAAEhY,OAAO2vB,IAAI1iB,EAAE+K,EAAE2X,IAAI,OAAO1iB,EAAvb,CAA2b,CAAC6iB,EAAE,CAAC,SAAStyB,EAAQ6E,EAAOF,GAuBtyBE,EAAOF,QAAU,CACf4tB,SAAUvyB,EAAQ,kBAElBwyB,OAAQxyB,EAAQ,gBAChByyB,MAAOzyB,EAAQ,eACf0yB,KAAM,CACJC,KAAM3yB,EAAQ,cAAc2yB,KAC5BC,OAAQ5yB,EAAQ,cAAc4yB,QAEhCC,QAAS7yB,EAAQ,mBAGjB,CAAC8yB,cAAc,EAAEC,iBAAiB,EAAEC,eAAe,EAAEC,aAAa,GAAGC,gBAAgB,KAAKC,EAAE,CAAC,SAASnzB,EAAQ6E,EAAOF,GAGvH,IAAIyuB,EAAIpzB,EAAQ,YACZqzB,EAAYrzB,EAAQ,gBAExB6E,EAAOF,QAAU,CACf2uB,IAIF,SAAaC,GACX,IAAIC,EAA+B,WAAxBD,EAAEE,QAAQC,UACLL,EAAUE,EAU1B,SAAkBA,GAChB,OAAO,SAAS3uB,GACd,OAAO2uB,EAAEI,KAAK/uB,GAAGgvB,QAZQC,CAASN,IAiBxC,SAAgBA,GACd,IAAIC,EAAM,GACNM,EAAQ,GACRC,EAAU,GAEd,SAASC,EAAI/pB,GACPmpB,EAAEa,IAAIF,EAAS9pB,KAGnB8pB,EAAQ9pB,IAAK,EACb6pB,EAAM7pB,IAAK,EACXmpB,EAAEc,KAAKX,EAAEY,SAASlqB,IAAI,SAASrF,GACzBwuB,EAAEa,IAAIH,EAAOlvB,EAAEwvB,GACjBZ,EAAInwB,KAAKuB,GAETovB,EAAIpvB,EAAEwvB,aAGHN,EAAM7pB,IAIf,OADAmpB,EAAEc,KAAKX,EAAEc,QAASL,GACXR,EAtCSc,CAAOf,GACvBH,EAAEc,KAAKV,GAAK,SAAS5uB,GACnB,IAAI2vB,EAAQhB,EAAEI,KAAK/uB,GACnB2uB,EAAEiB,WAAW5vB,GACb2vB,EAAME,YAAc7vB,EAAErD,KACtBgzB,EAAMG,UAAW,EACjBnB,EAAEoB,QAAQ/vB,EAAEwvB,EAAGxvB,EAAEqF,EAAGsqB,EAAOnB,EAAEwB,SAAS,YAZxCC,KA+CF,SAActB,GACZH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI2vB,EAAQhB,EAAEI,KAAK/uB,GACnB,GAAI2vB,EAAMG,SAAU,CAClBnB,EAAEiB,WAAW5vB,GAEb,IAAI6vB,EAAcF,EAAME,mBACjBF,EAAMG,gBACNH,EAAME,YACblB,EAAEoB,QAAQ/vB,EAAEwvB,EAAGxvB,EAAEqF,EAAGsqB,EAAOE,UAK/B,CAACM,eAAe,EAAEC,WAAW,KAAKC,EAAE,CAAC,SAASj1B,EAAQ6E,EAAOF,GAC/D,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UA2BnB,SAASk1B,EAAc3B,EAAGnyB,EAAMyC,EAAQsxB,EAAIC,EAAQC,GAClD,IAAId,EAAQ,CAAEe,MAAO,EAAG1lB,OAAQ,EAAGylB,KAAMA,GACrCviB,EAAOsiB,EAAOh0B,GAAMi0B,EAAO,GAC3BE,EAAO7C,EAAK8C,aAAajC,EAAG,SAAUgB,EAAO1wB,GACjDuxB,EAAOh0B,GAAMi0B,GAAQE,EACrBhC,EAAEkC,UAAUF,EAAMJ,GACdriB,GACFygB,EAAEoB,QAAQ7hB,EAAMyiB,EAAM,CAAE3B,OAAQ,IAhCpC/uB,EAAOF,QAEP,SAA2B4uB,GAoBzBH,EAAEc,KAAKX,EAAE7nB,YAnBT,SAASsoB,EAAI/pB,GACX,IAAIyB,EAAW6nB,EAAE7nB,SAASzB,GACtBnD,EAAOysB,EAAEzsB,KAAKmD,GAKlB,GAJIyB,EAASlJ,QACX4wB,EAAEc,KAAKxoB,EAAUsoB,GAGfZ,EAAEa,IAAIntB,EAAM,WAAY,CAC1BA,EAAK4uB,WAAa,GAClB5uB,EAAK6uB,YAAc,GACnB,IAAK,IAAIN,EAAOvuB,EAAK8uB,QAASC,EAAU/uB,EAAK+uB,QAAU,EAClDR,EAAOQ,IACLR,EACLH,EAAc3B,EAAG,aAAc,MAAOtpB,EAAGnD,EAAMuuB,GAC/CH,EAAc3B,EAAG,cAAe,MAAOtpB,EAAGnD,EAAMuuB,SAmBtD,CAACL,WAAW,GAAGc,SAAS,KAAKC,EAAE,CAAC,SAAS/1B,EAAQ6E,EAAOF,GAG1D,IAAIyuB,EAAIpzB,EAAQ,YA0BhB,SAASg2B,EAAgBzC,GACvBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKgsB,EAAmB1C,EAAEzsB,KAAKmD,OAC1DmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GAAKqxB,EAAmB1C,EAAEI,KAAK/uB,OAG5D,SAASqxB,EAAmBC,GAC1B,IAAI9B,EAAI8B,EAAMZ,MACdY,EAAMZ,MAAQY,EAAMtmB,OACpBsmB,EAAMtmB,OAASwkB,EAejB,SAAS+B,EAAYD,GACnBA,EAAME,GAAKF,EAAME,EAenB,SAASC,EAAUH,GACjB,IAAII,EAAIJ,EAAMI,EACdJ,EAAMI,EAAIJ,EAAME,EAChBF,EAAME,EAAIE,EAlEZzxB,EAAOF,QAAU,CACf4xB,OAIF,SAAgBhD,GACd,IAAIiD,EAAUjD,EAAEE,QAAQgD,QAAQhvB,cAChB,OAAZ+uB,GAAgC,OAAZA,GACtBR,EAAgBzC,IANlBsB,KAUF,SAActB,GACZ,IAAIiD,EAAUjD,EAAEE,QAAQgD,QAAQhvB,cAChB,OAAZ+uB,GAAgC,OAAZA,GAqB1B,SAAkBjD,GAChBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKksB,EAAY5C,EAAEzsB,KAAKmD,OAEnDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,OAAQ0jB,GAChB/C,EAAEa,IAAIN,EAAM,MACdwC,EAAYxC,MA3Bd+C,CAASnD,GAGK,OAAZiD,GAAgC,OAAZA,KAiC1B,SAAgBjD,GACdH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKosB,EAAU9C,EAAEzsB,KAAKmD,OAEjDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,OAAQ4jB,GAChBjD,EAAEa,IAAIN,EAAM,MACd0C,EAAU1C,MAvCZgD,CAAOpD,GACPyC,EAAgBzC,OAiDlB,CAACyB,WAAW,KAAK4B,EAAE,CAAC,SAAS52B,EAAQ6E,EAAOF,GAQ9C,SAASkyB,IACP,IAAIC,EAAW,GACfA,EAASC,MAAQD,EAASE,MAAQF,EAClC5wB,KAAK+wB,UAAYH,EAkCnB,SAASI,EAAOC,GACdA,EAAMH,MAAMD,MAAQI,EAAMJ,MAC1BI,EAAMJ,MAAMC,MAAQG,EAAMH,aACnBG,EAAMJ,aACNI,EAAMH,MAGf,SAASI,EAAejb,EAAGlS,GACzB,GAAU,UAANkS,GAAuB,UAANA,EACnB,OAAOlS,EAhDXpF,EAAOF,QAAUkyB,EAQjBA,EAAKh2B,UAAUw2B,QAAU,WACvB,IAAIP,EAAW5wB,KAAK+wB,UAChBE,EAAQL,EAASE,MACrB,GAAIG,IAAUL,EAEZ,OADAI,EAAOC,GACAA,GAIXN,EAAKh2B,UAAUy2B,QAAU,SAASH,GAChC,IAAIL,EAAW5wB,KAAK+wB,UAChBE,EAAMH,OAASG,EAAMJ,OACvBG,EAAOC,GAETA,EAAMJ,MAAQD,EAASC,MACvBD,EAASC,MAAMC,MAAQG,EACvBL,EAASC,MAAQI,EACjBA,EAAMH,MAAQF,GAGhBD,EAAKh2B,UAAUyG,SAAW,WAIxB,IAHA,IAAIiwB,EAAO,GACPT,EAAW5wB,KAAK+wB,UAChB1B,EAAOuB,EAASE,MACbzB,IAASuB,GACdS,EAAKl0B,KAAKm0B,KAAKC,UAAUlC,EAAM6B,IAC/B7B,EAAOA,EAAKyB,MAEd,MAAO,IAAMO,EAAKx0B,KAAK,MAAQ,MAgB/B,IAAI20B,EAAE,CAAC,SAAS13B,EAAQ6E,EAAOF,GACjC,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UACf23B,EAAQ33B,EAAQ,cAAc23B,MAElC9yB,EAAOF,QAAU,CACfizB,cAIF,SAAuBrE,GACrB,IAAIsE,EAAcnF,EAAKoF,iBAAiBvE,GAEpCwE,EAAI,IAAIJ,EAAM,CAAEK,UAAU,EAAMC,YAAY,IAAQC,SAAS,IAoBjE,OAlBA9E,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB8tB,EAAEI,QAAQluB,EAAG,CAAEsqB,MAAOtqB,IACtB8tB,EAAEtC,UAAUxrB,EAAG,QAAUspB,EAAEzsB,KAAKmD,GAAGorB,SAGrCjC,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzBmzB,EAAEpD,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG,GAAIxvB,EAAErD,SAG5B6xB,EAAEc,KAAK2D,GAAa,SAAS5N,EAAOhoB,GAClC,IAAIm2B,EAAS,QAAUn2B,EACvB81B,EAAEI,QAAQC,EAAQ,CAAE/C,KAAM,SAC1BjC,EAAEiF,OAAOpO,GAAO,SAASmI,EAAGnoB,GAE1B,OADA8tB,EAAEpD,QAAQvC,EAAGnoB,EAAG,CAAEoF,MAAO,UAClBpF,QAIJ8tB,KAGP,CAACO,aAAa,EAAEtD,WAAW,GAAGc,SAAS,KAAKyC,EAAE,CAAC,SAASv4B,EAAQ6E,EAAOF,GAGzE,IAAI4tB,EAEJ,GAAIvyB,EACF,IACEuyB,EAAWvyB,EAAQ,YACnB,MAAO4E,IAGN2tB,IACHA,EAAWzsB,OAAOysB,UAGpB1tB,EAAOF,QAAU4tB,GAEf,CAACA,SAAW,KAAKiG,EAAE,CAAC,SAASx4B,EAAQ6E,EAAOF,GAC9C,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,cAAc23B,MAC9Bd,EAAO72B,EAAQ,eASnB6E,EAAOF,QAIP,SAAmB4uB,EAAGM,GACpB,GAAIN,EAAEkF,aAAe,EACnB,MAAO,GAET,IAAIziB,EA4DN,SAAoBud,EAAGM,GACrB,IAAI6E,EAAW,IAAIf,EACfgB,EAAQ,EACRC,EAAS,EAEbxF,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzByuB,EAASP,QAAQluB,EAAG,CAAEA,EAAGA,EAAG4uB,GAAM,EAAGC,IAAK,OAK5C1F,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAIm0B,EAAaL,EAAS/E,KAAK/uB,EAAEqF,EAAGrF,EAAEwvB,IAAM,EACxCR,EAASC,EAASjvB,GAClBo0B,EAAaD,EAAanF,EAC9B8E,EAAS/D,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG4E,GAC3BJ,EAASK,KAAKC,IAAIN,EAAQF,EAAS5xB,KAAKlC,EAAEqF,GAAG6uB,KAAOlF,GACpD+E,EAASM,KAAKC,IAAIP,EAAQD,EAAS5xB,KAAKlC,EAAEwvB,GAAO,IAAMR,MAGzD,IAAIuF,EAAU/F,EAAEgG,MAAMR,EAASD,EAAQ,GAAGr2B,KAAI,WAAa,OAAO,IAAIu0B,KAClEwC,EAAUV,EAAQ,EAMtB,OAJAvF,EAAEc,KAAKwE,EAASrE,SAAS,SAASpqB,GAChCqvB,EAAaH,EAASE,EAASX,EAAS5xB,KAAKmD,OAGxC,CAAEwpB,MAAOiF,EAAUS,QAASA,EAASE,QAASA,GAvFzCE,CAAWhG,EAAGM,GAAY2F,GAClCC,EAQN,SAAqBlG,EAAG4F,EAASE,GAC/B,IAIIlC,EAJAsC,EAAU,GACVC,EAAUP,EAAQA,EAAQ32B,OAAS,GACnCm3B,EAAQR,EAAQ,GAGpB,KAAO5F,EAAEkF,aAAa,CACpB,KAAQtB,EAAQwC,EAAMtC,WAAgBuC,EAAWrG,EAAG4F,EAASE,EAASlC,GACtE,KAAQA,EAAQuC,EAAQrC,WAAcuC,EAAWrG,EAAG4F,EAASE,EAASlC,GACtE,GAAI5D,EAAEkF,YACJ,IAAK,IAAIx2B,EAAIk3B,EAAQ32B,OAAS,EAAGP,EAAI,IAAKA,EAExC,GADAk1B,EAAQgC,EAAQl3B,GAAGo1B,UACR,CACToC,EAAUA,EAAQ52B,OAAO+2B,EAAWrG,EAAG4F,EAASE,EAASlC,GAAO,IAChE,OAMR,OAAOsC,EA5BOI,CAAY7jB,EAAMyd,MAAOzd,EAAMmjB,QAASnjB,EAAMqjB,SAG5D,OAAOjG,EAAE0G,QAAQ1G,EAAE9wB,IAAIm3B,GAAS,SAAS70B,GACvC,OAAO2uB,EAAEY,SAASvvB,EAAEqF,EAAGrF,EAAEwvB,OACvB,IAZN,IAAIoF,EAAoBpG,EAAE2G,SAAS,GAsCnC,SAASH,EAAWrG,EAAG4F,EAASE,EAASlC,EAAO6C,GAC9C,IAAIP,EAAUO,EAAsB,QAAKz0B,EAwBzC,OAtBA6tB,EAAEc,KAAKX,EAAE0G,QAAQ9C,EAAMltB,IAAI,SAAS0pB,GAClC,IAAIC,EAASL,EAAEI,KAAKA,GAChBuG,EAAS3G,EAAEzsB,KAAK6sB,EAAK1pB,GAErB+vB,GACFP,EAAQp2B,KAAK,CAAE4G,EAAG0pB,EAAK1pB,EAAGmqB,EAAGT,EAAKS,IAGpC8F,EAAOpB,KAAOlF,EACd0F,EAAaH,EAASE,EAASa,MAGjC9G,EAAEc,KAAKX,EAAEY,SAASgD,EAAMltB,IAAI,SAAS0pB,GACnC,IAAIC,EAASL,EAAEI,KAAKA,GAChBS,EAAIT,EAAKS,EACT+F,EAAS5G,EAAEzsB,KAAKstB,GACpB+F,EAAW,IAAKvG,EAChB0F,EAAaH,EAASE,EAASc,MAGjC5G,EAAEqG,WAAWzC,EAAMltB,GAEZwvB,EAiCT,SAASH,EAAaH,EAASE,EAASlC,GACjCA,EAAM2B,IAEC3B,EAAU,GAGpBgC,EAAQhC,EAAM2B,IAAM3B,EAAU,GAAIkC,GAAS/B,QAAQH,GAFnDgC,EAAQA,EAAQ32B,OAAS,GAAG80B,QAAQH,GAFpCgC,EAAQ,GAAG7B,QAAQH,KAQrB,CAACiD,cAAc,EAAE9B,aAAa,EAAEtD,WAAW,KAAKqF,EAAE,CAAC,SAASr6B,EAAQ6E,EAAOF,GAG7E,IAAIyuB,EAAIpzB,EAAQ,YACZs6B,EAAUt6B,EAAQ,aAClBsB,EAAYtB,EAAQ,eACpBq1B,EAAOr1B,EAAQ,UACfu6B,EAAiBv6B,EAAQ,UAAUu6B,eACnCC,EAAoBx6B,EAAQ,yBAC5By6B,EAAmBz6B,EAAQ,UAAUy6B,iBACrCC,EAAe16B,EAAQ,mBACvB26B,EAAoB36B,EAAQ,yBAC5B46B,EAAmB56B,EAAQ,uBAC3B66B,EAAQ76B,EAAQ,WAChBmS,EAAWnS,EAAQ,cACnB0yB,EAAO1yB,EAAQ,UACf23B,EAAQ33B,EAAQ,cAAc23B,MAElC9yB,EAAOF,QAEP,SAAgB4uB,EAAGuH,GACjB,IAAInI,EAAOmI,GAAQA,EAAKC,YAAcrI,EAAKC,KAAOD,EAAKE,OACvDD,EAAK,UAAU,WACb,IAAIqI,EAAcrI,EAAK,sBACI,WAAa,OA2F5C,SAA0BsI,GACxB,IAAI1H,EAAI,IAAIoE,EAAM,CAAEM,YAAY,EAAMD,UAAU,IAC5CvE,EAAQyH,EAAaD,EAAWxH,SAqBpC,OAnBAF,EAAE2E,SAAS9E,EAAE+H,MAAM,GACjBC,EACAC,EAAkB5H,EAAO6H,GACzBlI,EAAEmI,KAAK9H,EAAO+H,KAEhBpI,EAAEc,KAAK+G,EAAW5G,SAAS,SAASpqB,GAClC,IAAInD,EAAOo0B,EAAaD,EAAWn0B,KAAKmD,IACxCspB,EAAE4E,QAAQluB,EAAGmpB,EAAEqI,SAASJ,EAAkBv0B,EAAM40B,GAAeC,IAC/DpI,EAAEkC,UAAUxrB,EAAGgxB,EAAWzkB,OAAOvM,OAGnCmpB,EAAEc,KAAK+G,EAAWnG,SAAS,SAASlwB,GAClC,IAAI+uB,EAAOuH,EAAaD,EAAWtH,KAAK/uB,IACxC2uB,EAAEoB,QAAQ/vB,EAAGwuB,EAAE+H,MAAM,GACnBS,EACAP,EAAkB1H,EAAMkI,GACxBzI,EAAEmI,KAAK5H,EAAMmI,QAGVvI,EAlH0CwI,CAAiBxI,MAChEZ,EAAK,eAAsB,YAK/B,SAAmBY,EAAGZ,GACpBA,EAAK,8BAA8B,YAsHrC,SAAgCY,GAC9B,IAAIE,EAAQF,EAAEE,QACdA,EAAMuI,SAAW,EACjB5I,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB+uB,EAAKsI,QAAU,EACqB,MAAhCtI,EAAKuI,SAASz0B,gBACM,OAAlBgsB,EAAMgD,SAAsC,OAAlBhD,EAAMgD,QAClC9C,EAAK2B,OAAS3B,EAAKwI,YAEnBxI,EAAK/jB,QAAU+jB,EAAKwI,gBAhIsBC,CAAuB7I,MACvEZ,EAAK,uBAA8B,YAmSrC,SAAyBY,GACvBH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,GAAIA,EAAEqF,IAAMrF,EAAEwvB,EAAG,CACf,IAAIttB,EAAOysB,EAAEzsB,KAAKlC,EAAEqF,GACfnD,EAAKu1B,YACRv1B,EAAKu1B,UAAY,IAEnBv1B,EAAKu1B,UAAUh5B,KAAK,CAAEuB,EAAGA,EAAG2vB,MAAOhB,EAAEI,KAAK/uB,KAC1C2uB,EAAEiB,WAAW5vB,OA3S+B03B,CAAgB/I,MAChEZ,EAAK,eAA8B,WAAa2H,EAAQhH,IAAIC,MAC5DZ,EAAK,wBAA8B,WAAa+H,EAAapH,IAAIC,MACjEZ,EAAK,YAA8B,WAAa0C,EAAK3C,EAAK6J,mBAAmBhJ,OAC7EZ,EAAK,8BAA8B,YAuIrC,SAAgCY,GAC9BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB,GAAI+uB,EAAK2B,OAAS3B,EAAK/jB,OAAQ,CAC7B,IAAI3F,EAAIspB,EAAEzsB,KAAKlC,EAAEqF,GAEbsqB,EAAQ,CAAEc,MADN9B,EAAEzsB,KAAKlC,EAAEwvB,GACMiB,KAAOprB,EAAEorB,MAAQ,EAAIprB,EAAEorB,KAAMzwB,EAAGA,GACvD8tB,EAAK8C,aAAajC,EAAG,aAAcgB,EAAO,WA9IEiI,CAAuBjJ,MACvEZ,EAAK,wBAA8B,WAAa8H,EAAiBlH,MACjEZ,EAAK,4BAA8B,WAAa+H,EAAa+B,QAAQlJ,MACrEZ,EAAK,sBAA8B,WAAa4H,EAAehH,MAC/DZ,EAAK,wBAA8B,YA+IrC,SAA0BY,GACxB,IAAIsC,EAAU,EACdzC,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdnD,EAAK41B,YACP51B,EAAK8uB,QAAUrC,EAAEzsB,KAAKA,EAAK41B,WAAWrH,KACtCvuB,EAAK+uB,QAAUtC,EAAEzsB,KAAKA,EAAK61B,cAActH,KACzCQ,EAAUzC,EAAE8F,IAAIrD,EAAS/uB,EAAK+uB,aAGlCtC,EAAEE,QAAQoC,QAAUA,EAzJ4B+G,CAAiBrJ,MACjEZ,EAAK,8BAA8B,YA2JrC,SAAgCY,GAC9BH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACC,eAAfnD,EAAK+1B,QACPtJ,EAAEI,KAAK7sB,EAAKlC,GAAGk4B,UAAYh2B,EAAKuuB,KAChC9B,EAAEqG,WAAW3vB,OAhK+B8yB,CAAuBxJ,MACvEZ,EAAK,qBAA8B,WAAarxB,EAAUgyB,IAAIC,MAC9DZ,EAAK,yBAA8B,WAAa6H,EAAkBjH,MAClEZ,EAAK,yBAA8B,WAAagI,EAAkBpH,MAClEZ,EAAK,aAA8B,WAAakI,EAAMtH,MACtDZ,EAAK,uBAA8B,YAkSrC,SAAyBY,GACvB,IAAIyJ,EAAStK,EAAKoF,iBAAiBvE,GACnCH,EAAEc,KAAK8I,GAAQ,SAAS/S,GACtB,IAAIgT,EAAa,EACjB7J,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxB,IAAI6E,EAAOysB,EAAEzsB,KAAKmD,GAClBnD,EAAK+zB,MAAQ54B,EAAIg7B,EACjB7J,EAAEc,KAAKptB,EAAKu1B,WAAW,SAASa,GAC9BxK,EAAK8C,aAAajC,EAAG,WAAY,CAC/B+B,MAAO4H,EAAS3I,MAAMe,MACtB1lB,OAAQstB,EAAS3I,MAAM3kB,OACvBylB,KAAMvuB,EAAKuuB,KACXwF,MAAO54B,KAAOg7B,EACdr4B,EAAGs4B,EAASt4B,EACZ2vB,MAAO2I,EAAS3I,OACf,iBAEEztB,EAAKu1B,gBAnTgCc,CAAgB5J,MAChEZ,EAAK,8BAA8B,WAAaiI,EAAiBrE,OAAOhD,MACxEZ,EAAK,gBAA8B,WAAaxgB,EAASohB,MACzDZ,EAAK,yBAA8B,YAqTrC,SAA2BY,GACzBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClB,GAAmB,aAAfnD,EAAK+1B,MAAsB,CAC7B,IAAIO,EAAW7J,EAAEzsB,KAAKA,EAAKlC,EAAEqF,GACzBqsB,EAAI8G,EAAS9G,EAAI8G,EAAS9H,MAAQ,EAClCc,EAAIgH,EAAShH,EACbiH,EAAKv2B,EAAKwvB,EAAIA,EACdgH,EAAKF,EAASxtB,OAAS,EAC3B2jB,EAAEoB,QAAQ7tB,EAAKlC,EAAGkC,EAAKytB,OACvBhB,EAAEqG,WAAW3vB,GACbnD,EAAKytB,MAAM9hB,OAAS,CAClB,CAAE6jB,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAQ+G,EAAQjH,EAAGA,GACxB,CAAEE,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,GAC5B,CAAEhH,EAAGA,EAAI,EAAI+G,EAAK,EAAGjH,EAAGA,EAAIkH,IAE9Bx2B,EAAKytB,MAAM+B,EAAIxvB,EAAKwvB,EACpBxvB,EAAKytB,MAAM6B,EAAItvB,EAAKsvB,MAxUwBmH,CAAkBhK,MAClEZ,EAAK,yBAA8B,YA0PrC,SAA2BY,GACzBH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,GAAIspB,EAAE7nB,SAASzB,GAAGzH,OAAQ,CACxB,IAAIsE,EAAOysB,EAAEzsB,KAAKmD,GACd+C,EAAIumB,EAAEzsB,KAAKA,EAAK41B,WAChB/mB,EAAI4d,EAAEzsB,KAAKA,EAAK61B,cAChBjW,EAAI6M,EAAEzsB,KAAKssB,EAAEoK,KAAK12B,EAAK4uB,aACvBlb,EAAI+Y,EAAEzsB,KAAKssB,EAAEoK,KAAK12B,EAAK6uB,cAE3B7uB,EAAKwuB,MAAQ2D,KAAKwE,IAAIjjB,EAAE8b,EAAI5P,EAAE4P,GAC9BxvB,EAAK8I,OAASqpB,KAAKwE,IAAI9nB,EAAEygB,EAAIppB,EAAEopB,GAC/BtvB,EAAKwvB,EAAI5P,EAAE4P,EAAIxvB,EAAKwuB,MAAQ,EAC5BxuB,EAAKsvB,EAAIppB,EAAEopB,EAAItvB,EAAK8I,OAAS,MAIjCwjB,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACD,WAApBspB,EAAEzsB,KAAKmD,GAAG4yB,OACZtJ,EAAEqG,WAAW3vB,MA5Q+ByzB,CAAkBnK,MAClEZ,EAAK,sBAA8B,WAAarxB,EAAUuzB,KAAKtB,MAC/DZ,EAAK,4BAA8B,YAgOrC,SAA8BY,GAC5BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClB,GAAIwuB,EAAEa,IAAIN,EAAM,KAId,OAHsB,MAAlBA,EAAKuI,UAAsC,MAAlBvI,EAAKuI,WAChCvI,EAAK2B,OAAS3B,EAAKwI,aAEbxI,EAAKuI,UACX,IAAK,IAAKvI,EAAK2C,GAAK3C,EAAK2B,MAAQ,EAAI3B,EAAKwI,YAAa,MACvD,IAAK,IAAKxI,EAAK2C,GAAK3C,EAAK2B,MAAQ,EAAI3B,EAAKwI,gBAzOAwB,CAAqBpK,MACrEZ,EAAK,4BAA8B,WAAaiI,EAAiB/F,KAAKtB,MACtEZ,EAAK,sBAA8B,YAwJrC,SAAwBY,GACtB,IAAIqK,EAAO1d,OAAO2d,kBACdC,EAAO,EACPC,EAAO7d,OAAO2d,kBACdG,EAAO,EACPC,EAAa1K,EAAEE,QACfyK,EAAUD,EAAWE,SAAW,EAChCC,EAAUH,EAAWI,SAAW,EAEpC,SAASC,EAAYpI,GACnB,IAAII,EAAIJ,EAAMI,EACVF,EAAIF,EAAME,EACVhC,EAAI8B,EAAMZ,MACVyC,EAAI7B,EAAMtmB,OACdguB,EAAO3E,KAAKsF,IAAIX,EAAMtH,EAAIlC,EAAI,GAC9B0J,EAAO7E,KAAKC,IAAI4E,EAAMxH,EAAIlC,EAAI,GAC9B2J,EAAO9E,KAAKsF,IAAIR,EAAM3H,EAAI2B,EAAI,GAC9BiG,EAAO/E,KAAKC,IAAI8E,EAAM5H,EAAI2B,EAAI,GAGhC3E,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKq0B,EAAY/K,EAAEzsB,KAAKmD,OACnDmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACdwuB,EAAEa,IAAIN,EAAM,MACd2K,EAAY3K,MAIhBiK,GAAQM,EACRH,GAAQK,EAERhL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClBnD,EAAKwvB,GAAKsH,EACV92B,EAAKsvB,GAAK2H,KAGZ3K,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GAClBwuB,EAAEc,KAAKP,EAAKlhB,QAAQ,SAAS/N,GAC3BA,EAAE4xB,GAAKsH,EACPl5B,EAAE0xB,GAAK2H,KAEL3K,EAAEa,IAAIN,EAAM,OAAQA,EAAK2C,GAAKsH,GAC9BxK,EAAEa,IAAIN,EAAM,OAAQA,EAAKyC,GAAK2H,MAGpCE,EAAW3I,MAAQwI,EAAOF,EAAOM,EACjCD,EAAWruB,OAASouB,EAAOD,EAAOK,EAxMcI,CAAejL,MAC/DZ,EAAK,4BAA8B,YA0MrC,SAA8BY,GAC5BH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAGI65B,EAAIC,EAHJ/K,EAAOJ,EAAEI,KAAK/uB,GACd+5B,EAAQpL,EAAEzsB,KAAKlC,EAAEqF,GACjB20B,EAAQrL,EAAEzsB,KAAKlC,EAAEwvB,GAEhBT,EAAKlhB,QAKRgsB,EAAK9K,EAAKlhB,OAAO,GACjBisB,EAAK/K,EAAKlhB,OAAOkhB,EAAKlhB,OAAOjQ,OAAS,KALtCmxB,EAAKlhB,OAAS,GACdgsB,EAAKG,EACLF,EAAKC,GAKPhL,EAAKlhB,OAAOkU,QAAQ+L,EAAKmM,cAAcF,EAAOF,IAC9C9K,EAAKlhB,OAAOpP,KAAKqvB,EAAKmM,cAAcD,EAAOF,OAzNGI,CAAqBvL,MACrEZ,EAAK,qBAA8B,YA2OrC,SAAuCY,GACrCH,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACd+uB,EAAKe,UACPf,EAAKlhB,OAAOyM,aA/OgC6f,CAA8BxL,MAC9EZ,EAAK,oBAA8B,WAAa2H,EAAQzF,KAAKtB,MAhCnByL,CAAUhE,EAAarI,MAC/DA,EAAK,sBAAsB,YAwC/B,SAA0BsI,EAAYD,GACpC5H,EAAEc,KAAK+G,EAAW5G,SAAS,SAASpqB,GAClC,IAAIg1B,EAAahE,EAAWn0B,KAAKmD,GAC7Bi1B,EAAclE,EAAYl0B,KAAKmD,GAE/Bg1B,IACFA,EAAW3I,EAAI4I,EAAY5I,EAC3B2I,EAAW7I,EAAI8I,EAAY9I,EAEvB4E,EAAYtvB,SAASzB,GAAGzH,SAC1By8B,EAAW3J,MAAQ4J,EAAY5J,MAC/B2J,EAAWrvB,OAASsvB,EAAYtvB,YAKtCwjB,EAAEc,KAAK+G,EAAWnG,SAAS,SAASlwB,GAClC,IAAIq6B,EAAahE,EAAWtH,KAAK/uB,GAC7Bs6B,EAAclE,EAAYrH,KAAK/uB,GAEnCq6B,EAAWxsB,OAASysB,EAAYzsB,OAC5B2gB,EAAEa,IAAIiL,EAAa,OACrBD,EAAW3I,EAAI4I,EAAY5I,EAC3B2I,EAAW7I,EAAI8I,EAAY9I,MAI/B6E,EAAWxH,QAAQ6B,MAAQ0F,EAAYvH,QAAQ6B,MAC/C2F,EAAWxH,QAAQ7jB,OAASorB,EAAYvH,QAAQ7jB,OApENuvB,CAAiB5L,EAAGyH,UAuEhE,IAAIM,EAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,WAC7DF,EAAgB,CAAEY,QAAS,GAAIoD,QAAS,GAAIC,QAAS,GAAI5I,QAAS,MAClE+E,EAAa,CAAC,YAAa,SAAU,UAAW,SAChDE,EAAe,CAAC,QAAS,UACzBC,EAAe,CAAErG,MAAO,EAAG1lB,OAAQ,GACnCisB,EAAe,CAAC,SAAU,SAAU,QAAS,SAAU,eACvDD,EAAe,CACbK,OAAQ,EAAGrI,OAAQ,EAAG0B,MAAO,EAAG1lB,OAAQ,EACxCusB,YAAa,GAAID,SAAU,KAE7BJ,EAAY,CAAC,YAmRjB,SAAST,EAAkBl6B,EAAK+0B,GAC9B,OAAO9C,EAAEkM,UAAUlM,EAAEmI,KAAKp6B,EAAK+0B,GAAQhW,QAGzC,SAASgb,EAAahF,GACpB,IAAIqJ,EAAW,GAIf,OAHAnM,EAAEc,KAAKgC,GAAO,SAASjsB,EAAGkS,GACxBojB,EAASpjB,EAAE1U,eAAiBwC,KAEvBs1B,IAGP,CAACC,YAAY,EAAEC,wBAAwB,EAAEC,sBAAsB,EAAEpH,aAAa,EAAEtD,WAAW,GAAG2K,kBAAkB,GAAGC,cAAc,GAAGC,UAAU,GAAGC,wBAAwB,GAAGC,aAAa,GAAGC,SAAS,GAAGlK,SAAS,KAAKmK,GAAG,CAAC,SAASjgC,EAAQ6E,EAAOF,GAGpP,IAAIu7B,EAEJ,GAAIlgC,EACF,IACEkgC,EAASlgC,EAAQ,UACjB,MAAO4E,IAGNs7B,IACHA,EAASp6B,OAAOstB,GAGlBvuB,EAAOF,QAAUu7B,GAEf,CAACA,OAAS,KAAKC,GAAG,CAAC,SAASngC,EAAQ6E,EAAOF,GAC7C,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UAEnB6E,EAAOF,QAAU,CACf2uB,IA2BF,SAAaC,GACX,IAAInb,EAAOsa,EAAK8C,aAAajC,EAAG,OAAQ,GAAI,SACxC6M,EAmEN,SAAoB7M,GAClB,IAAI6M,EAAS,GAWb,OADAhN,EAAEc,KAAKX,EAAE7nB,YAAY,SAASzB,IAT9B,SAAS+pB,EAAI/pB,EAAGo2B,GACd,IAAI30B,EAAW6nB,EAAE7nB,SAASzB,GACtByB,GAAYA,EAASlJ,QACvB4wB,EAAEc,KAAKxoB,GAAU,SAAS40B,GACxBtM,EAAIsM,EAAOD,EAAQ,MAGvBD,EAAOn2B,GAAKo2B,EAEqBrM,CAAI/pB,EAAG,MACnCm2B,EA/EMG,CAAWhN,GACpB3jB,EAASwjB,EAAE8F,IAAIkH,GAAU,EACzBI,EAAU,EAAI5wB,EAAS,EAE3B2jB,EAAEE,QAAQgN,YAAcroB,EAGxBgb,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GAAK2uB,EAAEI,KAAK/uB,GAAGq3B,QAAUuE,KAGpD,IAAI5M,EAwEN,SAAoBL,GAClB,OAAOH,EAAEiF,OAAO9E,EAAEuB,SAAS,SAAS4L,EAAK97B,GACvC,OAAO87B,EAAMnN,EAAEI,KAAK/uB,GAAGgvB,SACtB,GA3EU+M,CAAWpN,GAAK,EAG7BH,EAAEc,KAAKX,EAAE7nB,YAAY,SAAS40B,IAShC,SAAStM,EAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQn2B,GACrD,IAAIyB,EAAW6nB,EAAE7nB,SAASzB,GAC1B,IAAKyB,EAASlJ,OAIZ,YAHIyH,IAAMmO,GACRmb,EAAEoB,QAAQvc,EAAMnO,EAAG,CAAE2pB,OAAQ,EAAGqI,OAAQuE,KAK5C,IAAIlxB,EAAMojB,EAAKwC,cAAc3B,EAAG,OAC5BqN,EAASlO,EAAKwC,cAAc3B,EAAG,OAC/BgB,EAAQhB,EAAEzsB,KAAKmD,GAEnBspB,EAAEkC,UAAUnmB,EAAKrF,GACjBsqB,EAAMmI,UAAYptB,EAClBikB,EAAEkC,UAAUmL,EAAQ32B,GACpBsqB,EAAMoI,aAAeiE,EAErBxN,EAAEc,KAAKxoB,GAAU,SAAS40B,GACxBtM,EAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQE,GAE9C,IAAIO,EAAYtN,EAAEzsB,KAAKw5B,GACnBQ,EAAWD,EAAUnE,UAAYmE,EAAUnE,UAAY4D,EACvDS,EAAcF,EAAUlE,aAAekE,EAAUlE,aAAe2D,EAChEU,EAAaH,EAAUnE,UAAY9I,EAAS,EAAIA,EAChDqI,EAAS6E,IAAaC,EAAc,EAAInxB,EAASwwB,EAAOn2B,GAAK,EAEjEspB,EAAEoB,QAAQrlB,EAAKwxB,EAAU,CACvBlN,OAAQoN,EACR/E,OAAQA,EACRgF,aAAa,IAGf1N,EAAEoB,QAAQoM,EAAaH,EAAQ,CAC7BhN,OAAQoN,EACR/E,OAAQA,EACRgF,aAAa,OAIZ1N,EAAE/c,OAAOvM,IACZspB,EAAEoB,QAAQvc,EAAM9I,EAAK,CAAEskB,OAAQ,EAAGqI,OAAQrsB,EAASwwB,EAAOn2B,KAjD1D+pB,CAAIT,EAAGnb,EAAMooB,EAAS5M,EAAQhkB,EAAQwwB,EAAQE,MAKhD/M,EAAEE,QAAQyN,eAAiBV,GA/C3B/D,QAoHF,SAAiBlJ,GACf,IAAI0K,EAAa1K,EAAEE,QACnBF,EAAEqG,WAAWqE,EAAWwC,oBACjBxC,EAAWwC,YAClBrN,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACd2uB,EAAEI,KAAK/uB,GACTq8B,aACP1N,EAAEiB,WAAW5vB,SAKjB,CAACowB,WAAW,GAAGc,SAAS,KAAKqL,GAAG,CAAC,SAASnhC,EAAQ6E,EAAOF,GAG3D,IAAIyuB,EAAIpzB,EAAQ,YACZ0yB,EAAO1yB,EAAQ,UAEnB6E,EAAOF,QAAU,CACf2uB,IAoBF,SAAaC,GACXA,EAAEE,QAAQ2N,YAAc,GACxBhO,EAAEc,KAAKX,EAAEuB,SAAS,SAASnB,IAG7B,SAAuBJ,EAAG3uB,GACxB,IAYIi4B,EAAO3G,EAAOj0B,EAZdgI,EAAIrF,EAAEqF,EACNo3B,EAAQ9N,EAAEzsB,KAAKmD,GAAGorB,KAClBjB,EAAIxvB,EAAEwvB,EACNkN,EAAQ/N,EAAEzsB,KAAKstB,GAAGiB,KAClB9zB,EAAOqD,EAAErD,KACTggC,EAAYhO,EAAEI,KAAK/uB,GACnBk4B,EAAYyE,EAAUzE,UAE1B,GAAIwE,IAAUD,EAAQ,EAAG,OAKzB,IAHA9N,EAAEiB,WAAW5vB,GAGR3C,EAAI,IAAKo/B,EAAOA,EAAQC,IAASr/B,IAAKo/B,EACzCE,EAAU9uB,OAAS,GACnByjB,EAAQ,CACNZ,MAAO,EAAG1lB,OAAQ,EAClB2xB,UAAWA,EAAWC,QAAS58B,EAC/BywB,KAAMgM,GAERxE,EAAQnK,EAAK8C,aAAajC,EAAG,OAAQ2C,EAAO,MACxCmL,IAAUvE,IACZ5G,EAAMZ,MAAQiM,EAAUjM,MACxBY,EAAMtmB,OAAS2xB,EAAU3xB,OACzBsmB,EAAM2G,MAAQ,aACd3G,EAAMgG,SAAWqF,EAAUrF,UAE7B3I,EAAEoB,QAAQ1qB,EAAG4yB,EAAO,CAAEjJ,OAAQ2N,EAAU3N,QAAUryB,GACxC,IAANU,GACFsxB,EAAEE,QAAQ2N,YAAY/9B,KAAKw5B,GAE7B5yB,EAAI4yB,EAGNtJ,EAAEoB,QAAQ1qB,EAAGmqB,EAAG,CAAER,OAAQ2N,EAAU3N,QAAUryB,GAtCXkgC,CAAclO,EAAGI,OArBpDkB,KA8DF,SAActB,GACZH,EAAEc,KAAKX,EAAEE,QAAQ2N,aAAa,SAASn3B,GACrC,IAEImqB,EAFAttB,EAAOysB,EAAEzsB,KAAKmD,GACdy3B,EAAY56B,EAAKy6B,UAGrB,IADAhO,EAAEoB,QAAQ7tB,EAAK06B,QAASE,GACjB56B,EAAK+1B,OACVzI,EAAIb,EAAEoO,WAAW13B,GAAG,GACpBspB,EAAEqG,WAAW3vB,GACby3B,EAAUjvB,OAAOpP,KAAK,CAAEizB,EAAGxvB,EAAKwvB,EAAGF,EAAGtvB,EAAKsvB,IACxB,eAAftvB,EAAK+1B,QACP6E,EAAUpL,EAAIxvB,EAAKwvB,EACnBoL,EAAUtL,EAAItvB,EAAKsvB,EACnBsL,EAAUpM,MAAQxuB,EAAKwuB,MACvBoM,EAAU9xB,OAAS9I,EAAK8I,QAE1B3F,EAAImqB,EACJttB,EAAOysB,EAAEzsB,KAAKmD,SAKlB,CAAC+qB,WAAW,GAAGc,SAAS,KAAK8L,GAAG,CAAC,SAAS5hC,EAAQ6E,EAAOF,GAC3D,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAgC4uB,EAAGsO,EAAIC,GACrC,IACIC,EADAjvB,EAAO,GAGXsgB,EAAEc,KAAK4N,GAAI,SAAS73B,GAIlB,IAHA,IACIuM,EACAwrB,EAFA1B,EAAQ/M,EAAE/c,OAAOvM,GAGdq2B,GAAO,CASZ,IARA9pB,EAAS+c,EAAE/c,OAAO8pB,KAEhB0B,EAAYlvB,EAAK0D,GACjB1D,EAAK0D,GAAU8pB,IAEf0B,EAAYD,EACZA,EAAWzB,GAET0B,GAAaA,IAAc1B,EAE7B,YADAuB,EAAGlN,QAAQqN,EAAW1B,GAGxBA,EAAQ9pB,QA6BZ,CAACyrB,YAAY,KAAKC,GAAG,CAAC,SAASliC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAoB4uB,EAAG4O,GACrB,OAAO/O,EAAE9wB,IAAI6/B,GAAS,SAASl4B,GAC7B,IAAIm4B,EAAM7O,EAAE0G,QAAQhwB,GACpB,GAAKm4B,EAAI5/B,OAEF,CACL,IAAI6/B,EAASjP,EAAEiF,OAAO+J,GAAK,SAAS1B,EAAK97B,GACvC,IAAI+uB,EAAOJ,EAAEI,KAAK/uB,GACd09B,EAAQ/O,EAAEzsB,KAAKlC,EAAEqF,GACrB,MAAO,CACLs4B,IAAK7B,EAAI6B,IAAO5O,EAAKC,OAAS0O,EAAMzH,MACpCjH,OAAQ8M,EAAI9M,OAASD,EAAKC,UAE3B,CAAE2O,IAAK,EAAG3O,OAAQ,IAErB,MAAO,CACL3pB,EAAGA,EACHu4B,WAAYH,EAAOE,IAAMF,EAAOzO,OAChCA,OAAQyO,EAAOzO,QAdjB,MAAO,CAAE3pB,EAAGA,QAqBhB,CAACg4B,YAAY,KAAKQ,GAAG,CAAC,SAASziC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAEnC9yB,EAAOF,QAgCP,SAAyB4uB,EAAG8B,EAAMqN,GAChC,IAAItqB,EAgCN,SAAwBmb,GACtB,IAAItpB,EACJ,KAAOspB,EAAEoP,QAAS14B,EAAImpB,EAAEwB,SAAS,YACjC,OAAO3qB,EAnCI24B,CAAerP,GACtB8O,EAAS,IAAI1K,EAAM,CAAEK,UAAU,IAAQE,SAAS,CAAE9f,KAAMA,IAC3CyqB,qBAAoB,SAAS54B,GAAK,OAAOspB,EAAEzsB,KAAKmD,MA2BjE,OAzBAmpB,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACduM,EAAS+c,EAAE/c,OAAOvM,IAElBnD,EAAKuuB,OAASA,GAAQvuB,EAAK8uB,SAAWP,GAAQA,GAAQvuB,EAAK+uB,WAC7DwM,EAAOlK,QAAQluB,GACfo4B,EAAO5M,UAAUxrB,EAAGuM,GAAU4B,GAG9Bgb,EAAEc,KAAKX,EAAEmP,GAAcz4B,IAAI,SAASrF,GAClC,IAAIwtB,EAAIxtB,EAAEqF,IAAMA,EAAIrF,EAAEwvB,EAAIxvB,EAAEqF,EACxB0pB,EAAO0O,EAAO1O,KAAKvB,EAAGnoB,GACtB2pB,EAAUR,EAAE0P,YAAYnP,GAAsB,EAAdA,EAAKC,OACzCyO,EAAO1N,QAAQvC,EAAGnoB,EAAG,CAAE2pB,OAAQL,EAAEI,KAAK/uB,GAAGgvB,OAASA,OAGhDR,EAAEa,IAAIntB,EAAM,YACdu7B,EAAOlK,QAAQluB,EAAG,CAChByrB,WAAY5uB,EAAK4uB,WAAWL,GAC5BM,YAAa7uB,EAAK6uB,YAAYN,SAM/BgN,IASP,CAACU,cAAc,EAAEd,YAAY,KAAKe,GAAG,CAAC,SAAShjC,EAAQ6E,EAAOF,GAGhE,IAAIyuB,EAAIpzB,EAAQ,aA4BhB,SAASijC,EAAmB1P,EAAG2P,EAAYC,GAiBzC,IAbA,IAAIC,EAAWhQ,EAAEiQ,UAAUF,EACA/P,EAAE9wB,IAAI6gC,GAAY,SAAUl5B,EAAGhI,GAAK,OAAOA,MAClEqhC,EAAelQ,EAAE0G,QAAQ1G,EAAE9wB,IAAI4gC,GAAY,SAASj5B,GACtD,OAAOmpB,EAAEmQ,MAAMhQ,EAAEY,SAASlqB,IACjB3H,KAAI,SAASsC,GACZ,MAAO,CAAE6H,IAAK22B,EAASx+B,EAAEwvB,GAAIR,OAAQL,EAAEI,KAAK/uB,GAAGgvB,WAEhD4P,OAAO,OACP//B,YACP,GAGAggC,EAAa,EACVA,EAAaN,EAAW3gC,QAAQihC,IAAe,EACtD,IAAIC,EAAW,EAAID,EAAa,EAChCA,GAAc,EACd,IAAIE,EAAOvQ,EAAE9wB,IAAI,IAAIsP,MAAM8xB,IAAW,WAAa,OAAO,KAGtDE,EAAK,EAeT,OAdAxQ,EAAEc,KAAKoP,EAAa32B,SAAQ,SAASwqB,GACnC,IAAIrzB,EAAQqzB,EAAM1qB,IAAMg3B,EACxBE,EAAK7/B,IAAUqzB,EAAMvD,OAErB,IADA,IAAIiQ,EAAY,EACT//B,EAAQ,GACTA,EAAQ,IACV+/B,GAAaF,EAAK7/B,EAAQ,IAG5B6/B,EADA7/B,EAASA,EAAQ,GAAM,IACRqzB,EAAMvD,OAEvBgQ,GAAMzM,EAAMvD,OAASiQ,MAGhBD,EAhET/+B,EAAOF,QAkBP,SAAoB4uB,EAAGuQ,GAErB,IADA,IAAIF,EAAK,EACA3hC,EAAI,EAAGA,EAAI6hC,EAASthC,SAAUP,EACrC2hC,GAAMX,EAAmB1P,EAAGuQ,EAAS7hC,EAAE,GAAI6hC,EAAS7hC,IAEtD,OAAO2hC,IA4CP,CAAC3B,YAAY,KAAK8B,GAAG,CAAC,SAAS/jC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,aACZgkC,EAAYhkC,EAAQ,gBACpBikC,EAAajkC,EAAQ,iBACrBkkC,EAAelkC,EAAQ,mBACvBmkC,EAAkBnkC,EAAQ,uBAC1BokC,EAAyBpkC,EAAQ,8BACjC23B,EAAQ33B,EAAQ,eAAe23B,MAC/BjF,EAAO1yB,EAAQ,WA6CnB,SAASqkC,EAAiB9Q,EAAG+Q,EAAO5B,GAClC,OAAOtP,EAAE9wB,IAAIgiC,GAAO,SAASjP,GAC3B,OAAO8O,EAAgB5Q,EAAG8B,EAAMqN,MAIpC,SAAS6B,EAAiBC,EAAaC,GACrC,IAAI5C,EAAK,IAAIlK,EACbvE,EAAEc,KAAKsQ,GAAa,SAASE,GAC3B,IAAItsB,EAAOssB,EAAGjR,QAAQrb,KAClBusB,EAAST,EAAaQ,EAAItsB,EAAMypB,EAAI4C,GACxCrR,EAAEc,KAAKyQ,EAAO7C,IAAI,SAAS73B,EAAGhI,GAC5ByiC,EAAG59B,KAAKmD,GAAG4wB,MAAQ54B,KAErBmiC,EAAuBM,EAAI7C,EAAI8C,EAAO7C,OAI1C,SAAS8C,EAAYrR,EAAGuQ,GACtB1Q,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxBmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxBsxB,EAAEzsB,KAAKmD,GAAG4wB,MAAQ54B,QAhExB4C,EAAOF,QAiBP,SAAe4uB,GACb,IAAIsC,EAAUnD,EAAKmD,QAAQtC,GACvBsR,EAAkBR,EAAiB9Q,EAAGH,EAAEgG,MAAM,EAAGvD,EAAU,GAAI,WAC/DiP,EAAgBT,EAAiB9Q,EAAGH,EAAEgG,MAAMvD,EAAU,GAAI,GAAI,GAAI,YAElEiO,EAAWE,EAAUzQ,GACzBqR,EAAYrR,EAAGuQ,GAKf,IAHA,IACIiB,EADAC,EAAS9kB,OAAO2d,kBAGX57B,EAAI,EAAGgjC,EAAW,EAAGA,EAAW,IAAKhjC,IAAKgjC,EAAU,CAC3DV,EAAiBtiC,EAAI,EAAI4iC,EAAkBC,EAAe7iC,EAAI,GAAK,GAEnE6hC,EAAWpR,EAAKoF,iBAAiBvE,GACjC,IAAIqQ,EAAKK,EAAW1Q,EAAGuQ,GACnBF,EAAKoB,IACPC,EAAW,EACXF,EAAO3R,EAAE8R,UAAUpB,GACnBkB,EAASpB,GAIbgB,EAAYrR,EAAGwR,KA6Bf,CAAChC,cAAc,EAAEd,YAAY,GAAGkD,UAAU,GAAGC,6BAA6B,GAAGC,sBAAsB,GAAGC,gBAAgB,GAAGC,eAAe,GAAGC,kBAAkB,KAAKC,GAAG,CAAC,SAASzlC,EAAQ6E,EAAOF,GAGhM,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAaP,SAAmB4uB,GACjB,IAAIQ,EAAU,GACV2R,EAActS,EAAE/T,OAAOkU,EAAEc,SAAS,SAASpqB,GACzC,OAAQspB,EAAE7nB,SAASzB,GAAGzH,UAExBqzB,EAAUzC,EAAE8F,IAAI9F,EAAE9wB,IAAIojC,GAAa,SAASz7B,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAClE2H,EAAS5J,EAAE9wB,IAAI8wB,EAAEgG,MAAMvD,EAAU,IAAI,WAAa,MAAO,MAU7D,IAAI8P,EAAYvS,EAAEoQ,OAAOkC,GAAa,SAASz7B,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,QAGrE,OAFAjC,EAAEc,KAAKyR,GATP,SAAS3R,EAAI/pB,GACX,GAAImpB,EAAEa,IAAIF,EAAS9pB,GAAI,OACvB8pB,EAAQ9pB,IAAK,EACb,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GAClB+yB,EAAOl2B,EAAKuuB,MAAMhyB,KAAK4G,GACvBmpB,EAAEc,KAAKX,EAAEoO,WAAW13B,GAAI+pB,MAMnBgJ,IAGP,CAACiF,YAAY,KAAK2D,GAAG,CAAC,SAAS5lC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QA2BP,SAA0BkhC,EAAShE,GACjC,IAAIiE,EAAgB,GA4BpB,OA3BA1S,EAAEc,KAAK2R,GAAS,SAAS1O,EAAOl1B,GAC9B,IAAI8jC,EAAMD,EAAc3O,EAAMltB,GAAK,CACjC+7B,SAAU,EACVnN,GAAM,GACNC,IAAK,GACLgJ,GAAI,CAAC3K,EAAMltB,GACXhI,EAAGA,GAEAmxB,EAAE0P,YAAY3L,EAAMqL,cACvBuD,EAAIvD,WAAarL,EAAMqL,WACvBuD,EAAInS,OAASuD,EAAMvD,WAIvBR,EAAEc,KAAK2N,EAAG/M,SAAS,SAASlwB,GAC1B,IAAIqhC,EAASH,EAAclhC,EAAEqF,GACzBi8B,EAASJ,EAAclhC,EAAEwvB,GACxBhB,EAAE0P,YAAYmD,IAAY7S,EAAE0P,YAAYoD,KAC3CA,EAAOF,WACPC,EAAOnN,IAAIz1B,KAAKyiC,EAAclhC,EAAEwvB,QAWtC,SAA4B+R,GAC1B,IAAIN,EAAU,GAEd,SAASO,EAASC,GAChB,OAAO,SAASnM,GACVA,EAAOoM,SAGPlT,EAAE0P,YAAY5I,EAAOsI,aACrBpP,EAAE0P,YAAYuD,EAAO7D,aACrBtI,EAAOsI,YAAc6D,EAAO7D,aA8BtC,SAAsBhY,EAAQ+b,GAC5B,IAAIhE,EAAM,EACN3O,EAAS,EAETpJ,EAAOoJ,SACT2O,GAAO/X,EAAOgY,WAAahY,EAAOoJ,OAClCA,GAAUpJ,EAAOoJ,QAGf2S,EAAO3S,SACT2O,GAAOgE,EAAO/D,WAAa+D,EAAO3S,OAClCA,GAAU2S,EAAO3S,QAGnBpJ,EAAOsX,GAAKyE,EAAOzE,GAAGj/B,OAAO2nB,EAAOsX,IACpCtX,EAAOgY,WAAaD,EAAM3O,EAC1BpJ,EAAOoJ,OAASA,EAChBpJ,EAAOvoB,EAAIg3B,KAAKsF,IAAIgI,EAAOtkC,EAAGuoB,EAAOvoB,GACrCskC,EAAOD,QAAS,EA/CVE,CAAaH,EAAQnM,IAK3B,SAASuM,EAAUJ,GACjB,OAAO,SAASlM,GACdA,EAAW,GAAE92B,KAAKgjC,GACQ,KAApBlM,EAAO6L,UACXG,EAAU9iC,KAAK82B,IAKrB,KAAOgM,EAAU3jC,QAAQ,CACvB,IAAI20B,EAAQgP,EAAUO,MACtBb,EAAQxiC,KAAK8zB,GACb/D,EAAEc,KAAKiD,EAAU,GAAEjY,UAAWknB,EAASjP,IACvC/D,EAAEc,KAAKiD,EAAM2B,IAAK2N,EAAUtP,IAG9B,OAAO/D,EAAEmQ,MAAMsC,GACNxmB,QAAO,SAAS8X,GAAS,OAAQA,EAAMmP,UACvChkC,KAAI,SAAS60B,GACZ,OAAO/D,EAAEmI,KAAKpE,EAAO,CAAC,KAAM,IAAK,aAAc,cAEhD1zB,QAxCFkjC,CAJSvT,EAAE/T,OAAOymB,GAAe,SAAS3O,GAC/C,OAAQA,EAAM6O,eAmEhB,CAAC/D,YAAY,KAAK2E,GAAG,CAAC,SAAS5mC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aACZwiC,EAAaxiC,EAAQ,gBACrB6mC,EAAmB7mC,EAAQ,uBAC3B0qB,EAAO1qB,EAAQ,UAEnB6E,EAAOF,QAEP,SAASu/B,EAAa3Q,EAAGtpB,EAAG43B,EAAI4C,GAC9B,IAAItC,EAAU5O,EAAE7nB,SAASzB,GACrBnD,EAAOysB,EAAEzsB,KAAKmD,GACd68B,EAAKhgC,EAAOA,EAAK4uB,gBAAanwB,EAC9BwhC,EAAKjgC,EAAOA,EAAK6uB,iBAAapwB,EAC9ByhC,EAAY,GAEZF,IACF3E,EAAU/O,EAAE/T,OAAO8iB,GAAS,SAAS/N,GACnC,OAAOA,IAAM0S,GAAM1S,IAAM2S,MAI7B,IAAIE,EAAczE,EAAWjP,EAAG4O,GAChC/O,EAAEc,KAAK+S,GAAa,SAAS9P,GAC3B,GAAI5D,EAAE7nB,SAASyrB,EAAMltB,GAAGzH,OAAQ,CAC9B,IAAI0kC,EAAiBhD,EAAa3Q,EAAG4D,EAAMltB,EAAG43B,EAAI4C,GAClDuC,EAAU7P,EAAMltB,GAAKi9B,EACjB9T,EAAEa,IAAIiT,EAAgB,gBAwCN1c,EAvCD2M,EAuCSgQ,EAvCFD,EAwCzB9T,EAAE0P,YAAYtY,EAAOgY,aAMxBhY,EAAOgY,WAAa2E,EAAM3E,WAC1BhY,EAAOoJ,OAASuT,EAAMvT,SANtBpJ,EAAOgY,YAAchY,EAAOgY,WAAahY,EAAOoJ,OAC3BuT,EAAM3E,WAAa2E,EAAMvT,SACzBpJ,EAAOoJ,OAASuT,EAAMvT,QAC3CpJ,EAAOoJ,QAAUuT,EAAMvT,SAL3B,IAA0BpJ,EAAQ2c,KAlChC,IAAItB,EAAUgB,EAAiBI,EAAapF,IAuB9C,SAAyBgE,EAASmB,GAChC5T,EAAEc,KAAK2R,GAAS,SAAS1O,GACvBA,EAAM2K,GAAK1O,EAAE0G,QAAQ3C,EAAM2K,GAAGx/B,KAAI,SAAS2H,GACzC,OAAI+8B,EAAU/8B,GACL+8B,EAAU/8B,GAAG63B,GAEf73B,MACL,MA7BNm9B,CAAgBvB,EAASmB,GAEzB,IAAI3E,EAAS3X,EAAKmb,EAASpB,GAE3B,GAAIqC,IACFzE,EAAOP,GAAK1O,EAAE0G,QAAQ,CAACgN,EAAIzE,EAAOP,GAAIiF,IAAK,GACvCxT,EAAE8T,aAAaP,GAAItkC,QAAQ,CAC7B,IAAI8kC,EAAS/T,EAAEzsB,KAAKysB,EAAE8T,aAAaP,GAAI,IACnCS,EAAShU,EAAEzsB,KAAKysB,EAAE8T,aAAaN,GAAI,IAClC3T,EAAEa,IAAIoO,EAAQ,gBACjBA,EAAOG,WAAa,EACpBH,EAAOzO,OAAS,GAElByO,EAAOG,YAAcH,EAAOG,WAAaH,EAAOzO,OAC3B0T,EAAOzM,MAAQ0M,EAAO1M,QAAUwH,EAAOzO,OAAS,GACrEyO,EAAOzO,QAAU,EAIrB,OAAOyO,IA0BP,CAACJ,YAAY,GAAGuF,eAAe,GAAGC,sBAAsB,GAAGC,SAAS,KAAKC,GAAG,CAAC,SAAS3nC,EAAQ6E,EAAOF,GACvG,IAAIyuB,EAAIpzB,EAAQ,aACZ0yB,EAAO1yB,EAAQ,WAmCnB,SAAS4nC,EAAkB9F,EAAI+F,EAAY/jC,GAEzC,IADA,IAAI05B,EACGqK,EAAWrlC,SAAWg7B,EAAOpK,EAAEoK,KAAKqK,IAAa5lC,GAAK6B,GAC3D+jC,EAAWnB,MACX5E,EAAGz+B,KAAKm6B,EAAKsE,IACbh+B,IAEF,OAAOA,EAxCTe,EAAOF,QAEP,SAAckhC,EAASpB,GACrB,IAAIpgC,EAAQquB,EAAKoV,UAAUjC,GAAS,SAAS1O,GAC3C,OAAO/D,EAAEa,IAAIkD,EAAO,iBAElB4Q,EAAW1jC,EAAM2jC,IACjBH,EAAazU,EAAEoQ,OAAOn/B,EAAM4jC,KAAK,SAAS9Q,GAAS,OAAQA,EAAMl1B,KACjE6/B,EAAK,GACLS,EAAM,EACN3O,EAAS,EACTsU,EAAU,EAEdH,EAASrd,MA8Bcyd,IA9BS1D,EA+BzB,SAASwB,EAAQC,GACtB,OAAID,EAAOzD,WAAa0D,EAAO1D,YACrB,EACCyD,EAAOzD,WAAa0D,EAAO1D,WAC7B,EAGD2F,EAA6BjC,EAAOjkC,EAAIgkC,EAAOhkC,EAAxCgkC,EAAOhkC,EAAIikC,EAAOjkC,KApCnCimC,EAAUN,EAAkB9F,EAAI+F,EAAYK,GAE5C9U,EAAEc,KAAK6T,GAAU,SAAU5Q,GACzB+Q,GAAW/Q,EAAM2K,GAAGt/B,OACpBs/B,EAAGz+B,KAAK8zB,EAAM2K,IACdS,GAAOpL,EAAMqL,WAAarL,EAAMvD,OAChCA,GAAUuD,EAAMvD,OAChBsU,EAAUN,EAAkB9F,EAAI+F,EAAYK,MAqBhD,IAAyBC,EAlBvB,IAAI9F,EAAS,CAAEP,GAAI1O,EAAE0G,QAAQgI,GAAI,IAC7BlO,IACFyO,EAAOG,WAAaD,EAAM3O,EAC1ByO,EAAOzO,OAASA,GAElB,OAAOyO,IAyBP,CAACJ,YAAY,GAAGkD,UAAU,KAAKiD,GAAG,CAAC,SAASpoC,EAAQ6E,EAAOF,GAC7D,IAAIyuB,EAAIpzB,EAAQ,YAEhB6E,EAAOF,QAEP,SAA2B4uB,GACzB,IAAI8U,EAoEN,SAAmB9U,GACjB,IAAI8O,EAAS,GACTiG,EAAM,EAEV,SAAStU,EAAI/pB,GACX,IAAIs+B,EAAMD,EACVlV,EAAEc,KAAKX,EAAE7nB,SAASzB,GAAI+pB,GACtBqO,EAAOp4B,GAAK,CAAEs+B,IAAKA,EAAKD,IAAKA,KAI/B,OAFAlV,EAAEc,KAAKX,EAAE7nB,WAAYsoB,GAEdqO,EA/EamG,CAAUjV,GAE9BH,EAAEc,KAAKX,EAAEE,QAAQ2N,aAAa,SAASn3B,GAUrC,IATA,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdu3B,EAAU16B,EAAK06B,QACfiH,EAqCR,SAAkBlV,EAAG8U,EAAep+B,EAAGmqB,GACrC,IAII5d,EACAkyB,EALAC,EAAQ,GACRC,EAAQ,GACRL,EAAMtP,KAAKsF,IAAI8J,EAAcp+B,GAAGs+B,IAAKF,EAAcjU,GAAGmU,KACtDD,EAAMrP,KAAKC,IAAImP,EAAcp+B,GAAGq+B,IAAKD,EAAcjU,GAAGkU,KAK1D9xB,EAASvM,EACT,GACEuM,EAAS+c,EAAE/c,OAAOA,GAClBmyB,EAAMtlC,KAAKmT,SACJA,IACC6xB,EAAc7xB,GAAQ+xB,IAAMA,GAAOD,EAAMD,EAAc7xB,GAAQ8xB,MACzEI,EAAMlyB,EAGNA,EAAS4d,EACT,MAAQ5d,EAAS+c,EAAE/c,OAAOA,MAAakyB,GACrCE,EAAMvlC,KAAKmT,GAGb,MAAO,CAAEqyB,KAAMF,EAAM9lC,OAAO+lC,EAAM1pB,WAAYwpB,IAAKA,GA5DlCI,CAASvV,EAAG8U,EAAe7G,EAAQv3B,EAAGu3B,EAAQpN,GACzDyU,EAAOJ,EAASI,KAChBH,EAAMD,EAASC,IACfK,EAAU,EACVC,EAAQH,EAAKE,GACbE,GAAY,EAETh/B,IAAMu3B,EAAQpN,GAAG,CAGtB,GAFAttB,EAAOysB,EAAEzsB,KAAKmD,GAEVg/B,EAAW,CACb,MAAQD,EAAQH,EAAKE,MAAcL,GAC5BnV,EAAEzsB,KAAKkiC,GAAOnT,QAAU/uB,EAAKuuB,MAClC0T,IAGEC,IAAUN,IACZO,GAAY,GAIhB,IAAKA,EAAW,CACd,KAAOF,EAAUF,EAAKrmC,OAAS,GACxB+wB,EAAEzsB,KAAKkiC,EAAQH,EAAKE,EAAU,IAAInT,SAAW9uB,EAAKuuB,MACvD0T,IAEFC,EAAQH,EAAKE,GAGfxV,EAAEkC,UAAUxrB,EAAG++B,GACf/+B,EAAIspB,EAAEoO,WAAW13B,GAAG,SA+CxB,CAAC+qB,WAAW,KAAKkU,GAAG,CAAC,SAASlpC,EAAQ6E,EAAOF,GAG/C,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAC/BjF,EAAO1yB,EAAQ,WAqCnB,SAASmpC,EAAmB5V,EAAGuQ,GAC7B,IAAIsF,EAAY,GAqChB,OADAhW,EAAEiF,OAAOyL,GAlCT,SAAoBuF,EAAWpf,GAC7B,IAGEqf,EAAK,EAGLC,EAAU,EACVC,EAAkBH,EAAU7mC,OAC5BinC,EAAWrW,EAAEoK,KAAKvT,GAsBpB,OApBAmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAGhI,GACxB,IAAImyB,EAuEV,SAAmCb,EAAGtpB,GACpC,GAAIspB,EAAEzsB,KAAKmD,GAAG4yB,MACZ,OAAOzJ,EAAE1U,KAAK6U,EAAE8T,aAAap9B,IAAI,SAASmoB,GACxC,OAAOmB,EAAEzsB,KAAKsrB,GAAGyK,SA1ET6M,CAA0BnW,EAAGtpB,GACjC0/B,EAAKvV,EAAIb,EAAEzsB,KAAKstB,GAAGyG,MAAQ2O,GAE3BpV,GAAKnqB,IAAMw/B,KACbrW,EAAEc,KAAKjK,EAAMjpB,MAAMuoC,EAAStnC,EAAG,IAAI,SAAS2nC,GAC1CxW,EAAEc,KAAKX,EAAE8T,aAAauC,IAAW,SAASxX,GACxC,IAAIyX,EAAStW,EAAEzsB,KAAKsrB,GAChB0X,EAAOD,EAAOhP,QACbiP,EAAOR,GAAMK,EAAKG,IACjBD,EAAOhN,OAAStJ,EAAEzsB,KAAK8iC,GAAU/M,OACrCkN,EAAYX,EAAWhX,EAAGwX,SAIhCL,EAAUtnC,EAAI,EACdqnC,EAAKK,MAIF1f,KAIFmf,EAGT,SAASY,EAAmBzW,EAAGuQ,GAC7B,IAAIsF,EAAY,GAEhB,SAASa,EAAKC,EAAO9G,EAAU+G,EAAUC,EAAiBC,GACxD,IAAIpgC,EACJmpB,EAAEc,KAAKd,EAAEgG,MAAMgK,EAAU+G,IAAW,SAASloC,GAC3CgI,EAAIigC,EAAMjoC,GACNsxB,EAAEzsB,KAAKmD,GAAG4yB,OACZzJ,EAAEc,KAAKX,EAAE8T,aAAap9B,IAAI,SAASmoB,GACjC,IAAIkY,EAAQ/W,EAAEzsB,KAAKsrB,GACfkY,EAAMzN,QACLyN,EAAMzP,MAAQuP,GAAmBE,EAAMzP,MAAQwP,IAClDN,EAAYX,EAAWhX,EAAGnoB,SA8BpC,OADAmpB,EAAEiF,OAAOyL,GArBT,SAAoByG,EAAOL,GACzB,IACIM,EADAC,GAAgB,EAEhBrH,EAAW,EAef,OAbAhQ,EAAEc,KAAKgW,GAAO,SAASjgC,EAAGygC,GACxB,GAAwB,WAApBnX,EAAEzsB,KAAKmD,GAAG4yB,MAAoB,CAChC,IAAIwK,EAAe9T,EAAE8T,aAAap9B,GAC9Bo9B,EAAa7kC,SACfgoC,EAAejX,EAAEzsB,KAAKugC,EAAa,IAAIxM,MACvCoP,EAAKC,EAAO9G,EAAUsH,EAAgBD,EAAcD,GACpDpH,EAAWsH,EACXD,EAAeD,GAGnBP,EAAKC,EAAO9G,EAAU8G,EAAM1nC,OAAQgoC,EAAcD,EAAM/nC,WAGnD0nC,KAIFd,EAWT,SAASW,EAAYX,EAAWn/B,EAAGmqB,GACjC,GAAInqB,EAAImqB,EAAG,CACT,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAGN,IAAI4E,EAAavB,EAAUn/B,GACtB0gC,IACHvB,EAAUn/B,GAAK0gC,EAAa,IAE9BA,EAAWvW,IAAK,EAGlB,SAASwW,EAAYxB,EAAWn/B,EAAGmqB,GACjC,GAAInqB,EAAImqB,EAAG,CACT,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,OAAO3S,EAAEa,IAAImV,EAAUn/B,GAAImqB,GAW7B,SAASyW,EAAkBtX,EAAGuQ,EAAUsF,EAAW0B,GACjD,IAAI1yB,EAAO,GACP2yB,EAAQ,GACRt+B,EAAM,GAkCV,OA7BA2mB,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxBmJ,EAAEc,KAAKjK,GAAO,SAAShgB,EAAG4wB,GACxBziB,EAAKnO,GAAKA,EACV8gC,EAAM9gC,GAAKA,EACXwC,EAAIxC,GAAK4wB,QAIbzH,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAI+gB,GAAW,EACf5X,EAAEc,KAAKjK,GAAO,SAAShgB,GACrB,IAAIghC,EAAKH,EAAW7gC,GACpB,GAAIghC,EAAGzoC,OAGL,IADA,IAAI0oC,IADJD,EAAK7X,EAAEoQ,OAAOyH,GAAI,SAAS7W,GAAK,OAAO3nB,EAAI2nB,OAC9B5xB,OAAS,GAAK,EAClBP,EAAIg3B,KAAKkS,MAAMD,GAAKE,EAAKnS,KAAKoS,KAAKH,GAAKjpC,GAAKmpC,IAAMnpC,EAAG,CAC7D,IAAImyB,EAAI6W,EAAGhpC,GACP8oC,EAAM9gC,KAAOA,GACb+gC,EAAUv+B,EAAI2nB,KACbwW,EAAYxB,EAAWn/B,EAAGmqB,KAC7B2W,EAAM3W,GAAKnqB,EACX8gC,EAAM9gC,GAAKmO,EAAKnO,GAAKmO,EAAKgc,GAC1B4W,EAAUv+B,EAAI2nB,WAOjB,CAAEhc,KAAMA,EAAM2yB,MAAOA,GAG9B,SAASO,EAAqB/X,EAAGuQ,EAAU1rB,EAAM2yB,EAAOQ,GAMtD,IAAIC,EAAK,GACLC,EAuCN,SAAyBlY,EAAGuQ,EAAU1rB,EAAMmzB,GAC1C,IAAIG,EAAa,IAAI/T,EACjBsG,EAAa1K,EAAEE,QACfkY,EAqGN,SAAanL,EAASoL,EAASL,GAC7B,OAAO,SAAShY,EAAGtpB,EAAGmqB,GACpB,IAGIzhB,EAHAk5B,EAAStY,EAAEzsB,KAAKmD,GAChB6hC,EAASvY,EAAEzsB,KAAKstB,GAChBmO,EAAM,EAIV,GADAA,GAAOsJ,EAAOvW,MAAQ,EAClBlC,EAAEa,IAAI4X,EAAQ,YAChB,OAAQA,EAAO3P,SAASz0B,eACtB,IAAK,IAAKkL,GAASk5B,EAAOvW,MAAQ,EAAG,MACrC,IAAK,IAAK3iB,EAAQk5B,EAAOvW,MAAQ,EAYrC,GATI3iB,IACF4vB,GAAOgJ,EAAa54B,GAASA,GAE/BA,EAAQ,EAER4vB,IAAQsJ,EAAOhP,MAAQ+O,EAAUpL,GAAW,EAC5C+B,IAAQuJ,EAAOjP,MAAQ+O,EAAUpL,GAAW,EAE5C+B,GAAOuJ,EAAOxW,MAAQ,EAClBlC,EAAEa,IAAI6X,EAAQ,YAChB,OAAQA,EAAO5P,SAASz0B,eACtB,IAAK,IAAKkL,EAAQm5B,EAAOxW,MAAQ,EAAG,MACpC,IAAK,IAAK3iB,GAASm5B,EAAOxW,MAAQ,EAQtC,OALI3iB,IACF4vB,GAAOgJ,EAAa54B,GAASA,GAE/BA,EAAQ,EAED4vB,GAvIGwJ,CAAI9N,EAAWoB,QAASpB,EAAWmB,QAASmM,GAgBxD,OAdAnY,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAImI,EACJgB,EAAEc,KAAKjK,GAAO,SAAShgB,GACrB,IAAI+hC,EAAQ5zB,EAAKnO,GAEjB,GADAyhC,EAAWvT,QAAQ6T,GACf5Z,EAAG,CACL,IAAI6Z,EAAQ7zB,EAAKga,GACb8Z,EAAUR,EAAW/X,KAAKsY,EAAOD,GACrCN,EAAW/W,QAAQsX,EAAOD,EAAO/S,KAAKC,IAAIyS,EAAMpY,EAAGtpB,EAAGmoB,GAAI8Z,GAAW,IAEvE9Z,EAAInoB,QAIDyhC,EA1DMS,CAAgB5Y,EAAGuQ,EAAU1rB,EAAMmzB,GAG5CxX,EAAU,GAgCd,OAtBAX,EAAEc,KAAKuX,EAAOpX,SATd,SAAS+X,EAAMniC,GACRmpB,EAAEa,IAAIF,EAAS9pB,KAClB8pB,EAAQ9pB,IAAK,EACbuhC,EAAGvhC,GAAKmpB,EAAEiF,OAAOoT,EAAOxR,QAAQhwB,IAAI,SAASivB,EAAKt0B,GAEhD,OADAwnC,EAAMxnC,EAAEqF,GACDgvB,KAAKC,IAAIA,EAAKsS,EAAG5mC,EAAEqF,GAAKwhC,EAAO9X,KAAK/uB,MAC1C,OAiBPwuB,EAAEc,KAAKuX,EAAOpX,SAZd,SAASgY,EAAMpiC,GACb,GAAmB,IAAf8pB,EAAQ9pB,GAAU,CACpB8pB,EAAQ9pB,KACR,IAAIs0B,EAAMnL,EAAEiF,OAAOoT,EAAOtX,SAASlqB,IAAI,SAASs0B,EAAK35B,GAEnD,OADAynC,EAAMznC,EAAEwvB,GACD6E,KAAKsF,IAAIA,EAAKiN,EAAG5mC,EAAEwvB,GAAKqX,EAAO9X,KAAK/uB,MAC1Csb,OAAO2d,mBACNU,IAAQre,OAAO2d,oBACjB2N,EAAGvhC,GAAKgvB,KAAKC,IAAIsS,EAAGvhC,GAAIs0B,QAQ9BnL,EAAEc,KAAK6W,GAAO,SAAS9gC,GACrBuhC,EAAGvhC,GAAKuhC,EAAGpzB,EAAKnO,OAGXuhC,EA6BT,SAASc,EAA2B/Y,EAAGgZ,GACrC,OAAOnZ,EAAEmL,IAAIgO,GAAK,SAASf,GACzB,IAAIjN,EAAMnL,EAAEmL,IAAIiN,GAAI,SAASlV,EAAGrsB,GAAK,OAAOqsB,EAAIhB,EAAM/B,EAAGtpB,GAAK,KAE9D,OADUmpB,EAAE8F,IAAIsS,GAAI,SAASlV,EAAGrsB,GAAK,OAAOqsB,EAAIhB,EAAM/B,EAAGtpB,GAAK,KACjDs0B,KAWjB,SAASiO,EAAiBD,EAAKE,GAC7B,IAAIC,EAAatZ,EAAEmL,IAAIkO,GACnBE,EAAavZ,EAAE8F,IAAIuT,GAEvBrZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS0Y,GAC1BxZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS2Y,GAC1B,IAEIl6B,EAFAm6B,EAAYF,EAAOC,EACnBrB,EAAKe,EAAIO,GAETtB,IAAOiB,IAEX95B,EAAkB,MAAVk6B,EAAgBH,EAAatZ,EAAEmL,IAAIiN,GAAMmB,EAAavZ,EAAE8F,IAAIsS,MAGlEe,EAAIO,GAAa1Z,EAAEkM,UAAUkM,GAAI,SAASlV,GAAK,OAAOA,EAAI3jB,YAMlE,SAASo6B,EAAQR,EAAKxB,GACpB,OAAO3X,EAAEkM,UAAUiN,EAAIS,IAAI,SAASC,EAAQhjC,GAC1C,GAAI8gC,EACF,OAAOwB,EAAIxB,EAAMtjC,eAAewC,GAEhC,IAAIuhC,EAAKpY,EAAEoQ,OAAOpQ,EAAE8Z,MAAMX,EAAKtiC,IAC/B,OAAQuhC,EAAG,GAAKA,EAAG,IAAM,KA4E/B,SAASlW,EAAM/B,EAAGtpB,GAChB,OAAOspB,EAAEzsB,KAAKmD,GAAGqrB,MAhYnBzwB,EAAOF,QAAU,CACfwoC,UAuTF,SAAmB5Z,GACjB,IAKI6Z,EALAtJ,EAAWpR,EAAKoF,iBAAiBvE,GACjC6V,EAAYhW,EAAE+H,MAAMgO,EAAmB5V,EAAGuQ,GACtBkG,EAAmBzW,EAAGuQ,IAE1CyI,EAAM,GAEVnZ,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS0Y,GAC1BQ,EAA4B,MAATR,EAAe9I,EAAW1Q,EAAEia,OAAOvJ,GAAU5kB,UAChEkU,EAAEc,KAAK,CAAC,IAAK,MAAM,SAAS2Y,GACZ,MAAVA,IACFO,EAAmBha,EAAE9wB,IAAI8qC,GAAkB,SAASE,GAClD,OAAOla,EAAEia,OAAOC,GAAOpuB,cAI3B,IAAI4rB,EAAa1X,EAAE9nB,KAAc,MAATshC,EAAerZ,EAAE8T,aAAe9T,EAAEoO,WAAYpO,GAClEwX,EAAQF,EAAkBtX,EAAG6Z,EAAkBhE,EAAW0B,GAC1DU,EAAKF,EAAqB/X,EAAG6Z,EACHrC,EAAM3yB,KAAM2yB,EAAMA,MACR,MAAV8B,GAChB,MAAVA,IACFrB,EAAKpY,EAAEkM,UAAUkM,GAAI,SAASlV,GAAK,OAAQA,MAE7CiW,EAAIK,EAAOC,GAASrB,QAIxB,IAAI+B,EAAgBjB,EAA2B/Y,EAAGgZ,GAElD,OADAC,EAAiBD,EAAKgB,GACfR,EAAQR,EAAKhZ,EAAEE,QAAQsX,QApV9B5B,mBAAoBA,EACpBa,mBAAoBA,EACpBD,YAAaA,EACba,YAAaA,EACbC,kBAAmBA,EACnBS,qBAAsBA,EACtBkB,iBAAkBA,EAClBF,2BAA4BA,EAC5BS,QAASA,IAyXT,CAAChK,cAAc,EAAEd,YAAY,GAAGkD,UAAU,KAAKqI,GAAG,CAAC,SAASxtC,EAAQ6E,EAAOF,GAG7E,IAAIyuB,EAAIpzB,EAAQ,aACZ0yB,EAAO1yB,EAAQ,WACfmtC,EAAYntC,EAAQ,QAAQmtC,UAEhCtoC,EAAOF,QAEP,SAAkB4uB,IASlB,SAAmBA,GACjB,IAAIuQ,EAAWpR,EAAKoF,iBAAiBvE,GACjCka,EAAUla,EAAEE,QAAQuI,QACpB0R,EAAQ,EACZta,EAAEc,KAAK4P,GAAU,SAAS7Z,GACxB,IAAI0jB,EAAYva,EAAE8F,IAAI9F,EAAE9wB,IAAI2nB,GAAO,SAAShgB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAG2F,WAClEwjB,EAAEc,KAAKjK,GAAO,SAAShgB,GACrBspB,EAAEzsB,KAAKmD,GAAGmsB,EAAIsX,EAAQC,EAAY,KAEpCD,GAASC,EAAYF,MAfvBG,CAFAra,EAAIb,EAAK6J,mBAAmBhJ,IAG5BH,EAAEc,KAAKiZ,EAAU5Z,IAAI,SAAS+C,EAAGrsB,GAC/BspB,EAAEzsB,KAAKmD,GAAGqsB,EAAIA,OAkBhB,CAAC2L,YAAY,GAAGkD,UAAU,GAAG0I,OAAO,KAAKC,GAAG,CAAC,SAAS9tC,EAAQ6E,EAAOF,GAGvE,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,eAAe23B,MAC/BoW,EAAQ/tC,EAAQ,UAAU+tC,MAmD9B,SAASC,EAAUhhC,EAAGumB,GAcpB,OADAH,EAAEc,KAAKlnB,EAAEqnB,SAZT,SAASL,EAAI/pB,GACXmpB,EAAEc,KAAKX,EAAE0a,UAAUhkC,IAAI,SAASrF,GAC9B,IAAIspC,EAAQtpC,EAAEqF,EACVmqB,EAAKnqB,IAAMikC,EAAStpC,EAAEwvB,EAAI8Z,EACzBlhC,EAAE21B,QAAQvO,IAAO2Z,EAAMxa,EAAG3uB,KAC7BoI,EAAEmrB,QAAQ/D,EAAG,IACbpnB,EAAE2nB,QAAQ1qB,EAAGmqB,EAAG,IAChBJ,EAAII,UAMHpnB,EAAEyrB,YAOX,SAAS0V,EAAiBnhC,EAAGumB,GAC3B,OAAOH,EAAEmL,IAAIhL,EAAEuB,SAAS,SAASlwB,GAC/B,GAAIoI,EAAE21B,QAAQ/9B,EAAEqF,KAAO+C,EAAE21B,QAAQ/9B,EAAEwvB,GACjC,OAAO2Z,EAAMxa,EAAG3uB,MAKtB,SAASwpC,EAAWphC,EAAGumB,EAAG5gB,GACxBygB,EAAEc,KAAKlnB,EAAEqnB,SAAS,SAASpqB,GACzBspB,EAAEzsB,KAAKmD,GAAGorB,MAAQ1iB,KAhFtB9N,EAAOF,QA2BP,SAAsB4uB,GACpB,IAOII,EAAMhhB,EAPN3F,EAAI,IAAI2qB,EAAM,CAAE0W,UAAU,IAG1B7d,EAAQ+C,EAAEc,QAAQ,GAClBia,EAAO/a,EAAEkF,YACbzrB,EAAEmrB,QAAQ3H,EAAO,IAGjB,KAAOwd,EAAUhhC,EAAGumB,GAAK+a,GACvB3a,EAAOwa,EAAiBnhC,EAAGumB,GAC3B5gB,EAAQ3F,EAAE21B,QAAQhP,EAAK1pB,GAAK8jC,EAAMxa,EAAGI,IAASoa,EAAMxa,EAAGI,GACvDya,EAAWphC,EAAGumB,EAAG5gB,GAGnB,OAAO3F,IA0CP,CAAC+1B,cAAc,EAAEd,YAAY,GAAGnM,SAAS,KAAKyY,GAAG,CAAC,SAASvuC,EAAQ6E,EAAOF,GAG5E,IACI6pC,EADWxuC,EAAQ,UACIwuC,YACvBC,EAAezuC,EAAQ,mBACvB0uC,EAAiB1uC,EAAQ,qBAE7B6E,EAAOF,QAqBP,SAAc4uB,GACZ,OAAOA,EAAEE,QAAQkb,QACf,IAAK,kBAAmBC,EAAqBrb,GAAI,MACjD,IAAK,cAST,SAAyBA,GACvBib,EAAYjb,GACZkb,EAAalb,GAXQsb,CAAgBtb,GAAI,MACvC,IAAK,eAAgBub,EAAkBvb,GAAI,MAC3C,QAASqb,EAAqBrb,KAKlC,IAAIub,EAAoBN,EAOxB,SAASI,EAAqBrb,GAC5Bmb,EAAenb,KAGf,CAACwb,kBAAkB,GAAGC,oBAAoB,GAAGlZ,SAAS,KAAKmZ,GAAG,CAAC,SAASjvC,EAAQ6E,EAAOF,GAGzF,IAAIyuB,EAAIpzB,EAAQ,aACZyuC,EAAezuC,EAAQ,mBACvB+tC,EAAQ/tC,EAAQ,UAAU+tC,MAC1BmB,EAAWlvC,EAAQ,UAAUwuC,YAC7BW,EAAWnvC,EAAQ,eAAeovC,IAAID,SACtC3G,EAAYxoC,EAAQ,eAAeovC,IAAI5G,UACvC6G,EAAWrvC,EAAQ,WAAWqvC,SA6ClC,SAASX,EAAenb,GACtBA,EAAI8b,EAAS9b,GACb2b,EAAS3b,GACT,IAII3uB,EAJAoI,EAAIyhC,EAAalb,GAKrB,IAJA+b,EAAiBtiC,GACjBuiC,EAAcviC,EAAGumB,GAGT3uB,EAAI4qC,EAAUxiC,IAEpByiC,EAAcziC,EAAGumB,EAAG3uB,EADhB8qC,EAAU1iC,EAAGumB,EAAG3uB,IAQxB,SAAS2qC,EAAcviC,EAAGumB,GACxB,IAAIuO,EAAK0G,EAAUx7B,EAAGA,EAAEqnB,SACxByN,EAAKA,EAAG9gC,MAAM,EAAG8gC,EAAGt/B,OAAS,GAC7B4wB,EAAEc,KAAK4N,GAAI,SAAS73B,IAKtB,SAAwB+C,EAAGumB,EAAG+M,GAC5B,IACI9pB,EADWxJ,EAAElG,KAAKw5B,GACA9pB,OACtBxJ,EAAE2mB,KAAK2M,EAAO9pB,GAAQm5B,SAAWC,EAAa5iC,EAAGumB,EAAG+M,GAPlDuP,CAAe7iC,EAAGumB,EAAGtpB,MAczB,SAAS2lC,EAAa5iC,EAAGumB,EAAG+M,GAC1B,IACI9pB,EADWxJ,EAAElG,KAAKw5B,GACA9pB,OAElBs5B,GAAc,EAEdC,EAAYxc,EAAEI,KAAK2M,EAAO9pB,GAE1Bw5B,EAAW,EAyBf,OAvBKD,IACHD,GAAc,EACdC,EAAYxc,EAAEI,KAAKnd,EAAQ8pB,IAG7B0P,EAAWD,EAAUnc,OAErBR,EAAEc,KAAKX,EAAE0a,UAAU3N,IAAQ,SAAS17B,GAClC,IAqHsBwtB,EAAGnoB,EArHrBgmC,EAAYrrC,EAAEqF,IAAMq2B,EACpB6G,EAAQ8I,EAAYrrC,EAAEwvB,EAAIxvB,EAAEqF,EAEhC,GAAIk9B,IAAU3wB,EAAQ,CACpB,IAAI05B,EAAeD,IAAcH,EAC7BK,EAAc5c,EAAEI,KAAK/uB,GAAGgvB,OAG5B,GADAoc,GAAYE,EAAeC,GAAeA,EA8GtB/d,EA7GFkO,EA6GKr2B,EA7GEk9B,EAAVn6B,EA8GPojC,QAAQhe,EAAGnoB,GA9Gc,CAC/B,IAAIomC,EAAgBrjC,EAAE2mB,KAAK2M,EAAO6G,GAAOwI,SACzCK,GAAYE,GAAgBG,EAAgBA,OAK3CL,EAGT,SAASV,EAAiB3L,EAAMvrB,GAC1BhV,UAAUZ,OAAS,IACrB4V,EAAOurB,EAAKtP,QAAQ,IAEtBic,EAAgB3M,EAAM,GAAI,EAAGvrB,GAG/B,SAASk4B,EAAgB3M,EAAM5P,EAASwc,EAAStmC,EAAGuM,GAClD,IAAI+xB,EAAMgI,EACNhc,EAAQoP,EAAK78B,KAAKmD,GAkBtB,OAhBA8pB,EAAQ9pB,IAAK,EACbmpB,EAAEc,KAAKyP,EAAK6M,UAAUvmC,IAAI,SAASmqB,GAC5BhB,EAAEa,IAAIF,EAASK,KAClBmc,EAAUD,EAAgB3M,EAAM5P,EAASwc,EAASnc,EAAGnqB,OAIzDsqB,EAAMgU,IAAMA,EACZhU,EAAM+T,IAAMiI,IACR/5B,EACF+d,EAAM/d,OAASA,SAGR+d,EAAM/d,OAGR+5B,EAGT,SAASf,EAAU7L,GACjB,OAAOvQ,EAAE1U,KAAKilB,EAAK7O,SAAS,SAASlwB,GACnC,OAAO++B,EAAKhQ,KAAK/uB,GAAG+qC,SAAW,KAInC,SAASD,EAAU1iC,EAAGumB,EAAGI,GACvB,IAAI1pB,EAAI0pB,EAAK1pB,EACTmqB,EAAIT,EAAKS,EAKRb,EAAE6c,QAAQnmC,EAAGmqB,KAChBnqB,EAAI0pB,EAAKS,EACTA,EAAIT,EAAK1pB,GAGX,IAAI4hC,EAAS7+B,EAAElG,KAAKmD,GAChB6hC,EAAS9+B,EAAElG,KAAKstB,GAChBqc,EAAY5E,EACZ6E,GAAO,EAIP7E,EAAOvD,IAAMwD,EAAOxD,MACtBmI,EAAY3E,EACZ4E,GAAO,GAGT,IAAIC,EAAavd,EAAE/T,OAAOkU,EAAEuB,SAAS,SAASnB,GAC5C,OAAO+c,IAASE,EAAa5jC,EAAGA,EAAElG,KAAK6sB,EAAK1pB,GAAIwmC,IACzCC,IAASE,EAAa5jC,EAAGA,EAAElG,KAAK6sB,EAAKS,GAAIqc,MAGlD,OAAOrd,EAAEmL,IAAIoS,GAAY,SAAShd,GAAQ,OAAOoa,EAAMxa,EAAGI,MAG5D,SAAS8b,EAAcziC,EAAGumB,EAAG3uB,EAAGL,GAC9B,IAAI0F,EAAIrF,EAAEqF,EACNmqB,EAAIxvB,EAAEwvB,EACVpnB,EAAEwnB,WAAWvqB,EAAGmqB,GAChBpnB,EAAE2nB,QAAQpwB,EAAE0F,EAAG1F,EAAE6vB,EAAG,IACpBkb,EAAiBtiC,GACjBuiC,EAAcviC,EAAGumB,GAInB,SAAqBvmB,EAAGumB,GACtB,IAAInb,EAAOgb,EAAE1U,KAAK1R,EAAEqnB,SAAS,SAASpqB,GAAK,OAAQspB,EAAEzsB,KAAKmD,GAAGuM,UACzDsrB,EAAKqN,EAASniC,EAAGoL,GACrB0pB,EAAKA,EAAG9gC,MAAM,GACdoyB,EAAEc,KAAK4N,GAAI,SAAS73B,GAClB,IAAIuM,EAASxJ,EAAElG,KAAKmD,GAAGuM,OACnBmd,EAAOJ,EAAEI,KAAK1pB,EAAGuM,GACjBq6B,GAAU,EAETld,IACHA,EAAOJ,EAAEI,KAAKnd,EAAQvM,GACtB4mC,GAAU,GAGZtd,EAAEzsB,KAAKmD,GAAGorB,KAAO9B,EAAEzsB,KAAK0P,GAAQ6e,MAAQwb,EAAUld,EAAKsI,QAAUtI,EAAKsI,WAjBxE6U,CAAY9jC,EAAGumB,GAgCjB,SAASqd,EAAajN,EAAMkI,EAAQkF,GAClC,OAAOA,EAAUxI,KAAOsD,EAAOvD,KAAOuD,EAAOvD,KAAOyI,EAAUzI,IA9NhEzjC,EAAOF,QAAU+pC,EAGjBA,EAAeY,iBAAmBA,EAClCZ,EAAea,cAAgBA,EAC/Bb,EAAekB,aAAeA,EAC9BlB,EAAec,UAAYA,EAC3Bd,EAAegB,UAAYA,EAC3BhB,EAAee,cAAgBA,GAyN7B,CAAC1M,cAAc,EAAEd,YAAY,GAAGkD,UAAU,GAAG4J,kBAAkB,GAAGjZ,SAAS,KAAKkb,GAAG,CAAC,SAAShxC,EAAQ6E,EAAOF,GAG9G,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAAU,CACf6pC,YAyBF,SAAqBjb,GACnB,IAAIQ,EAAU,GAoBdX,EAAEc,KAAKX,EAAEmG,WAlBT,SAAS1F,EAAI/pB,GACX,IAAIsqB,EAAQhB,EAAEzsB,KAAKmD,GACnB,GAAImpB,EAAEa,IAAIF,EAAS9pB,GACjB,OAAOsqB,EAAMc,KAEftB,EAAQ9pB,IAAK,EAEb,IAAIorB,EAAOjC,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEY,SAASlqB,IAAI,SAASrF,GAC7C,OAAOovB,EAAIpvB,EAAEwvB,GAAKb,EAAEI,KAAK/uB,GAAGq3B,WAO9B,OAJI5G,IAASnV,OAAO2d,oBAClBxI,EAAO,GAGDd,EAAMc,KAAOA,MA1CvB0Y,MAoDF,SAAexa,EAAG3uB,GAChB,OAAO2uB,EAAEzsB,KAAKlC,EAAEwvB,GAAGiB,KAAO9B,EAAEzsB,KAAKlC,EAAEqF,GAAGorB,KAAO9B,EAAEI,KAAK/uB,GAAGq3B,UAGvD,CAACgG,YAAY,KAAKgP,GAAG,CAAC,SAASjxC,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,cAAc23B,MAsBlC,SAASnC,EAAajC,EAAGjqB,EAAM4sB,EAAO30B,GACpC,IAAI0I,EACJ,GACEA,EAAImpB,EAAEwB,SAASrzB,SACRgyB,EAAEoP,QAAQ14B,IAInB,OAFAisB,EAAM2G,MAAQvzB,EACdiqB,EAAE4E,QAAQluB,EAAGisB,GACNjsB,EAiKT,SAAS4rB,EAAQtC,GACf,OAAOH,EAAE8F,IAAI9F,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACrC,IAAIorB,EAAO9B,EAAEzsB,KAAKmD,GAAGorB,KACrB,IAAKjC,EAAE0P,YAAYzN,GACjB,OAAOA,MAjMbxwB,EAAOF,QAAU,CACf6wB,aAAcA,EACd6Z,SAiCF,SAAkB9b,GAChB,IAAI2d,GAAa,IAAIvZ,GAAQO,SAAS3E,EAAEE,SAUxC,OATAL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GAAKinC,EAAW/Y,QAAQluB,EAAGspB,EAAEzsB,KAAKmD,OAC7DmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzB,IAAIusC,EAAcD,EAAWvd,KAAK/uB,EAAEqF,EAAGrF,EAAEwvB,IAAM,CAAER,OAAQ,EAAGqI,OAAQ,GAChE1H,EAAQhB,EAAEI,KAAK/uB,GACnBssC,EAAWvc,QAAQ/vB,EAAEqF,EAAGrF,EAAEwvB,EAAG,CAC3BR,OAAQud,EAAYvd,OAASW,EAAMX,OACnCqI,OAAQhD,KAAKC,IAAIiY,EAAYlV,OAAQ1H,EAAM0H,aAGxCiV,GA3CP3U,mBA8CF,SAA4BhJ,GAC1B,IAAI2d,EAAa,IAAIvZ,EAAM,CAAEM,WAAY1E,EAAE6d,iBAAkBlZ,SAAS3E,EAAEE,SASxE,OARAL,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACpBspB,EAAE7nB,SAASzB,GAAGzH,QACjB0uC,EAAW/Y,QAAQluB,EAAGspB,EAAEzsB,KAAKmD,OAGjCmpB,EAAEc,KAAKX,EAAEuB,SAAS,SAASlwB,GACzBssC,EAAWvc,QAAQ/vB,EAAG2uB,EAAEI,KAAK/uB,OAExBssC,GAvDPG,iBA0DF,SAA0B9d,GACxB,IAAI+d,EAAYle,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACxC,IAAIsnC,EAAO,GAIX,OAHAne,EAAEc,KAAKX,EAAEY,SAASlqB,IAAI,SAASrF,GAC7B2sC,EAAK3sC,EAAEwvB,IAAMmd,EAAK3sC,EAAEwvB,IAAM,GAAKb,EAAEI,KAAK/uB,GAAGgvB,UAEpC2d,KAET,OAAOne,EAAEiQ,UAAU9P,EAAEc,QAASid,IAjE9BE,mBAoEF,SAA4Bje,GAC1B,IAAI+d,EAAYle,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GACxC,IAAIwnC,EAAQ,GAIZ,OAHAre,EAAEc,KAAKX,EAAE0G,QAAQhwB,IAAI,SAASrF,GAC5B6sC,EAAM7sC,EAAEqF,IAAMwnC,EAAM7sC,EAAEqF,IAAM,GAAKspB,EAAEI,KAAK/uB,GAAGgvB,UAEtC6d,KAET,OAAOre,EAAEiQ,UAAU9P,EAAEc,QAASid,IA3E9BzS,cAkFF,SAAuB6S,EAAMC,GAC3B,IAcIC,EAAIC,EAdJvb,EAAIob,EAAKpb,EACTF,EAAIsb,EAAKtb,EAITiH,EAAKsU,EAAMrb,EAAIA,EACfgH,EAAKqU,EAAMvb,EAAIA,EACfhC,EAAIsd,EAAKpc,MAAQ,EACjByC,EAAI2Z,EAAK9hC,OAAS,EAEtB,IAAKytB,IAAOC,EACV,MAAM,IAAI35B,MAAM,6DAIds1B,KAAKwE,IAAIH,GAAMlJ,EAAI6E,KAAKwE,IAAIJ,GAAMtF,GAEhCuF,EAAK,IACPvF,GAAKA,GAEP6Z,EAAK7Z,EAAIsF,EAAKC,EACduU,EAAK9Z,IAGDsF,EAAK,IACPjJ,GAAKA,GAEPwd,EAAKxd,EACLyd,EAAKzd,EAAIkJ,EAAKD,GAGhB,MAAO,CAAE/G,EAAGA,EAAIsb,EAAIxb,EAAGA,EAAIyb,IAjH3B/Z,iBAwHF,SAA0BvE,GACxB,IAAIuQ,EAAW1Q,EAAE9wB,IAAI8wB,EAAEgG,MAAMvD,EAAQtC,GAAK,IAAI,WAAa,MAAO,MAQlE,OAPAH,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdorB,EAAOvuB,EAAKuuB,KACXjC,EAAE0P,YAAYzN,KACjByO,EAASzO,GAAMvuB,EAAK+zB,OAAS5wB,MAG1B65B,GAhIPvJ,eAuIF,SAAwBhH,GACtB,IAAIgL,EAAMnL,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAChEjC,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAInD,EAAOysB,EAAEzsB,KAAKmD,GACdmpB,EAAEa,IAAIntB,EAAM,UACdA,EAAKuuB,MAAQkJ,OA3IjB9D,iBAgJF,SAA0BlH,GAExB,IAAI7kB,EAAS0kB,EAAEmL,IAAInL,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAAK,OAAOspB,EAAEzsB,KAAKmD,GAAGorB,SAE/D2H,EAAS,GACb5J,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzB,IAAIorB,EAAO9B,EAAEzsB,KAAKmD,GAAGorB,KAAO3mB,EACvB0kB,EAAEa,IAAI+I,EAAQ3H,KACjB2H,EAAO3H,GAAQ,IAEjB2H,EAAO3H,GAAMhyB,KAAK4G,MAGpB,IAAI0I,EAAQ,EACRuuB,EAAiB3N,EAAEE,QAAQyN,eAC/B9N,EAAEc,KAAK8I,GAAQ,SAAS8E,EAAI7/B,GACtBmxB,EAAE0P,YAAYhB,IAAO7/B,EAAIi/B,GAAmB,IAC5CvuB,EACOA,GACTygB,EAAEc,KAAK4N,GAAI,SAAS73B,GAAKspB,EAAEzsB,KAAKmD,GAAGorB,MAAQ1iB,SAlK/CuiB,cAuKF,SAAuB3B,EAAG1vB,EAAQwxB,EAAMwF,GACtC,IAAI/zB,EAAO,CACTwuB,MAAO,EACP1lB,OAAQ,GAENxM,UAAUZ,QAAU,IACtBsE,EAAKuuB,KAAOA,EACZvuB,EAAK+zB,MAAQA,GAEf,OAAOrF,EAAajC,EAAG,SAAUzsB,EAAMjD,IA/KvCgyB,QAASA,EACTiS,UA+LF,SAAmBgK,EAAYC,GAC7B,IAAI1P,EAAS,CAAE2F,IAAK,GAAIC,IAAK,IAQ7B,OAPA7U,EAAEc,KAAK4d,GAAY,SAASruC,GACtBsuC,EAAGtuC,GACL4+B,EAAO2F,IAAI3kC,KAAKI,GAEhB4+B,EAAO4F,IAAI5kC,KAAKI,MAGb4+B,GAvMP1P,KA8MF,SAAcpxB,EAAMwwC,GAClB,IAAIvhB,EAAQ4C,EAAE4e,MACd,IACE,OAAOD,IACP,QACAtoC,QAAQJ,IAAI9H,EAAO,WAAa6xB,EAAE4e,MAAQxhB,GAAS,QAlNrDoC,OAsNF,SAAgBrxB,EAAMwwC,GACpB,OAAOA,OAGP,CAACzZ,aAAa,EAAEtD,WAAW,KAAKid,GAAG,CAAC,SAASjyC,EAAQ6E,EAAOF,GAC9DE,EAAOF,QAAU,SAEf,IAAIutC,GAAG,CAAC,SAASlyC,EAAQ6E,EAAOF,GA+BlC,IAAIwtC,EAAMnyC,EAAQ,SAElB6E,EAAOF,QAAU,CACfgzB,MAAOwa,EAAIxa,MACX9e,KAAM7Y,EAAQ,cACdovC,IAAKpvC,EAAQ,aACb6yB,QAASsf,EAAItf,UAGb,CAACuf,QAAQ,GAAGC,YAAY,GAAGC,aAAa,KAAKC,GAAG,CAAC,SAASvyC,EAAQ6E,EAAOF,GAC3E,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAoB4uB,GAClB,IAEIif,EAFAze,EAAU,GACV0e,EAAQ,GAGZ,SAASze,EAAI/pB,GACPmpB,EAAEa,IAAIF,EAAS9pB,KACnB8pB,EAAQ9pB,IAAK,EACbuoC,EAAKnvC,KAAK4G,GACVmpB,EAAEc,KAAKX,EAAEoO,WAAW13B,GAAI+pB,GACxBZ,EAAEc,KAAKX,EAAE8T,aAAap9B,GAAI+pB,IAW5B,OARAZ,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzBuoC,EAAO,GACPxe,EAAI/pB,GACAuoC,EAAKhwC,QACPiwC,EAAMpvC,KAAKmvC,MAIRC,IAGP,CAACxQ,YAAY,KAAKyQ,GAAG,CAAC,SAAS1yC,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QASP,SAAa4uB,EAAGuO,EAAIjH,GACbzH,EAAEuf,QAAQ7Q,KACbA,EAAK,CAACA,IAGR,IAAIpB,EAAM,GACN3M,EAAU,GAQd,OAPAX,EAAEc,KAAK4N,GAAI,SAAS73B,GAClB,IAAKspB,EAAEoP,QAAQ14B,GACb,MAAM,IAAItG,MAAM,6BAA+BsG,IAQrD,SAAS2oC,EAAMrf,EAAGtpB,EAAGu+B,EAAWzU,EAAS2M,GAClCtN,EAAEa,IAAIF,EAAS9pB,KAClB8pB,EAAQ9pB,IAAK,EAERu+B,GAAa9H,EAAIr9B,KAAK4G,GAC3BmpB,EAAEc,KAAKX,EAAEid,UAAUvmC,IAAI,SAASmqB,GAC9Bwe,EAAMrf,EAAGa,EAAGoU,EAAWzU,EAAS2M,MAE9B8H,GAAa9H,EAAIr9B,KAAK4G,IAb1B2oC,CAAMrf,EAAGtpB,EAAa,SAAV4wB,EAAkB9G,EAAS2M,MAElCA,IAeP,CAACuB,YAAY,KAAK4Q,GAAG,CAAC,SAAS7yC,EAAQ6E,EAAOF,GAChD,IAAImuC,EAAW9yC,EAAQ,cACnBozB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAqB4uB,EAAGwf,EAAYC,GAClC,OAAO5f,EAAE6f,UAAU1f,EAAEc,SAAS,SAASqM,EAAKz2B,GAC1Cy2B,EAAIz2B,GAAK6oC,EAASvf,EAAGtpB,EAAG8oC,EAAYC,KACnC,MAGH,CAAC/Q,YAAY,GAAGiR,aAAa,KAAKC,GAAG,CAAC,SAASnzC,EAAQ6E,EAAOF,GAChE,IAAIyuB,EAAIpzB,EAAQ,aACZozC,EAAgBpzC,EAAQ,0BAE5B6E,EAAOF,QAIP,SAAkB4uB,EAAGgT,EAAQ1S,EAAUwf,GACrC,OAKF,SAAqB9f,EAAGgT,EAAQ1S,EAAUwf,GACxC,IAEIppC,EAAGo8B,EAFH5M,EAAU,GACV6Z,EAAK,IAAIF,EAGTG,EAAkB,SAAS5f,GAC7B,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAK1pB,EAAI0pB,EAAKS,EACjC+F,EAASV,EAAQrF,GACjBR,EAASC,EAASF,GAClBpH,EAAW8Z,EAAO9Z,SAAWqH,EAEjC,GAAIA,EAAS,EACX,MAAM,IAAIjwB,MAAM,4DACegwB,EAAO,YAAcC,GAGlDrH,EAAW4N,EAAO5N,WACpB4N,EAAO5N,SAAWA,EAClB4N,EAAOqZ,YAAcvpC,EACrBqpC,EAAGG,SAASrf,EAAG7H,KAInBgH,EAAEc,QAAQ1nB,SAAQ,SAAS1C,GACzB,IAAIsiB,EAAWtiB,IAAMs8B,EAAS,EAAIrmB,OAAO2d,kBACzCpE,EAAQxvB,GAAK,CAAEsiB,SAAUA,GACzB+mB,EAAGrrC,IAAIgC,EAAGsiB,MAGZ,KAAO+mB,EAAGhF,OAAS,IACjBrkC,EAAIqpC,EAAGI,aACPrN,EAAS5M,EAAQxvB,IACNsiB,WAAarM,OAAO2d,oBAI/BwV,EAAOppC,GAAG0C,QAAQ4mC,GAGpB,OAAO9Z,EA5CAka,CAAYpgB,EAAGhtB,OAAOggC,GACV1S,GAAY+f,EACZP,GAAU,SAASppC,GAAK,OAAOspB,EAAEY,SAASlqB,MAL/D,IAAI2pC,EAAsBxgB,EAAE2G,SAAS,IAkDnC,CAAC8Z,yBAAyB,GAAG5R,YAAY,KAAK6R,GAAG,CAAC,SAAS9zC,EAAQ6E,EAAOF,GAC5E,IAAIyuB,EAAIpzB,EAAQ,aACZ+zC,EAAS/zC,EAAQ,YAErB6E,EAAOF,QAEP,SAAoB4uB,GAClB,OAAOH,EAAE/T,OAAO00B,EAAOxgB,IAAI,SAASif,GAAQ,OAAOA,EAAKhwC,OAAS,OAGjE,CAACy/B,YAAY,GAAG+R,WAAW,KAAKC,GAAG,CAAC,SAASj0C,EAAQ6E,EAAOF,GAC9D,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAIP,SAAuB4uB,EAAGM,EAAUwf,GAClC,OAKF,SAA0B9f,EAAGM,EAAUwf,GACrC,IAAI5Z,EAAU,GACVpF,EAAQd,EAAEc,QAkCd,OAhCAA,EAAM1nB,SAAQ,SAAS1C,GACrBwvB,EAAQxvB,GAAK,GACbwvB,EAAQxvB,GAAGA,GAAK,CAAEsiB,SAAU,GAC5B8H,EAAM1nB,SAAQ,SAASynB,GACjBnqB,IAAMmqB,IACRqF,EAAQxvB,GAAGmqB,GAAK,CAAE7H,SAAUrM,OAAO2d,uBAGvCwV,EAAOppC,GAAG0C,SAAQ,SAASgnB,GACzB,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAKS,EAAIT,EAAK1pB,EACjCqW,EAAIuT,EAASF,GACjB8F,EAAQxvB,GAAGmqB,GAAK,CAAE7H,SAAUjM,EAAGkzB,YAAavpC,SAIhDoqB,EAAM1nB,SAAQ,SAASwP,GACrB,IAAI+3B,EAAOza,EAAQtd,GACnBkY,EAAM1nB,SAAQ,SAAS1K,GACrB,IAAIkyC,EAAO1a,EAAQx3B,GACnBoyB,EAAM1nB,SAAQ,SAASzK,GACrB,IAAIkyC,EAAKD,EAAKh4B,GACVk4B,EAAKH,EAAKhyC,GACVoyC,EAAKH,EAAKjyC,GACVqyC,EAAcH,EAAG7nB,SAAW8nB,EAAG9nB,SAC/BgoB,EAAcD,EAAG/nB,WACnB+nB,EAAG/nB,SAAWgoB,EACdD,EAAGd,YAAca,EAAGb,sBAMrB/Z,EAzCA+a,CAAiBjhB,EACAM,GAAY+f,EACZP,GAAU,SAASppC,GAAK,OAAOspB,EAAEY,SAASlqB,MALpE,IAAI2pC,EAAsBxgB,EAAE2G,SAAS,IA+CnC,CAACkI,YAAY,KAAKwS,GAAG,CAAC,SAASz0C,EAAQ6E,EAAOF,GAChDE,EAAOF,QAAU,CACf+vC,WAAY10C,EAAQ,gBACpB8yC,SAAU9yC,EAAQ,cAClB20C,YAAa30C,EAAQ,kBACrB40C,WAAY50C,EAAQ,iBACpB60C,cAAe70C,EAAQ,oBACvB80C,UAAW90C,EAAQ,gBACnBwoC,UAAWxoC,EAAQ,eACnBmvC,SAAUnvC,EAAQ,cAClB+0C,KAAM/0C,EAAQ,UACd+zC,OAAQ/zC,EAAQ,YAChBg1C,QAASh1C,EAAQ,eAGjB,CAACi1C,eAAe,GAAG/B,aAAa,GAAGgC,iBAAiB,GAAGC,gBAAgB,GAAGC,mBAAmB,GAAGC,eAAe,GAAGC,cAAc,GAAGC,aAAa,GAAGC,SAAS,GAAGxB,WAAW,GAAGyB,YAAY,KAAKC,GAAG,CAAC,SAAS11C,EAAQ6E,EAAOF,GAC5N,IAAIqwC,EAAUh1C,EAAQ,aAEtB6E,EAAOF,QAEP,SAAmB4uB,GACjB,IACEyhB,EAAQzhB,GACR,MAAO3uB,GACP,GAAIA,aAAaowC,EAAQW,eACvB,OAAO,EAET,MAAM/wC,EAER,OAAO,IAGP,CAAC6wC,YAAY,KAAKG,GAAG,CAAC,SAAS51C,EAAQ6E,EAAOF,GAChD,IAAIqvB,EAAMh0B,EAAQ,SAElB6E,EAAOF,QAEP,SAAmB4uB,EAAGuO,GACpB,OAAO9N,EAAIT,EAAGuO,EAAI,UAGlB,CAAC+T,QAAQ,KAAKC,GAAG,CAAC,SAAS91C,EAAQ6E,EAAOF,GAC5C,IAAIqvB,EAAMh0B,EAAQ,SAElB6E,EAAOF,QAEP,SAAkB4uB,EAAGuO,GACnB,OAAO9N,EAAIT,EAAGuO,EAAI,SAGlB,CAAC+T,QAAQ,KAAKE,GAAG,CAAC,SAAS/1C,EAAQ6E,EAAOF,GAC5C,IAAIyuB,EAAIpzB,EAAQ,aACZ23B,EAAQ33B,EAAQ,YAChBozC,EAAgBpzC,EAAQ,0BAE5B6E,EAAOF,QAEP,SAAc4uB,EAAGwf,GACf,IAGI9oC,EAHAo4B,EAAS,IAAI1K,EACbqe,EAAU,GACV1C,EAAK,IAAIF,EAGb,SAASG,EAAgB5f,GACvB,IAAIS,EAAIT,EAAK1pB,IAAMA,EAAI0pB,EAAKS,EAAIT,EAAK1pB,EACjCgsC,EAAM3C,EAAG4C,SAAS9hB,GACtB,QAAY7uB,IAAR0wC,EAAmB,CACrB,IAAIjd,EAAa+Z,EAAWpf,GACxBqF,EAAaid,IACfD,EAAQ5hB,GAAKnqB,EACbqpC,EAAGG,SAASrf,EAAG4E,KAKrB,GAAsB,IAAlBzF,EAAEkF,YACJ,OAAO4J,EAGTjP,EAAEc,KAAKX,EAAEc,SAAS,SAASpqB,GACzBqpC,EAAGrrC,IAAIgC,EAAGiW,OAAO2d,mBACjBwE,EAAOlK,QAAQluB,MAIjBqpC,EAAGG,SAASlgB,EAAEc,QAAQ,GAAI,GAE1B,IAAI9jB,GAAO,EACX,KAAO+iC,EAAGhF,OAAS,GAAG,CAEpB,GADArkC,EAAIqpC,EAAGI,YACHtgB,EAAEa,IAAI+hB,EAAS/rC,GACjBo4B,EAAO1N,QAAQ1qB,EAAG+rC,EAAQ/rC,QACrB,CAAA,GAAIsG,EACT,MAAM,IAAI5M,MAAM,iCAAmC4vB,GAEnDhjB,GAAO,EAGTgjB,EAAE0a,UAAUhkC,GAAG0C,QAAQ4mC,GAGzB,OAAOlR,IAGP,CAACwR,yBAAyB,GAAGsC,WAAW,GAAGlU,YAAY,KAAKmU,GAAG,CAAC,SAASp2C,EAAQ6E,EAAOF,GAC1F,IAAIyuB,EAAIpzB,EAAQ,aAEhB6E,EAAOF,QAEP,SAAgB4uB,GACd,IAAIzvB,EAAQ,EACRgwB,EAAQ,GACRC,EAAU,GACV0F,EAAU,GAqCd,OANAlG,EAAEc,QAAQ1nB,SAAQ,SAAS1C,GACpBmpB,EAAEa,IAAIF,EAAS9pB,IA9BtB,SAAS+pB,EAAI/pB,GACX,IAAIktB,EAAQpD,EAAQ9pB,GAAK,CACvBosC,SAAS,EACTC,QAASxyC,EACTA,MAAOA,KAaT,GAXAgwB,EAAMzwB,KAAK4G,GAEXspB,EAAEoO,WAAW13B,GAAG0C,SAAQ,SAASynB,GAC1BhB,EAAEa,IAAIF,EAASK,GAGTL,EAAQK,GAAGiiB,UACpBlf,EAAMmf,QAAUrd,KAAKsF,IAAIpH,EAAMmf,QAASviB,EAAQK,GAAGtwB,SAHnDkwB,EAAII,GACJ+C,EAAMmf,QAAUrd,KAAKsF,IAAIpH,EAAMmf,QAASviB,EAAQK,GAAGkiB,aAMnDnf,EAAMmf,UAAYnf,EAAMrzB,MAAO,CACjC,IACIswB,EADAoe,EAAO,GAEX,GACEpe,EAAIN,EAAM4S,MACV3S,EAAQK,GAAGiiB,SAAU,EACrB7D,EAAKnvC,KAAK+wB,SACHnqB,IAAMmqB,GACfqF,EAAQp2B,KAAKmvC,IAMbxe,CAAI/pB,MAIDwvB,IAGP,CAACwI,YAAY,KAAKsU,GAAG,CAAC,SAASv2C,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAKhB,SAASg1C,EAAQzhB,GACf,IAAIQ,EAAU,GACVD,EAAQ,GACR2F,EAAU,GAkBd,GAFArG,EAAEc,KAAKX,EAAEoG,SAdT,SAAS6c,EAAM1vC,GACb,GAAIssB,EAAEa,IAAIH,EAAOhtB,GACf,MAAM,IAAI6uC,EAGPviB,EAAEa,IAAIF,EAASjtB,KAClBgtB,EAAMhtB,IAAQ,EACditB,EAAQjtB,IAAQ,EAChBssB,EAAEc,KAAKX,EAAE8T,aAAavgC,GAAO0vC,UACtB1iB,EAAMhtB,GACb2yB,EAAQp2B,KAAKyD,OAMbssB,EAAEkb,KAAKva,KAAaR,EAAEkF,YACxB,MAAM,IAAIkd,EAGZ,OAAOlc,EAGT,SAASkc,KA/BT9wC,EAAOF,QAAUqwC,EACjBA,EAAQW,eAAiBA,GAgCvB,CAAC1T,YAAY,KAAKwU,GAAG,CAAC,SAASz2C,EAAQ6E,EAAOF,GAChD,IAAIyuB,EAAIpzB,EAAQ,aAWhB,SAASozC,IACPltC,KAAKwwC,KAAO,GACZxwC,KAAKywC,YAAc,GAXrB9xC,EAAOF,QAAUyuC,EAiBjBA,EAAcvyC,UAAUytC,KAAO,WAC7B,OAAOpoC,KAAKwwC,KAAKl0C,QAMnB4wC,EAAcvyC,UAAUof,KAAO,WAC7B,OAAO/Z,KAAKwwC,KAAKp0C,KAAI,SAASg0B,GAAK,OAAOA,EAAEpa,QAM9Ck3B,EAAcvyC,UAAUozB,IAAM,SAAS/X,GACrC,OAAOkX,EAAEa,IAAI/tB,KAAKywC,YAAaz6B,IASjCk3B,EAAcvyC,UAAUq1C,SAAW,SAASh6B,GAC1C,IAAIpY,EAAQoC,KAAKywC,YAAYz6B,GAC7B,QAAc3W,IAAVzB,EACF,OAAOoC,KAAKwwC,KAAK5yC,GAAOoyC,UAQ5B9C,EAAcvyC,UAAU09B,IAAM,WAC5B,GAAoB,IAAhBr4B,KAAKooC,OACP,MAAM,IAAI3qC,MAAM,mBAElB,OAAOuC,KAAKwwC,KAAK,GAAGx6B,KAWtBk3B,EAAcvyC,UAAUoH,IAAM,SAASiU,EAAKg6B,GAC1C,IAAIU,EAAa1wC,KAAKywC,YAEtB,GADAz6B,EAAM3V,OAAO2V,IACRkX,EAAEa,IAAI2iB,EAAY16B,GAAM,CAC3B,IAAIkQ,EAAMlmB,KAAKwwC,KACX5yC,EAAQsoB,EAAI5pB,OAIhB,OAHAo0C,EAAW16B,GAAOpY,EAClBsoB,EAAI/oB,KAAK,CAAC6Y,IAAKA,EAAKg6B,SAAUA,IAC9BhwC,KAAK2wC,UAAU/yC,IACR,EAET,OAAO,GAMTsvC,EAAcvyC,UAAU6yC,UAAY,WAClCxtC,KAAK4wC,MAAM,EAAG5wC,KAAKwwC,KAAKl0C,OAAS,GACjC,IAAI+7B,EAAMr4B,KAAKwwC,KAAKhQ,MAGpB,cAFOxgC,KAAKywC,YAAYpY,EAAIriB,KAC5BhW,KAAK6wC,SAAS,GACPxY,EAAIriB,KAUbk3B,EAAcvyC,UAAU4yC,SAAW,SAASv3B,EAAKg6B,GAC/C,IAAIpyC,EAAQoC,KAAKywC,YAAYz6B,GAC7B,GAAIg6B,EAAWhwC,KAAKwwC,KAAK5yC,GAAOoyC,SAC9B,MAAM,IAAIvyC,MAAM,uDACFuY,EAAM,SAAWhW,KAAKwwC,KAAK5yC,GAAOoyC,SAAW,SAAWA,GAExEhwC,KAAKwwC,KAAK5yC,GAAOoyC,SAAWA,EAC5BhwC,KAAK2wC,UAAU/yC,IAGjBsvC,EAAcvyC,UAAUk2C,SAAW,SAAS90C,GAC1C,IAAImqB,EAAMlmB,KAAKwwC,KACXhwB,EAAI,EAAIzkB,EACRuY,EAAIkM,EAAI,EACRswB,EAAU/0C,EACVykB,EAAI0F,EAAI5pB,SACVw0C,EAAU5qB,EAAI1F,GAAGwvB,SAAW9pB,EAAI4qB,GAASd,SAAWxvB,EAAIswB,EACpDx8B,EAAI4R,EAAI5pB,SACVw0C,EAAU5qB,EAAI5R,GAAG07B,SAAW9pB,EAAI4qB,GAASd,SAAW17B,EAAIw8B,GAEtDA,IAAY/0C,IACdiE,KAAK4wC,MAAM70C,EAAG+0C,GACd9wC,KAAK6wC,SAASC,MAKpB5D,EAAcvyC,UAAUg2C,UAAY,SAAS/yC,GAI3C,IAHA,IAEI0S,EAFA4V,EAAMlmB,KAAKwwC,KACXR,EAAW9pB,EAAItoB,GAAOoyC,SAET,IAAVpyC,KAEDsoB,EADJ5V,EAAS1S,GAAS,GACFoyC,SAAWA,IAG3BhwC,KAAK4wC,MAAMhzC,EAAO0S,GAClB1S,EAAQ0S,GAIZ48B,EAAcvyC,UAAUi2C,MAAQ,SAAS70C,EAAGC,GAC1C,IAAIkqB,EAAMlmB,KAAKwwC,KACXE,EAAa1wC,KAAKywC,YAClBM,EAAW7qB,EAAInqB,GACfi1C,EAAW9qB,EAAIlqB,GACnBkqB,EAAInqB,GAAKi1C,EACT9qB,EAAIlqB,GAAK+0C,EACTL,EAAWM,EAASh7B,KAAOja,EAC3B20C,EAAWK,EAAS/6B,KAAOha,IAG3B,CAAC+/B,YAAY,KAAKkV,GAAG,CAAC,SAASn3C,EAAQ6E,EAAOF,GAGhD,IAAIyuB,EAAIpzB,EAAQ,YAEhB6E,EAAOF,QAAUgzB,EAgBjB,SAASA,EAAMmD,GACb50B,KAAKkxC,aAAchkB,EAAEa,IAAI6G,EAAM,aAAcA,EAAKuT,SAClDnoC,KAAKmxC,gBAAgBjkB,EAAEa,IAAI6G,EAAM,eAAgBA,EAAK7C,WACtD/xB,KAAKoxC,cAAclkB,EAAEa,IAAI6G,EAAM,aAAcA,EAAK9C,SAGlD9xB,KAAKqxC,YAAShyC,EAGdW,KAAKsxC,oBAAsBpkB,EAAE2G,cAASx0B,GAGtCW,KAAKuxC,oBAAsBrkB,EAAE2G,cAASx0B,GAGtCW,KAAKwxC,OAAS,GAEVxxC,KAAKoxC,cAEPpxC,KAAKyR,QAAU,GAGfzR,KAAKyxC,UAAY,GACjBzxC,KAAKyxC,UApCQ,MAoCgB,IAI/BzxC,KAAK0xC,IAAM,GAGX1xC,KAAK2xC,OAAS,GAGd3xC,KAAK4xC,KAAO,GAGZ5xC,KAAK6xC,MAAQ,GAGb7xC,KAAK8xC,UAAY,GAGjB9xC,KAAK+xC,YAAc,GAgXrB,SAASC,EAAqB51C,EAAK6Z,GAC7BiX,EAAEa,IAAI3xB,EAAK6Z,GACb7Z,EAAI6Z,KAEJ7Z,EAAI6Z,GAAK,EAIb,SAASg8B,EAAuB71C,EAAK6Z,KAC5B7Z,EAAI6Z,WAAa7Z,EAAI6Z,GAG9B,SAASi8B,EAAaC,EAAYpuC,EAAGmqB,EAAG7yB,GACtC,IAAK82C,GAAcpuC,EAAImqB,EAAG,CACxB,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,OAAO97B,EAxbY,IAwbSmqB,EAxbT,KAybPhB,EAAE0P,YAAYvhC,GA3bJ,KA2bgCA,GAGxD,SAAS+2C,EAAcD,EAAYpuC,EAAGmqB,EAAG7yB,GACvC,IAAK82C,GAAcpuC,EAAImqB,EAAG,CACxB,IAAI2R,EAAM97B,EACVA,EAAImqB,EACJA,EAAI2R,EAEN,IAAIvE,EAAW,CAAEv3B,EAAGA,EAAGmqB,EAAGA,GAI1B,OAHI7yB,IACFigC,EAAQjgC,KAAOA,GAEVigC,EAGT,SAAS+W,EAAYF,EAAY7W,GAC/B,OAAO4W,EAAaC,EAAY7W,EAAQv3B,EAAGu3B,EAAQpN,EAAGoN,EAAQjgC,MAhZhEo2B,EAAM92B,UAAU23C,WAAa,EAG7B7gB,EAAM92B,UAAU43C,WAAa,EAK7B9gB,EAAM92B,UAAUw3C,WAAa,WAC3B,OAAOnyC,KAAKkxC,aAGdzf,EAAM92B,UAAUuwC,aAAe,WAC7B,OAAOlrC,KAAKmxC,eAGd1f,EAAM92B,UAAU63C,WAAa,WAC3B,OAAOxyC,KAAKoxC,aAGd3f,EAAM92B,UAAUq3B,SAAW,SAAS3D,GAElC,OADAruB,KAAKqxC,OAAShjB,EACPruB,MAGTyxB,EAAM92B,UAAU4yB,MAAQ,WACtB,OAAOvtB,KAAKqxC,QAMd5f,EAAM92B,UAAUgiC,oBAAsB,SAAS8V,GAK7C,OAJKvlB,EAAEwlB,WAAWD,KAChBA,EAAavlB,EAAE2G,SAAS4e,IAE1BzyC,KAAKsxC,oBAAsBmB,EACpBzyC,MAGTyxB,EAAM92B,UAAU43B,UAAY,WAC1B,OAAOvyB,KAAKsyC,YAGd7gB,EAAM92B,UAAUwzB,MAAQ,WACtB,OAAOjB,EAAEnT,KAAK/Z,KAAKwxC,SAGrB/f,EAAM92B,UAAU64B,QAAU,WACxB,OAAOtG,EAAE/T,OAAOnZ,KAAKmuB,SAAS,SAASpqB,GACrC,OAAOmpB,EAAE7D,QAAQrpB,KAAK0xC,IAAI3tC,MACzB/D,OAGLyxB,EAAM92B,UAAU84B,MAAQ,WACtB,OAAOvG,EAAE/T,OAAOnZ,KAAKmuB,SAAS,SAASpqB,GACrC,OAAOmpB,EAAE7D,QAAQrpB,KAAK4xC,KAAK7tC,MAC1B/D,OAGLyxB,EAAM92B,UAAUg4C,SAAW,SAAS/W,EAAIr+B,GACtC,IAAIN,EAAOC,UAQX,OAPAgwB,EAAEc,KAAK4N,GAAI,SAAS73B,GACd9G,EAAKX,OAAS,EAChB0D,KAAKiyB,QAAQluB,EAAGxG,GAEhByC,KAAKiyB,QAAQluB,KAEd/D,MACIA,MAGTyxB,EAAM92B,UAAUs3B,QAAU,SAASluB,EAAGxG,GACpC,OAAI2vB,EAAEa,IAAI/tB,KAAKwxC,OAAQztC,IACjB7G,UAAUZ,OAAS,IACrB0D,KAAKwxC,OAAOztC,GAAKxG,GAEZyC,OAGTA,KAAKwxC,OAAOztC,GAAK7G,UAAUZ,OAAS,EAAIiB,EAAQyC,KAAKsxC,oBAAoBvtC,GACrE/D,KAAKoxC,cACPpxC,KAAKyR,QAAQ1N,GA7IA,KA8Ib/D,KAAKyxC,UAAU1tC,GAAK,GACpB/D,KAAKyxC,UA/IQ,MA+Ic1tC,IAAK,GAElC/D,KAAK0xC,IAAI3tC,GAAK,GACd/D,KAAK2xC,OAAO5tC,GAAK,GACjB/D,KAAK4xC,KAAK7tC,GAAK,GACf/D,KAAK6xC,MAAM9tC,GAAK,KACd/D,KAAKsyC,WACAtyC,OAGTyxB,EAAM92B,UAAUiG,KAAO,SAASmD,GAC9B,OAAO/D,KAAKwxC,OAAOztC,IAGrB0tB,EAAM92B,UAAU8hC,QAAU,SAAS14B,GACjC,OAAOmpB,EAAEa,IAAI/tB,KAAKwxC,OAAQztC,IAG5B0tB,EAAM92B,UAAU+4B,WAAc,SAAS3vB,GACrC,IAAIgoB,EAAO/rB,KACX,GAAIktB,EAAEa,IAAI/tB,KAAKwxC,OAAQztC,GAAI,CACzB,IAAIuqB,EAAa,SAAS5vB,GAAKqtB,EAAKuC,WAAWvC,EAAK+lB,UAAUpzC,YACvDsB,KAAKwxC,OAAOztC,GACf/D,KAAKoxC,cACPpxC,KAAK4yC,4BAA4B7uC,UAC1B/D,KAAKyR,QAAQ1N,GACpBmpB,EAAEc,KAAKhuB,KAAKwF,SAASzB,IAAI,SAASq2B,GAChCp6B,KAAKuvB,UAAU6K,KACdp6B,aACIA,KAAKyxC,UAAU1tC,IAExBmpB,EAAEc,KAAKd,EAAEnT,KAAK/Z,KAAK0xC,IAAI3tC,IAAKuqB,UACrBtuB,KAAK0xC,IAAI3tC,UACT/D,KAAK2xC,OAAO5tC,GACnBmpB,EAAEc,KAAKd,EAAEnT,KAAK/Z,KAAK4xC,KAAK7tC,IAAKuqB,UACtBtuB,KAAK4xC,KAAK7tC,UACV/D,KAAK6xC,MAAM9tC,KAChB/D,KAAKsyC,WAET,OAAOtyC,MAGTyxB,EAAM92B,UAAU40B,UAAY,SAASxrB,EAAGuM,GACtC,IAAKtQ,KAAKoxC,YACR,MAAM,IAAI3zC,MAAM,6CAGlB,GAAIyvB,EAAE0P,YAAYtsB,GAChBA,EA/La,SAgMR,CACL,IAAK,IAAIuiC,EAAWviC,GACd4c,EAAE0P,YAAYiW,GACfA,EAAW7yC,KAAKsQ,OAAOuiC,GAC1B,GAAIA,IAAa9uC,EACf,MAAM,IAAItG,MAAM,WAAa6S,EAAQ,iBAAmBvM,EACxC,gCAIpB/D,KAAKiyB,QAAQ3hB,GAOf,OAJAtQ,KAAKiyB,QAAQluB,GACb/D,KAAK4yC,4BAA4B7uC,GACjC/D,KAAKyR,QAAQ1N,GAAKuM,EAClBtQ,KAAKyxC,UAAUnhC,GAAQvM,IAAK,EACrB/D,MAGTyxB,EAAM92B,UAAUi4C,4BAA8B,SAAS7uC,UAC9C/D,KAAKyxC,UAAUzxC,KAAKyR,QAAQ1N,IAAIA,IAGzC0tB,EAAM92B,UAAU2V,OAAS,SAASvM,GAChC,GAAI/D,KAAKoxC,YAAa,CACpB,IAAI9gC,EAAStQ,KAAKyR,QAAQ1N,GAC1B,GA3Na,OA2NTuM,EACF,OAAOA,IAKbmhB,EAAM92B,UAAU6K,SAAW,SAASzB,GAKlC,GAJImpB,EAAE0P,YAAY74B,KAChBA,EAnOa,MAsOX/D,KAAKoxC,YAAa,CACpB,IAAI5rC,EAAWxF,KAAKyxC,UAAU1tC,GAC9B,GAAIyB,EACF,OAAO0nB,EAAEnT,KAAKvU,OAEX,CAAA,GA3OQ,OA2OJzB,EACT,OAAO/D,KAAKmuB,QACP,GAAInuB,KAAKy8B,QAAQ14B,GACtB,MAAO,KAIX0tB,EAAM92B,UAAUwmC,aAAe,SAASp9B,GACtC,IAAI+uC,EAAS9yC,KAAK2xC,OAAO5tC,GACzB,GAAI+uC,EACF,OAAO5lB,EAAEnT,KAAK+4B,IAIlBrhB,EAAM92B,UAAU8gC,WAAa,SAAS13B,GACpC,IAAIgvC,EAAQ/yC,KAAK6xC,MAAM9tC,GACvB,GAAIgvC,EACF,OAAO7lB,EAAEnT,KAAKg5B,IAIlBthB,EAAM92B,UAAU2vC,UAAY,SAASvmC,GACnC,IAAIwnC,EAAQvrC,KAAKmhC,aAAap9B,GAC9B,GAAIwnC,EACF,OAAOre,EAAE8lB,MAAMzH,EAAOvrC,KAAKy7B,WAAW13B,KAM1C0tB,EAAM92B,UAAUs4C,oBAAsB,SAASR,GAK7C,OAJKvlB,EAAEwlB,WAAWD,KAChBA,EAAavlB,EAAE2G,SAAS4e,IAE1BzyC,KAAKuxC,oBAAsBkB,EACpBzyC,MAGTyxB,EAAM92B,UAAUu4C,UAAY,WAC1B,OAAOlzC,KAAKuyC,YAGd9gB,EAAM92B,UAAUi0B,MAAQ,WACtB,OAAO1B,EAAEia,OAAOnnC,KAAK8xC,YAGvBrgB,EAAM92B,UAAUw4C,QAAU,SAASvX,EAAIr+B,GACrC,IAAIwuB,EAAO/rB,KACP/C,EAAOC,UASX,OARAgwB,EAAEiF,OAAOyJ,GAAI,SAAS73B,EAAGmqB,GAMvB,OALIjxB,EAAKX,OAAS,EAChByvB,EAAK0C,QAAQ1qB,EAAGmqB,EAAG3wB,GAEnBwuB,EAAK0C,QAAQ1qB,EAAGmqB,GAEXA,KAEFluB,MAOTyxB,EAAM92B,UAAU8zB,QAAU,WACxB,IAAI1qB,EAAGmqB,EAAG7yB,EAAMkC,EACZ61C,GAAiB,EAEjBlmB,EAAEmmB,cAAcn2C,UAAU,KAC5B6G,EAAI7G,UAAU,GAAG6G,EACjBmqB,EAAIhxB,UAAU,GAAGgxB,EACjB7yB,EAAO6B,UAAU,GAAG7B,KACK,IAArB6B,UAAUZ,SACZiB,EAAQL,UAAU,GAClBk2C,GAAiB,KAGnBrvC,EAAI7G,UAAU,GACdgxB,EAAIhxB,UAAU,GACd7B,EAAO6B,UAAU,GACbA,UAAUZ,OAAS,IACrBiB,EAAQL,UAAU,GAClBk2C,GAAiB,IAIrBrvC,EAAI,GAAKA,EACTmqB,EAAI,GAAKA,EACJhB,EAAE0P,YAAYvhC,KACjBA,EAAO,GAAKA,GAGd,IAAIqD,EAAIwzC,EAAalyC,KAAKkxC,YAAantC,EAAGmqB,EAAG7yB,GAC7C,GAAI6xB,EAAEa,IAAI/tB,KAAK+xC,YAAarzC,GAI1B,OAHI00C,IACFpzC,KAAK+xC,YAAYrzC,GAAKnB,GAEjByC,KAGT,IAAKktB,EAAE0P,YAAYvhC,KAAU2E,KAAKmxC,cAChC,MAAM,IAAI1zC,MAAM,qDAKlBuC,KAAKiyB,QAAQluB,GACb/D,KAAKiyB,QAAQ/D,GAEbluB,KAAK+xC,YAAYrzC,GAAK00C,EAAiB71C,EAAQyC,KAAKuxC,oBAAoBxtC,EAAGmqB,EAAG7yB,GAE9E,IAAIigC,EAAU8W,EAAcpyC,KAAKkxC,YAAantC,EAAGmqB,EAAG7yB,GAYpD,OAVA0I,EAAIu3B,EAAQv3B,EACZmqB,EAAIoN,EAAQpN,EAEZxzB,OAAO44C,OAAOhY,GACdt7B,KAAK8xC,UAAUpzC,GAAK48B,EACpB0W,EAAqBhyC,KAAK2xC,OAAOzjB,GAAInqB,GACrCiuC,EAAqBhyC,KAAK6xC,MAAM9tC,GAAImqB,GACpCluB,KAAK0xC,IAAIxjB,GAAGxvB,GAAK48B,EACjBt7B,KAAK4xC,KAAK7tC,GAAGrF,GAAK48B,EAClBt7B,KAAKuyC,aACEvyC,MAGTyxB,EAAM92B,UAAU8yB,KAAO,SAAS1pB,EAAGmqB,EAAG7yB,GACpC,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACP+1C,EAAYryC,KAAKkxC,YAAah0C,UAAU,IACxCg1C,EAAalyC,KAAKkxC,YAAantC,EAAGmqB,EAAG7yB,GACjD,OAAO2E,KAAK+xC,YAAYrzC,IAG1B+yB,EAAM92B,UAAUuvC,QAAU,SAASnmC,EAAGmqB,EAAG7yB,GACvC,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACP+1C,EAAYryC,KAAKkxC,YAAah0C,UAAU,IACxCg1C,EAAalyC,KAAKkxC,YAAantC,EAAGmqB,EAAG7yB,GACjD,OAAO6xB,EAAEa,IAAI/tB,KAAK+xC,YAAarzC,IAGjC+yB,EAAM92B,UAAU2zB,WAAa,SAASvqB,EAAGmqB,EAAG7yB,GAC1C,IAAIqD,EAA0B,IAArBxB,UAAUZ,OACP+1C,EAAYryC,KAAKkxC,YAAah0C,UAAU,IACxCg1C,EAAalyC,KAAKkxC,YAAantC,EAAGmqB,EAAG7yB,GAC7CoyB,EAAOztB,KAAK8xC,UAAUpzC,GAY1B,OAXI+uB,IACF1pB,EAAI0pB,EAAK1pB,EACTmqB,EAAIT,EAAKS,SACFluB,KAAK+xC,YAAYrzC,UACjBsB,KAAK8xC,UAAUpzC,GACtBuzC,EAAuBjyC,KAAK2xC,OAAOzjB,GAAInqB,GACvCkuC,EAAuBjyC,KAAK6xC,MAAM9tC,GAAImqB,UAC/BluB,KAAK0xC,IAAIxjB,GAAGxvB,UACZsB,KAAK4xC,KAAK7tC,GAAGrF,GACpBsB,KAAKuyC,cAEAvyC,MAGTyxB,EAAM92B,UAAUo5B,QAAU,SAAShwB,EAAGmoB,GACpC,IAAIgQ,EAAMl8B,KAAK0xC,IAAI3tC,GACnB,GAAIm4B,EAAK,CACP,IAAItN,EAAQ1B,EAAEia,OAAOjL,GACrB,OAAKhQ,EAGEgB,EAAE/T,OAAOyV,GAAO,SAASnB,GAAQ,OAAOA,EAAK1pB,IAAMmoB,KAFjD0C,IAMb6C,EAAM92B,UAAUszB,SAAW,SAASlqB,EAAGmqB,GACrC,IAAIqlB,EAAOvzC,KAAK4xC,KAAK7tC,GACrB,GAAIwvC,EAAM,CACR,IAAI3kB,EAAQ1B,EAAEia,OAAOoM,GACrB,OAAKrlB,EAGEhB,EAAE/T,OAAOyV,GAAO,SAASnB,GAAQ,OAAOA,EAAKS,IAAMA,KAFjDU,IAMb6C,EAAM92B,UAAUotC,UAAY,SAAShkC,EAAGmqB,GACtC,IAAI6F,EAAU/zB,KAAK+zB,QAAQhwB,EAAGmqB,GAC9B,GAAI6F,EACF,OAAOA,EAAQp3B,OAAOqD,KAAKiuB,SAASlqB,EAAGmqB,MA2CzC,CAACY,WAAW,KAAK0kB,GAAG,CAAC,SAAS15C,EAAQ6E,EAAOF,GAE/CE,EAAOF,QAAU,CACfgzB,MAAO33B,EAAQ,WACf6yB,QAAS7yB,EAAQ,eAGjB,CAAC25C,UAAU,GAAGC,YAAY,KAAKC,GAAG,CAAC,SAAS75C,EAAQ6E,EAAOF,GAC7D,IAAIyuB,EAAIpzB,EAAQ,YACZ23B,EAAQ33B,EAAQ,WAuBpB,SAAS85C,EAAWvmB,GAClB,OAAOH,EAAE9wB,IAAIixB,EAAEc,SAAS,SAASpqB,GAC/B,IAAIgC,EAAYsnB,EAAEzsB,KAAKmD,GACnBuM,EAAS+c,EAAE/c,OAAOvM,GAClBnD,EAAO,CAAEmD,EAAGA,GAOhB,OANKmpB,EAAE0P,YAAY72B,KACjBnF,EAAKrD,MAAQwI,GAEVmnB,EAAE0P,YAAYtsB,KACjB1P,EAAK0P,OAASA,GAET1P,KAIX,SAASizC,EAAWxmB,GAClB,OAAOH,EAAE9wB,IAAIixB,EAAEuB,SAAS,SAASlwB,GAC/B,IAAIo1C,EAAYzmB,EAAEI,KAAK/uB,GACnB+uB,EAAO,CAAE1pB,EAAGrF,EAAEqF,EAAGmqB,EAAGxvB,EAAEwvB,GAO1B,OANKhB,EAAE0P,YAAYl+B,EAAErD,QACnBoyB,EAAKpyB,KAAOqD,EAAErD,MAEX6xB,EAAE0P,YAAYkX,KACjBrmB,EAAKlwB,MAAQu2C,GAERrmB,KA9CX9uB,EAAOF,QAAU,CACfs1C,MAIF,SAAe1mB,GACb,IAAI1a,EAAO,CACT4T,QAAS,CACP4hB,SAAU9a,EAAE8kB,aACZpgB,WAAY1E,EAAE6d,eACdpZ,SAAUzE,EAAEmlB,cAEdrkB,MAAOylB,EAAWvmB,GAClBuB,MAAOilB,EAAWxmB,IAEfH,EAAE0P,YAAYvP,EAAEE,WACnB5a,EAAKpV,MAAQ2vB,EAAE8mB,MAAM3mB,EAAEE,UAEzB,OAAO5a,GAhBPshC,KAgDF,SAActhC,GACZ,IAAI0a,EAAI,IAAIoE,EAAM9e,EAAK4T,SAASyL,SAASrf,EAAKpV,OAU9C,OATA2vB,EAAEc,KAAKrb,EAAKwb,OAAO,SAAS8C,GAC1B5D,EAAE4E,QAAQhB,EAAMltB,EAAGktB,EAAM1zB,OACrB0zB,EAAM3gB,QACR+c,EAAEkC,UAAU0B,EAAMltB,EAAGktB,EAAM3gB,WAG/B4c,EAAEc,KAAKrb,EAAKic,OAAO,SAASqC,GAC1B5D,EAAEoB,QAAQ,CAAE1qB,EAAGktB,EAAMltB,EAAGmqB,EAAG+C,EAAM/C,EAAG7yB,KAAM41B,EAAM51B,MAAQ41B,EAAM1zB,UAEzD8vB,KAGP,CAAComB,UAAU,GAAG3kB,WAAW,KAAKolB,GAAG,CAAC,SAASp6C,EAAQ6E,EAAOF,GAC5DE,EAAOF,QAAQ3E,EAAQ,KACrB,CAACq6C,+CAA+C,GAAGna,OAAS,KAAKoa,GAAG,CAAC,SAASt6C,EAAQ6E,EAAOF,GAC/FE,EAAOF,QAAU,SAEf,IAAI41C,GAAG,CAAC,SAASv6C,EAAQ6E,EAAOF,IAClC,SAAWqtB,IAUT,WAGA,IAGIwoB,EAAY,GACZC,EAAa,GAGbC,EAAY,EAGZC,GAAa,IAAIv5B,KAAO,GAqBxBw5B,EAAuB,iBACvBC,EAAsB,qBACtBC,EAAwB,gCAMxBC,EAAe,kCAGfC,EAAU,OAGVC,EAAa,2BAGbC,EAAgB,mBAGhBC,EAA0B70C,OAAO,8DAGjC80C,EAAY,OAGZC,EAAS,WAGTC,EAAoB,2BAGpBC,EAAe,CACjB,QAAS,UAAW,OAAQ,WAAY,OAAQ,SAAU,SAC1D,SAAU,SAAU,IAAK,cAAe,eAAgB,WAAY,QACpE,WAAY,cAIVC,EAAkB,EAGlBC,EAAY,qBACZC,EAAa,iBACbC,EAAY,mBACZC,EAAY,gBAGZC,EAAc,kBAEdC,EAAc,kBAGdC,EAAmB,CACvBC,qBAA8B,GAC9BD,EAAiBN,GAAaM,EAAiBL,GAC/CK,EAAiBJ,GAAaI,EAAiBH,GAC/CG,EAVkB,mBAUcA,EAAiBF,GACjDE,EATkB,mBAScA,EAAiBD,IAAe,EAGhE,IAAIG,EAAkB,CACpBC,SAAW,EACXC,QAAW,EACXC,UAAY,GAIVC,EAAa,CACfC,cAAgB,EAChBC,YAAc,EACd94C,MAAS,KACT+4C,UAAY,GAIVC,EAAc,CAChBC,SAAW,EACXC,UAAY,EACZC,QAAU,EACVC,QAAU,EACVlvC,QAAU,EACVpI,WAAa,GAIXu3C,EAAgB,CAClBC,KAAM,KACNC,IAAK,IACLC,KAAM,IACNC,KAAM,IACNC,KAAM,IACNC,SAAU,QACVC,SAAU,SAIRjlC,EAAQqkC,SAAmB32C,SAAWA,QAAWI,KAGjDo3C,EAAcb,SAAmB93C,IAAYA,IAAYA,EAAQyH,UAAYzH,EAG7E44C,EAAad,SAAmB53C,IAAWA,IAAWA,EAAOuH,UAAYvH,EAGzE24C,EAAgBD,GAAcA,EAAW54C,UAAY24C,GAAeA,EAGpEG,EAAahB,SAAmBzqB,IAAWA,EAiB/C,SAAS0rB,EAAYC,EAAOl6C,EAAOm6C,GAIjC,IAHA,IAAI95C,GAAS85C,GAAa,GAAK,EAC3Bp7C,EAASm7C,EAAQA,EAAMn7C,OAAS,IAE3BsB,EAAQtB,GACf,GAAIm7C,EAAM75C,KAAWL,EACnB,OAAOK,EAGX,OAAQ,EAYV,SAAS+5C,EAAaC,EAAOr6C,GAC3B,IAAI6F,SAAc7F,EAGlB,GAFAq6C,EAAQA,EAAMA,MAEF,WAARx0C,GAA8B,MAAT7F,EACvB,OAAOq6C,EAAMr6C,GAAS,GAAK,EAEjB,UAAR6F,GAA4B,UAARA,IACtBA,EAAO,UAET,IAAI4S,EAAc,UAAR5S,EAAmB7F,EAAQk3C,EAAYl3C,EAGjD,OAFAq6C,GAASA,EAAQA,EAAMx0C,KAAUw0C,EAAM5hC,GAExB,UAAR5S,EACFw0C,GAASJ,EAAYI,EAAOr6C,IAAU,EAAI,GAAK,EAC/Cq6C,EAAQ,GAAK,EASpB,SAASC,EAAUt6C,GACjB,IAAIq6C,EAAQ53C,KAAK43C,MACbx0C,SAAc7F,EAElB,GAAY,WAAR6F,GAA8B,MAAT7F,EACvBq6C,EAAMr6C,IAAS,MACV,CACO,UAAR6F,GAA4B,UAARA,IACtBA,EAAO,UAET,IAAI4S,EAAc,UAAR5S,EAAmB7F,EAAQk3C,EAAYl3C,EAC7Cu6C,EAAYF,EAAMx0C,KAAUw0C,EAAMx0C,GAAQ,IAElC,UAARA,GACD00C,EAAU9hC,KAAS8hC,EAAU9hC,GAAO,KAAK7Y,KAAKI,GAE/Cu6C,EAAU9hC,IAAO,GAavB,SAAS+hC,EAAex6C,GACtB,OAAOA,EAAMy6C,WAAW,GAY1B,SAASC,EAAiBtkC,EAAGlE,GAM3B,IALA,IAAIyoC,EAAKvkC,EAAEwkC,SACPC,EAAK3oC,EAAE0oC,SACPv6C,GAAS,EACTtB,EAAS47C,EAAG57C,SAEPsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQ26C,EAAGt6C,GACXqjC,EAAQmX,EAAGx6C,GAEf,GAAIL,IAAU0jC,EAAO,CACnB,GAAI1jC,EAAQ0jC,QAAyB,IAAT1jC,EAC1B,OAAO,EAET,GAAIA,EAAQ0jC,QAAyB,IAATA,EAC1B,OAAQ,GAUd,OAAOttB,EAAE/V,MAAQ6R,EAAE7R,MAUrB,SAASy6C,EAAYZ,GACnB,IAAI75C,GAAS,EACTtB,EAASm7C,EAAMn7C,OACfg8C,EAAQb,EAAM,GACdc,EAAMd,EAAOn7C,EAAS,EAAK,GAC3Bg7B,EAAOmgB,EAAMn7C,EAAS,GAE1B,GAAIg8C,GAAyB,iBAATA,GAChBC,GAAqB,iBAAPA,GAAmBjhB,GAAuB,iBAARA,EAClD,OAAO,EAET,IAAIsgB,EAAQY,IACZZ,EAAa,MAAIA,EAAY,KAAIA,EAAY,KAAIA,OAAM,IAAe,EAEtE,IAAIzb,EAASqc,IAKb,IAJArc,EAAOsb,MAAQA,EACftb,EAAOyb,MAAQA,EACfzb,EAAOh/B,KAAO06C,IAELj6C,EAAQtB,GACf6/B,EAAOh/B,KAAKs6C,EAAM75C,IAEpB,OAAOu+B,EAWT,SAASsc,EAAiBphC,GACxB,MAAO,KAAOu/B,EAAcv/B,GAS9B,SAASqhC,IACP,OAAOpE,EAAU9T,OAAS,GAS5B,SAASgY,IACP,OAAOjE,EAAW/T,OAAS,CACzBiX,MAAS,KACTG,MAAS,KACTO,SAAY,KACZQ,OAAS,EACT/6C,MAAS,EACTg7C,MAAQ,EACRjC,OAAU,KACVD,OAAU,KACVv5C,KAAQ,KACRsK,OAAU,KACVoxC,MAAQ,EACRx5C,WAAa,EACb9B,MAAS,MAUb,SAASu7C,EAAarB,GACpBA,EAAMn7C,OAAS,EACXg4C,EAAUh4C,OAtVE,IAuVdg4C,EAAUn3C,KAAKs6C,GAUnB,SAASsB,EAAcrC,GACrB,IAAIkB,EAAQlB,EAAOkB,MACfA,GACFmB,EAAcnB,GAEhBlB,EAAOe,MAAQf,EAAOkB,MAAQlB,EAAOyB,SAAWzB,EAAOA,OAASA,EAAOC,OAASD,EAAOjvC,OAASivC,EAAOn5C,MAAQ,KAC3Gg3C,EAAWj4C,OAvWC,IAwWdi4C,EAAWp3C,KAAKu5C,GAiBpB,SAAS57C,EAAM28C,EAAOntB,EAAO0uB,GAC3B1uB,IAAUA,EAAQ,QACA,IAAP0uB,IACTA,EAAMvB,EAAQA,EAAMn7C,OAAS,GAM/B,IAJA,IAAIsB,GAAS,EACTtB,EAAS08C,EAAM1uB,GAAS,EACxB6R,EAASzwB,MAAMpP,EAAS,EAAI,EAAIA,KAE3BsB,EAAQtB,GACf6/B,EAAOv+B,GAAS65C,EAAMntB,EAAQ1sB,GAEhC,OAAOu+B,GAxQLob,GAAeA,EAAWzrB,SAAWyrB,GAAcA,EAAW33C,SAAW23C,IAC3ErlC,EAAOqlC,GAw8MT,IAAIrqB,EAnrMJ,SAAS+rB,EAAaC,GAQpB,IAAIxtC,GAHJwtC,EAAUA,EAAUhsB,EAAEqI,SAASrjB,EAAKxX,SAAUw+C,EAAShsB,EAAEmI,KAAKnjB,EAAMmjC,IAAiBnjC,GAGjExG,MAChBytC,EAAUD,EAAQC,QAClBj+B,EAAOg+B,EAAQh+B,KACfk+B,EAAWF,EAAQE,SACnBrmB,EAAOmmB,EAAQnmB,KACf/Y,EAASk/B,EAAQl/B,OACjBtf,EAASw+C,EAAQx+C,OACjB0F,EAAS84C,EAAQ94C,OACjBC,EAAS64C,EAAQ74C,OACjBg5C,EAAYH,EAAQG,UAQpBC,EAAW,GAGXC,EAAc7+C,EAAOC,UAGrB6+C,EAAUN,EAAQhsB,EAGlB9rB,EAAWm4C,EAAYn4C,SAGvBq4C,GAAWr5C,EAAO,IACpBC,EAAOe,GACJ3E,QAAQ,sBAAuB,QAC/BA,QAAQ,wBAAyB,OAAS,KAI3C0oC,GAAOpS,EAAKoS,KACZuU,GAAeR,EAAQQ,aACvBzU,GAAQlS,EAAKkS,MACb0U,GAAaP,EAASz+C,UAAUyG,SAChCw4C,GAAiBC,GAASD,GAAiBl/C,EAAOk/C,iBAAmBA,GACrEh/C,GAAiB2+C,EAAY3+C,eAC7BuC,GAAOm8C,EAASn8C,KAChBoC,GAAa25C,EAAQ35C,WACrB3C,GAAS08C,EAAS18C,OAClB6jB,GAAU64B,EAAS74B,QAGnBq5B,GAAkB,WAEpB,IACE,IAAI7tB,EAAI,GACJ8tB,EAAOF,GAASE,EAAOr/C,EAAOo/C,iBAAmBC,EACjD5d,EAAS4d,EAAK9tB,EAAGA,EAAGA,IAAM8tB,EAC9B,MAAMr7C,IACR,OAAOy9B,EAPY,GAWjB6d,GAAeH,GAASG,GAAet/C,EAAOwJ,SAAW81C,GACzDC,GAAgBJ,GAASI,GAAgBvuC,EAAM+gC,UAAYwN,GAC3DC,GAAiBhB,EAAQiB,SACzBC,GAAclB,EAAQmB,MACtBC,GAAaT,GAASS,GAAa5/C,EAAOqf,OAASugC,GACnDC,GAAYxnB,EAAKC,IACjBwnB,GAAYznB,EAAKsF,IACjBoiB,GAAiBvB,EAAQzwC,SACzBiyC,GAAe3nB,EAAK4nB,OAGpBC,GAAc,GA6ElB,SAAS5gB,GAAOz8B,GAEd,OAAQA,GAAyB,iBAATA,IAAsBkvC,GAAQlvC,IAAU3C,GAAeO,KAAKoC,EAAO,eACxFA,EACA,IAAIs9C,GAAct9C,GAWvB,SAASs9C,GAAct9C,EAAOu9C,GAC5B96C,KAAK+6C,YAAcD,EACnB96C,KAAKg7C,YAAcz9C,EA7FrBq9C,GAAYpF,GAAc9pC,EAC1BkvC,GAAYnF,GAAa0D,EACzByB,GAAYlF,GAAax6B,EACzB0/B,GAxac,qBAwaWxB,EACzBwB,GAAYjF,GAAej7C,EAC3BkgD,GAzagB,mBAyaW5gC,EAC3B4gC,GAxagB,mBAwaWx6C,EAC3Bw6C,GAAYhF,GAAev1C,EAyF3Bw6C,GAAclgD,UAAYq/B,GAAOr/B,UASjC,IAAIsgD,GAAUjhB,GAAOihB,QAAU,GA0F/B,SAASC,GAASC,GAChB,IAAIpB,EAAOoB,EAAS,GAChBC,EAAcD,EAAS,GACvBE,EAAUF,EAAS,GAEvB,SAASG,IAGP,GAAIF,EAAa,CAIf,IAAIn+C,EAAOnC,EAAMsgD,GACjBj+C,GAAKC,MAAMH,EAAMC,WAInB,GAAI8C,gBAAgBs7C,EAAO,CAEzB,IAAIC,EAAcC,GAAWzB,EAAKp/C,WAC9BwhC,EAAS4d,EAAK38C,MAAMm+C,EAAat+C,GAAQC,WAC7C,OAAOu+C,GAAStf,GAAUA,EAASof,EAErC,OAAOxB,EAAK38C,MAAMi+C,EAASp+C,GAAQC,WAGrC,OADAw+C,GAAYJ,EAAOH,GACZG,EAeT,SAASK,GAAUp+C,EAAOq+C,EAAQ78C,EAAU88C,EAAQC,GAClD,GAAI/8C,EAAU,CACZ,IAAIo9B,EAASp9B,EAASxB,GACtB,QAAqB,IAAV4+B,EACT,OAAOA,EAKX,IADYsf,GAASl+C,GAsBnB,OAAOA,EApBP,IAAIw+C,EAAY36C,EAASjG,KAAKoC,GAC9B,IAAKs4C,EAAiBkG,GACpB,OAAOx+C,EAET,IAAIy+C,EAAOpB,GAAYmB,GACvB,OAAQA,GACN,KAAKtG,EACL,KAAKC,EACH,OAAO,IAAIsG,GAAMz+C,GAEnB,IApqBU,kBAqqBV,KAAKq4C,EACH,OAAO,IAAIoG,EAAKz+C,GAElB,IAtqBU,kBAyqBR,OAFA4+B,EAAS6f,EAAKz+C,EAAM8iC,OAAQyU,EAAQhtB,KAAKvqB,KAClC5B,UAAY4B,EAAM5B,UAClBwgC,EAKb,IAAI8f,EAAQxP,GAAQlvC,GACpB,GAAIq+C,EAAQ,CAEV,IAAIM,GAAeL,EACnBA,IAAWA,EAASnD,KACpBoD,IAAWA,EAASpD,KAGpB,IADA,IAAIp8C,EAASu/C,EAAOv/C,OACbA,KACL,GAAIu/C,EAAOv/C,IAAWiB,EACpB,OAAOu+C,EAAOx/C,GAGlB6/B,EAAS8f,EAAQD,EAAKz+C,EAAMjB,QAAU,QAGtC6/B,EAAS8f,EAAQnhD,EAAMyC,GAAS4+C,GAAO,GAAI5+C,GAY7C,OATI0+C,IACErhD,GAAeO,KAAKoC,EAAO,WAC7B4+B,EAAOv+B,MAAQL,EAAMK,OAEnBhD,GAAeO,KAAKoC,EAAO,WAC7B4+B,EAAOrkB,MAAQva,EAAMua,QAIpB8jC,GAKLC,EAAO1+C,KAAKI,GACZu+C,EAAO3+C,KAAKg/B,IAGX8f,EAAQx1C,GAAU21C,IAAQ7+C,GAAO,SAAS8+C,EAAUrmC,GACnDmmB,EAAOnmB,GAAO2lC,GAAUU,EAAUT,EAAQ78C,EAAU88C,EAAQC,MAG1DI,IACFpD,EAAa+C,GACb/C,EAAagD,IAER3f,GAhBEA,EA2BX,SAASqf,GAAW7gD,EAAW2hD,GAC7B,OAAOb,GAAS9gD,GAAaq/C,GAAar/C,GAAa,GA2BzD,SAAS4hD,GAAmBxC,EAAMsB,EAASmB,GACzC,GAAmB,mBAARzC,EACT,OAAO0C,GAGT,QAAsB,IAAXpB,KAA4B,cAAetB,GACpD,OAAOA,EAET,IAAIoB,EAAWpB,EAAK2C,aACpB,QAAuB,IAAZvB,IACLF,GAAQ0B,YACVxB,GAAYpB,EAAK1+C,QAEnB8/C,EAAWA,IAAaF,GAAQ2B,aACjB,CACb,IAAIvc,EAASsZ,GAAWx+C,KAAK4+C,GACxBkB,GAAQ0B,YACXxB,GAAYpG,EAAWv4C,KAAK6jC,IAEzB8a,IAEHA,EAAWhG,EAAO34C,KAAK6jC,GACvBqb,GAAY3B,EAAMoB,IAKxB,IAAiB,IAAbA,IAAoC,IAAbA,GAAmC,EAAdA,EAAS,GACvD,OAAOpB,EAET,OAAQyC,GACN,KAAK,EAAG,OAAO,SAASj/C,GACtB,OAAOw8C,EAAK5+C,KAAKkgD,EAAS99C,IAE5B,KAAK,EAAG,OAAO,SAASoW,EAAGlE,GACzB,OAAOsqC,EAAK5+C,KAAKkgD,EAAS1nC,EAAGlE,IAE/B,KAAK,EAAG,OAAO,SAASlS,EAAOK,EAAOguC,GACpC,OAAOmO,EAAK5+C,KAAKkgD,EAAS99C,EAAOK,EAAOguC,IAE1C,KAAK,EAAG,OAAO,SAASiR,EAAat/C,EAAOK,EAAOguC,GACjD,OAAOmO,EAAK5+C,KAAKkgD,EAASwB,EAAat/C,EAAOK,EAAOguC,IAGzD,OAAOxmC,GAAK20C,EAAMsB,GAWpB,SAASyB,GAAkB3B,GACzB,IAAIpB,EAAOoB,EAAS,GAChB4B,EAAU5B,EAAS,GACnBC,EAAcD,EAAS,GACvB6B,EAAmB7B,EAAS,GAC5BE,EAAUF,EAAS,GACnB8B,EAAQ9B,EAAS,GAEjB+B,EAAmB,EAAVH,EACTI,EAAsB,EAAVJ,EACZK,EAAoB,EAAVL,EACVM,EAAyB,EAAVN,EACf/mC,EAAM+jC,EAEV,SAASuB,IACP,IAAIC,EAAc2B,EAAS7B,EAAUr7C,KACrC,GAAIo7C,EAAa,CACf,IAAIn+C,EAAOnC,EAAMsgD,GACjBj+C,GAAKC,MAAMH,EAAMC,WAEnB,IAAI8/C,GAAoBI,KACtBngD,IAASA,EAAOnC,EAAMoC,YAClB8/C,GACF7/C,GAAKC,MAAMH,EAAM+/C,GAEfI,GAAWngD,EAAKX,OAAS2gD,GAE3B,OADAF,GAAW,GACJD,GAAkB,CAAC/C,EAAOsD,EAAeN,GAAoB,EAAVA,EAAe9/C,EAAM,KAAMo+C,EAAS4B,IAOlG,GAJAhgD,IAASA,EAAOC,WACZigD,IACFpD,EAAOwB,EAAYvlC,IAEjBhW,gBAAgBs7C,EAAO,CACzBC,EAAcC,GAAWzB,EAAKp/C,WAC9B,IAAIwhC,EAAS4d,EAAK38C,MAAMm+C,EAAat+C,GACrC,OAAOw+C,GAAStf,GAAUA,EAASof,EAErC,OAAOxB,EAAK38C,MAAMm+C,EAAat+C,GAGjC,OADAy+C,GAAYJ,EAAOH,GACZG,EAYT,SAASgC,GAAe7F,EAAOtQ,GAC7B,IAAIvpC,GAAS,EACTC,EAAU0/C,KACVjhD,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChCkhD,EAAUlhD,GAt7BG,IAs7ByBuB,IAAY25C,EAClDrb,EAAS,GAEb,GAAIqhB,EAAS,CACX,IAAI5F,EAAQS,EAAYlR,GACpByQ,GACF/5C,EAAU85C,EACVxQ,EAASyQ,GAET4F,GAAU,EAGd,OAAS5/C,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQk6C,EAAM75C,GACdC,EAAQspC,EAAQ5pC,GAAS,GAC3B4+B,EAAOh/B,KAAKI,GAMhB,OAHIigD,GACFzE,EAAc5R,GAEThL,EAcT,SAASshB,GAAYhG,EAAOiG,EAAWC,EAAUjG,GAK/C,IAJA,IAAI95C,GAAS85C,GAAa,GAAK,EAC3Bp7C,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChC6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQk6C,EAAM75C,GAElB,GAAIL,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,SAC9CmwC,GAAQlvC,IAAUqgD,GAAYrgD,IAAS,CAExCmgD,IACHngD,EAAQkgD,GAAYlgD,EAAOmgD,EAAWC,IAExC,IAAIE,GAAY,EACZC,EAAYvgD,EAAMjB,OAClByhD,EAAW5hB,EAAO7/B,OAGtB,IADA6/B,EAAO7/B,QAAUwhD,IACRD,EAAWC,GAClB3hB,EAAO4hB,KAAcxgD,EAAMsgD,QAEnBF,GACVxhB,EAAOh/B,KAAKI,GAGhB,OAAO4+B,EAgBT,SAAS6hB,GAAYrqC,EAAGlE,EAAG1Q,EAAUk/C,EAASpC,EAAQC,GAEpD,GAAI/8C,EAAU,CACZ,IAAIo9B,EAASp9B,EAAS4U,EAAGlE,GACzB,QAAqB,IAAV0sB,EACT,QAASA,EAIb,GAAIxoB,IAAMlE,EAER,OAAa,IAANkE,GAAY,EAAIA,GAAK,EAAIlE,EAMlC,KAAIkE,GAAMA,GACJA,GAAK4iC,SALO5iC,IAMZlE,GAAK8mC,SALY9mC,IAMrB,OAAO,EAIT,GAAS,MAALkE,GAAkB,MAALlE,EACf,OAAOkE,IAAMlE,EAGf,IAAIssC,EAAY36C,EAASjG,KAAKwY,GAC1BuqC,EAAa98C,EAASjG,KAAKsU,GAQ/B,GANIssC,GAAaxG,IACfwG,EAAYpG,GAEVuI,GAAc3I,IAChB2I,EAAavI,GAEXoG,GAAamC,EACf,OAAO,EAET,OAAQnC,GACN,KAAKtG,EACL,KAAKC,EAGH,OAAQ/hC,IAAMlE,EAEhB,IAj/BY,kBAm/BV,OAAQkE,IAAMA,EACVlE,IAAMA,EAEA,GAALkE,EAAU,EAAIA,GAAK,EAAIlE,EAAKkE,IAAMlE,EAEzC,IAt/BY,kBAu/BZ,KAAKmmC,EAGH,OAAOjiC,GAAKtT,EAAOoP,GAEvB,IAAIwsC,EAAQF,GAAavG,EACzB,IAAKyG,EAAO,CAEV,IAAIkC,EAAWvjD,GAAeO,KAAKwY,EAAG,eAClCyqC,EAAWxjD,GAAeO,KAAKsU,EAAG,eAEtC,GAAI0uC,GAAYC,EACd,OAAOJ,GAAYG,EAAWxqC,EAAEqnC,YAAcrnC,EAAGyqC,EAAW3uC,EAAEurC,YAAcvrC,EAAG1Q,EAAUk/C,EAASpC,EAAQC,GAG5G,GAAIC,GAAapG,EACf,OAAO,EAGT,IAAI0I,EAAQ1qC,EAAE2qC,YACVC,EAAQ9uC,EAAE6uC,YAGd,GAAID,GAASE,KACL7L,GAAW2L,IAAUA,aAAiBA,GAAS3L,GAAW6L,IAAUA,aAAiBA,IACtF,gBAAiB5qC,GAAK,gBAAiBlE,EAE5C,OAAO,EAMX,IAAIysC,GAAeL,EACnBA,IAAWA,EAASnD,KACpBoD,IAAWA,EAASpD,KAGpB,IADA,IAAIp8C,EAASu/C,EAAOv/C,OACbA,KACL,GAAIu/C,EAAOv/C,IAAWqX,EACpB,OAAOmoC,EAAOx/C,IAAWmT,EAG7B,IAAI24B,EAAO,EAQX,GAPAjM,GAAS,EAGT0f,EAAO1+C,KAAKwW,GACZmoC,EAAO3+C,KAAKsS,GAGRwsC,GAMF,GAJA3/C,EAASqX,EAAErX,OACX8rC,EAAO34B,EAAEnT,QACT6/B,EAASiM,GAAQ9rC,IAEH2hD,EAEZ,KAAO7V,KAAQ,CACb,IAAIxqC,EAAQtB,EACRiB,EAAQkS,EAAE24B,GAEd,GAAI6V,EACF,KAAOrgD,OACAu+B,EAAS6hB,GAAYrqC,EAAE/V,GAAQL,EAAOwB,EAAUk/C,EAASpC,EAAQC,WAInE,KAAM3f,EAAS6hB,GAAYrqC,EAAEy0B,GAAO7qC,EAAOwB,EAAUk/C,EAASpC,EAAQC,IAC3E,YAQN0C,GAAM/uC,GAAG,SAASlS,EAAOyY,EAAKvG,GAC5B,GAAI7U,GAAeO,KAAKsU,EAAGuG,GAIzB,OAFAoyB,IAEQjM,EAASvhC,GAAeO,KAAKwY,EAAGqC,IAAQgoC,GAAYrqC,EAAEqC,GAAMzY,EAAOwB,EAAUk/C,EAASpC,EAAQC,MAItG3f,IAAW8hB,GAEbO,GAAM7qC,GAAG,SAASpW,EAAOyY,EAAKrC,GAC5B,GAAI/Y,GAAeO,KAAKwY,EAAGqC,GAEzB,OAAQmmB,IAAWiM,GAAQ,KAYnC,OAPAyT,EAAOrb,MACPsb,EAAOtb,MAEH0b,IACFpD,EAAa+C,GACb/C,EAAagD,IAER3f,EAcT,SAASsiB,GAAU/H,EAAQrW,EAAQthC,EAAU88C,EAAQC,IAClDrP,GAAQpM,GAAU55B,GAAU21C,IAAQ/b,GAAQ,SAASA,EAAQrqB,GAC5D,IAAIwD,EACAyiC,EACA9f,EAASkE,EACT9iC,EAAQm5C,EAAO1gC,GAEnB,GAAIqqB,KAAY4b,EAAQxP,GAAQpM,KAAYgT,GAAchT,IAAU,CAGlE,IADA,IAQMqd,EARFgB,EAAc7C,EAAOv/C,OAClBoiD,KACL,GAAKllC,EAAQqiC,EAAO6C,IAAgBre,EAAS,CAC3C9iC,EAAQu+C,EAAO4C,GACf,MAGJ,IAAKllC,EAECza,IAEG2+C,OAA6B,KADlCvhB,EAASp9B,EAASxB,EAAO8iC,OAEvB9iC,EAAQ4+B,GAGPuhB,IACHngD,EAAQ0+C,EACHxP,GAAQlvC,GAASA,EAAQ,GACzB81C,GAAc91C,GAASA,EAAQ,IAGtCs+C,EAAO1+C,KAAKkjC,GACZyb,EAAO3+C,KAAKI,GAGPmgD,GACHe,GAAUlhD,EAAO8iC,EAAQthC,EAAU88C,EAAQC,QAK3C/8C,QAEmB,KADrBo9B,EAASp9B,EAASxB,EAAO8iC,MAEvBlE,EAASkE,QAGQ,IAAVlE,IACT5+B,EAAQ4+B,GAGZua,EAAO1gC,GAAOzY,KAalB,SAASohD,GAAWtmB,EAAKrF,GACvB,OAAOqF,EAAM4M,GAAMyV,MAAkB1nB,EAAMqF,EAAM,IAanD,SAASumB,GAASnH,EAAOoH,EAAU9/C,GACjC,IAAInB,GAAS,EACTC,EAAU0/C,KACVjhD,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChC6/B,EAAS,GAETqhB,GAAWqB,GAAYviD,GAnwCV,IAmwCsCuB,IAAY25C,EAC/DsH,EAAQ//C,GAAYy+C,EAAW9E,IAAavc,EAE5CqhB,IAEF3/C,EAAU85C,EACVmH,EAFYzG,EAAYyG,IAI1B,OAASlhD,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQk6C,EAAM75C,GACdmhD,EAAWhgD,EAAWA,EAASxB,EAAOK,EAAO65C,GAASl6C,GAEtDshD,GACKjhD,GAASkhD,EAAKA,EAAKxiD,OAAS,KAAOyiD,EACpClhD,EAAQihD,EAAMC,GAAY,MAE5BhgD,GAAYy+C,IACdsB,EAAK3hD,KAAK4hD,GAEZ5iB,EAAOh/B,KAAKI,IAShB,OANIigD,GACF1E,EAAagG,EAAKrH,OAClBsB,EAAc+F,IACL//C,GACT+5C,EAAagG,GAER3iB,EAaT,SAAS6iB,GAAiBC,GACxB,OAAO,SAASrT,EAAY7sC,EAAUs8C,GACpC,IAAIlf,EAAS,GACbp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQquC,EAAWhuC,GACvBqhD,EAAO9iB,EAAQ5+B,EAAOwB,EAASxB,EAAOK,EAAOguC,GAAaA,QAG5DwQ,GAAOxQ,GAAY,SAASruC,EAAOyY,EAAK41B,GACtCqT,EAAO9iB,EAAQ5+B,EAAOwB,EAASxB,EAAOyY,EAAK41B,GAAaA,MAG5D,OAAOzP,GA0BX,SAASgjB,GAAcpF,EAAMgD,EAAS3B,EAAa4B,EAAkB3B,EAAS4B,GAC5E,IAAIC,EAAmB,EAAVH,EAETK,EAAoB,EAAVL,EAEVqC,EAAsB,GAAVrC,EACZsC,EAA2B,GAAVtC,EAErB,KAN0B,EAAVA,KAMGrK,GAAWqH,GAC5B,MAAM,IAAIV,EAER+F,IAAchE,EAAY9+C,SAC5BygD,IAAW,GACXqC,EAAYhE,GAAc,GAExBiE,IAAmBrC,EAAiB1gD,SACtCygD,IAAW,GACXsC,EAAiBrC,GAAmB,GAEtC,IAAI7B,EAAWpB,GAAQA,EAAK2C,aAC5B,OAAIvB,IAAyB,IAAbA,IAEdA,EAAWrgD,EAAMqgD,IACJ,KACXA,EAAS,GAAKrgD,EAAMqgD,EAAS,KAE3BA,EAAS,KACXA,EAAS,GAAKrgD,EAAMqgD,EAAS,MAG3B+B,GAA0B,EAAd/B,EAAS,KACvBA,EAAS,GAAKE,IAGX6B,GAAwB,EAAd/B,EAAS,KACtB4B,GAAW,IAGTK,GAA2B,EAAdjC,EAAS,KACxBA,EAAS,GAAK8B,GAGZmC,GACFjiD,GAAKC,MAAM+9C,EAAS,KAAOA,EAAS,GAAK,IAAKC,GAG5CiE,GACF5+B,GAAQrjB,MAAM+9C,EAAS,KAAOA,EAAS,GAAK,IAAK6B,GAGnD7B,EAAS,IAAM4B,EACRoC,GAAc/hD,MAAM,KAAM+9C,KAGT,GAAX4B,GAA4B,KAAZA,EAAkB7B,GAAW4B,IAC7C,CAAC/C,EAAMgD,EAAS3B,EAAa4B,EAAkB3B,EAAS4B,IAUzE,SAASqC,GAAejoC,GACtB,OAAOkoC,GAAYloC,GAWrB,SAASkmC,KACP,IAAIphB,GAAUA,EAASnC,GAAOn8B,WAAaA,GAAU25C,EAAcrb,EACnE,OAAOA,EAUT,SAAS0d,GAASt8C,GAChB,MAAuB,mBAATA,GAAuBk8C,GAASj9C,KAAKe,GA31BrD09C,GAAQ2B,YAAc/C,GAASX,EAAQsG,aAAerK,EAAO34C,KAAKy8C,GAQlEgC,GAAQ0B,UAAoC,iBAAjBvD,EAAS/9C,KAWpC2+B,GAAOylB,iBAAmB,CAQxBC,OAAU,mBAQVC,SAAY,kBAQZC,YAAe5K,EAQf6K,SAAY,GAQZC,QAAW,CAQT5yB,EAAK8M,KAmJJggB,KACHwB,GAAc,WACZ,SAAS9gD,KACT,OAAO,SAASC,GACd,GAAI8gD,GAAS9gD,GAAY,CACvBD,EAAOC,UAAYA,EACnB,IAAIwhC,EAAS,IAAIzhC,EACjBA,EAAOC,UAAY,KAErB,OAAOwhC,GAAU+c,EAAQx+C,UARhB,IA8oBf,IAAIghD,GAAe5B,GAAwB,SAASC,EAAMx8C,GACxD44C,EAAW54C,MAAQA,EACnBu8C,GAAeC,EAAM,eAAgB5D,IAFH4J,GAepC,SAASC,GAAkBziD,GACzB,IAAIy+C,EACA7f,EAGJ,SAAM5+B,GAAS6D,EAASjG,KAAKoC,IAAUo4C,GACRjD,GAA1BsJ,EAAOz+C,EAAM+gD,gBAAmCtC,aAAgBA,MAMrEwC,GAAMjhD,GAAO,SAASA,EAAOyY,GAC3BmmB,EAASnmB,UAEa,IAAVmmB,GAAyBvhC,GAAeO,KAAKoC,EAAO4+B,IAUpE,SAAS8jB,GAAiB5oC,GACxB,OAAO6oC,GAAc7oC,GAqBvB,SAASumC,GAAYrgD,GACnB,OAAOA,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,QACvD8E,EAASjG,KAAKoC,IAAUg4C,IAAa,EAoBzC,IAAI9I,GAAUwN,IAAiB,SAAS18C,GACtC,OAAOA,GAAyB,iBAATA,GAA4C,iBAAhBA,EAAMjB,QACvD8E,EAASjG,KAAKoC,IAAUi4C,IAAc,GAqCtCz7B,GAAQugC,GAAwB,SAAS5D,GAC3C,OAAK+E,GAAS/E,GAGP4D,GAAW5D,GAFT,IA3BI,SAASA,GACtB,IAAI94C,EAAOuiD,EAAWzJ,EAAQva,EAAS,GACvC,IAAKgkB,EAAU,OAAOhkB,EACtB,IAAMoa,SAAmBG,GAAU,OAAOva,EACxC,IAAKv+B,KAASuiD,EACRvlD,GAAeO,KAAKglD,EAAUviD,IAChCu+B,EAAOh/B,KAAKS,GAGlB,OAAOu+B,GA+BLojB,GAAc,CAChBa,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLzJ,IAAK,SAIHoJ,GAAgBM,GAAOjB,IAGvBkB,GAAgBrgD,EAAO,IAAM2Z,GAAKmmC,IAAerjD,KAAK,KAAO,IAAK,KAClE6jD,GAAkBtgD,EAAO,IAAM2Z,GAAKwlC,IAAa1iD,KAAK,IAAM,IAAK,KAkCjEs/C,GAAS,SAASzF,EAAQrW,EAAQsgB,GACpC,IAAI/iD,EAAOuiD,EAAWzJ,EAAQva,EAASgkB,EACvC,IAAKA,EAAU,OAAOhkB,EACtB,IAAIl/B,EAAOC,UACP0jD,EAAY,EACZC,EAA6B,iBAATF,EAAoB,EAAI1jD,EAAKX,OACrD,GAAIukD,EAAa,GAAoC,mBAAxB5jD,EAAK4jD,EAAa,GAC7C,IAAI9hD,EAAWw9C,GAAmBt/C,IAAO4jD,EAAa,GAAI5jD,EAAK4jD,KAAe,QACrEA,EAAa,GAAoC,mBAAxB5jD,EAAK4jD,EAAa,KACpD9hD,EAAW9B,IAAO4jD,IAEpB,OAASD,EAAYC,GAEnB,IADAV,EAAWljD,EAAK2jD,KACArK,SAAmB4J,GAKnC,IAJA,IAAIW,GAAY,EACZC,EAAWxK,SAAmB4J,IAAapmC,GAAKomC,GAChD7jD,EAASykD,EAAWA,EAASzkD,OAAS,IAEjCwkD,EAAWxkD,GAElB6/B,EADAv+B,EAAQmjD,EAASD,IACD/hD,EAAWA,EAASo9B,EAAOv+B,GAAQuiD,EAASviD,IAAUuiD,EAASviD,GAInF,OAAOu+B,GA2JL5G,GAAW,SAASmhB,EAAQrW,EAAQsgB,GACtC,IAAI/iD,EAAOuiD,EAAWzJ,EAAQva,EAASgkB,EACvC,IAAKA,EAAU,OAAOhkB,EAItB,IAHA,IAAIl/B,EAAOC,UACP0jD,EAAY,EACZC,EAA6B,iBAATF,EAAoB,EAAI1jD,EAAKX,SAC5CskD,EAAYC,GAEnB,IADAV,EAAWljD,EAAK2jD,KACArK,SAAmB4J,GAKnC,IAJA,IAAIW,GAAY,EACZC,EAAWxK,SAAmB4J,IAAapmC,GAAKomC,GAChD7jD,EAASykD,EAAWA,EAASzkD,OAAS,IAEjCwkD,EAAWxkD,QAEU,IAAjB6/B,EADXv+B,EAAQmjD,EAASD,MACwB3kB,EAAOv+B,GAASuiD,EAASviD,IAItE,OAAOu+B,GA4ILqiB,GAAQ,SAAS5S,EAAY7sC,EAAUs8C,GACzC,IAAIz9C,EAAOuiD,EAAWvU,EAAYzP,EAASgkB,EAC3C,IAAKA,EAAU,OAAOhkB,EACtB,IAAKoa,SAAmB4J,GAAW,OAAOhkB,EAExC,IAAKv+B,KADPmB,EAAWA,QAA8B,IAAXs8C,EAAyBt8C,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GACxF8E,EACZ,IAAqD,IAAjDphD,EAASohD,EAASviD,GAAQA,EAAOguC,GAAuB,OAAOzP,EAEvE,OAAOA,GAqELigB,GAAS,SAASxQ,EAAY7sC,EAAUs8C,GAC1C,IAAIz9C,EAAOuiD,EAAWvU,EAAYzP,EAASgkB,EAC3C,IAAKA,EAAU,OAAOhkB,EACtB,IAAKoa,SAAmB4J,GAAW,OAAOhkB,EAC1Cp9B,EAAWA,QAA8B,IAAXs8C,EAAyBt8C,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GAKtG,IAJA,IAAIyF,GAAY,EACZC,EAAWxK,SAAmB4J,IAAapmC,GAAKomC,GAChD7jD,EAASykD,EAAWA,EAASzkD,OAAS,IAEjCwkD,EAAWxkD,GAElB,IAAqD,IAAjDyC,EAASohD,EADbviD,EAAQmjD,EAASD,IACaljD,EAAOguC,GAAuB,OAAOzP,EAEvE,OAAOA,GAqBT,SAAS6kB,GAAYtK,EAAQ33C,EAAUs8C,GACrC,IAAI/2C,EAAQyV,GAAK28B,GACbp6C,EAASgI,EAAMhI,OAGnB,IADAyC,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GAC1C/+C,KAAU,CACf,IAAI0Z,EAAM1R,EAAMhI,GAChB,IAA2C,IAAvCyC,EAAS23C,EAAO1gC,GAAMA,EAAK0gC,GAC7B,MAGJ,OAAOA,EAkBT,SAASuK,GAAUvK,GACjB,IAAIva,EAAS,GAMb,OALAqiB,GAAM9H,GAAQ,SAASn5C,EAAOyY,GACxB08B,GAAWn1C,IACb4+B,EAAOh/B,KAAK6Y,MAGTmmB,EAAO3X,OAmChB,SAASg8B,GAAO9J,GAMd,IALA,IAAI94C,GAAS,EACT0G,EAAQyV,GAAK28B,GACbp6C,EAASgI,EAAMhI,OACf6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOua,EAAO1gC,IAAQA,EAExB,OAAOmmB,EAqLT,SAASuW,GAAWn1C,GAClB,MAAuB,mBAATA,EAuBhB,SAASk+C,GAASl+C,GAKhB,SAAUA,IAASg5C,SAAmBh5C,IAqExC,SAAS2jD,GAAS3jD,GAChB,MAAuB,iBAATA,GACZA,GAAyB,iBAATA,GA/1EJ,mBA+1EyB6D,EAASjG,KAAKoC,KAAyB,EA2BhF,IAAI81C,GAAiBuG,GAAqC,SAASr8C,GACjE,IAAMA,GAAS6D,EAASjG,KAAKoC,IAAUo4C,EACrC,OAAO,EAET,IAAIwL,EAAU5jD,EAAM4jD,QAChBC,EAAWvH,GAASsH,KAAaC,EAAWxH,GAAeuH,KAAavH,GAAewH,GAE3F,OAAOA,EACF7jD,GAAS6jD,GAAYxH,GAAer8C,IAAU6jD,EAC/CpB,GAAkBziD,IATcyiD,GA0CtC,SAASqB,GAAS9jD,GAChB,MAAuB,iBAATA,GACZA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUq4C,IAAe,EAuVhF,SAASzO,GAAOuP,GAMd,IALA,IAAI94C,GAAS,EACT0G,EAAQyV,GAAK28B,GACbp6C,EAASgI,EAAMhI,OACf6/B,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GACf6/B,EAAOv+B,GAAS84C,EAAOpyC,EAAM1G,IAE/B,OAAOu+B,EAkET,SAASr6B,GAAS8pC,EAAYtnB,EAAQozB,GACpC,IAAI95C,GAAS,EACTC,EAAU0/C,KACVjhD,EAASsvC,EAAaA,EAAWtvC,OAAS,EAC1C6/B,GAAS,EAcb,OAZAub,GAAaA,EAAY,EAAI6C,GAAU,EAAGj+C,EAASo7C,GAAaA,IAAc,EAC1EjL,GAAQb,GACVzP,EAASt+B,EAAQ+tC,EAAYtnB,EAAQozB,IAAc,EACzB,iBAAVp7C,EAChB6/B,GAAUklB,GAASzV,GAAcA,EAAW/tC,QAAQymB,EAAQozB,GAAa75C,EAAQ+tC,EAAYtnB,EAAQozB,KAAe,EAEpH0E,GAAOxQ,GAAY,SAASruC,GAC1B,KAAMK,GAAS85C,EACb,QAASvb,EAAS5+B,IAAU+mB,MAI3B6X,EAqCT,IAAImlB,GAAUtC,IAAiB,SAAS7iB,EAAQ5+B,EAAOyY,GACpDpb,GAAeO,KAAKghC,EAAQnmB,GAAOmmB,EAAOnmB,KAASmmB,EAAOnmB,GAAO,KA4CpE,SAASurC,GAAM3V,EAAY7sC,EAAUs8C,GACnC,IAAIlf,GAAS,EACbp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,IACT6/B,IAAWp9B,EAAS6sC,EAAWhuC,GAAQA,EAAOguC,WAKtDwQ,GAAOxQ,GAAY,SAASruC,EAAOK,EAAOguC,GACxC,OAAQzP,IAAWp9B,EAASxB,EAAOK,EAAOguC,MAG9C,OAAOzP,EA2CT,SAAShjB,GAAOyyB,EAAY7sC,EAAUs8C,GACpC,IAAIlf,EAAS,GACbp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQquC,EAAWhuC,GACnBmB,EAASxB,EAAOK,EAAOguC,IACzBzP,EAAOh/B,KAAKI,QAIhB6+C,GAAOxQ,GAAY,SAASruC,EAAOK,EAAOguC,GACpC7sC,EAASxB,EAAOK,EAAOguC,IACzBzP,EAAOh/B,KAAKI,MAIlB,OAAO4+B,EA8CT,SAAS3jB,GAAKozB,EAAY7sC,EAAUs8C,GAClCt8C,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAWMlf,EAXFv+B,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GAAqB,iBAAVA,EAeT,OANA8/C,GAAOxQ,GAAY,SAASruC,EAAOK,EAAOguC,GACxC,GAAI7sC,EAASxB,EAAOK,EAAOguC,GAEzB,OADAzP,EAAS5+B,GACF,KAGJ4+B,EAdP,OAASv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQquC,EAAWhuC,GACvB,GAAImB,EAASxB,EAAOK,EAAOguC,GACzB,OAAOruC,GAyEf,SAASkJ,GAAQmlC,EAAY7sC,EAAUs8C,GACrC,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAG9C,GADAyC,EAAWA,QAA8B,IAAXs8C,EAAyBt8C,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GACnF,iBAAV/+C,EACT,OAASsB,EAAQtB,IACwC,IAAnDyC,EAAS6sC,EAAWhuC,GAAQA,EAAOguC,UAKzCwQ,GAAOxQ,EAAY7sC,GAErB,OAAO6sC,EAoBT,SAAS4V,GAAa5V,EAAY7sC,EAAUs8C,GAC1C,IAAI/+C,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GADAyC,EAAWA,QAA8B,IAAXs8C,EAAyBt8C,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GACnF,iBAAV/+C,EACT,KAAOA,MACoD,IAArDyC,EAAS6sC,EAAWtvC,GAASA,EAAQsvC,SAItC,CACL,IAAItnC,EAAQyV,GAAK6xB,GACjBtvC,EAASgI,EAAMhI,OACf8/C,GAAOxQ,GAAY,SAASruC,EAAOyY,EAAK41B,GAEtC,OADA51B,EAAM1R,EAAQA,IAAQhI,KAAYA,EAC3ByC,EAAS6sC,EAAW51B,GAAMA,EAAK41B,MAG1C,OAAOA,EAsCT,IAAI6V,GAAUzC,IAAiB,SAAS7iB,EAAQ5+B,EAAOyY,IACpDpb,GAAeO,KAAKghC,EAAQnmB,GAAOmmB,EAAOnmB,GAAOmmB,EAAOnmB,GAAO,IAAI7Y,KAAKI,MA0CvEmkD,GAAU1C,IAAiB,SAAS7iB,EAAQ5+B,EAAOyY,GACrDmmB,EAAOnmB,GAAOzY,KA6EhB,SAASnB,GAAIwvC,EAAY7sC,EAAUs8C,GACjC,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAG9C,GADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAC/B,iBAAV/+C,EAET,IADA,IAAI6/B,EAASzwB,EAAMpP,KACVsB,EAAQtB,GACf6/B,EAAOv+B,GAASmB,EAAS6sC,EAAWhuC,GAAQA,EAAOguC,QAGrDzP,EAAS,GACTigB,GAAOxQ,GAAY,SAASruC,EAAOyY,EAAK41B,GACtCzP,IAASv+B,GAASmB,EAASxB,EAAOyY,EAAK41B,MAG3C,OAAOzP,EA2CT,SAASnJ,GAAI4Y,EAAY7sC,EAAUs8C,GACjC,IAAI0D,GAAY4C,EAAAA,EACZxlB,EAAS4iB,EAOb,GAHuB,mBAAZhgD,GAA0Bs8C,GAAWA,EAAQt8C,KAAc6sC,IACpE7sC,EAAW,MAEG,MAAZA,GAAoB0tC,GAAQb,GAI9B,IAHA,IAAIhuC,GAAS,EACTtB,EAASsvC,EAAWtvC,SAEfsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQquC,EAAWhuC,GACnBL,EAAQ4+B,IACVA,EAAS5+B,QAIbwB,EAAwB,MAAZA,GAAoBsiD,GAASzV,GACrCmM,EACA/d,GAAOklB,eAAengD,EAAUs8C,EAAS,GAE7C50C,GAAQmlC,GAAY,SAASruC,EAAOK,EAAOguC,GACzC,IAAIgW,EAAU7iD,EAASxB,EAAOK,EAAOguC,GACjCgW,EAAU7C,IACZA,EAAW6C,EACXzlB,EAAS5+B,MAIf,OAAO4+B,EAkGT,IAAI6K,GAAQ5qC,GAgCZ,SAAS+1B,GAAOyZ,EAAY7sC,EAAU89C,EAAaxB,GACjD,IAAKzP,EAAY,OAAOiR,EACxB,IAAIgF,EAAU3kD,UAAUZ,OAAS,EACjCyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAWtvC,OAExB,GAAqB,iBAAVA,EAIT,IAHIulD,IACFhF,EAAcjR,IAAahuC,MAEpBA,EAAQtB,GACfugD,EAAc99C,EAAS89C,EAAajR,EAAWhuC,GAAQA,EAAOguC,QAGhEwQ,GAAOxQ,GAAY,SAASruC,EAAOK,EAAOguC,GACxCiR,EAAcgF,GACTA,GAAU,EAAOtkD,GAClBwB,EAAS89C,EAAat/C,EAAOK,EAAOguC,MAG5C,OAAOiR,EAsBT,SAASiF,GAAYlW,EAAY7sC,EAAU89C,EAAaxB,GACtD,IAAIwG,EAAU3kD,UAAUZ,OAAS,EAOjC,OANAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpDmG,GAAa5V,GAAY,SAASruC,EAAOK,EAAOguC,GAC9CiR,EAAcgF,GACTA,GAAU,EAAOtkD,GAClBwB,EAAS89C,EAAat/C,EAAOK,EAAOguC,MAEnCiR,EA6FT,SAASkF,GAAQnW,GACf,IAAIhuC,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAOxD,OALAmK,GAAQmlC,GAAY,SAASruC,GAC3B,IAAIykD,EAAOrD,GAAW,IAAK/gD,GAC3Bu+B,EAAOv+B,GAASu+B,EAAO6lB,GACvB7lB,EAAO6lB,GAAQzkD,KAEV4+B,EAsET,SAAS8lB,GAAKrW,EAAY7sC,EAAUs8C,GAClC,IAAIlf,EACJp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpD,IAAIz9C,GAAS,EACTtB,EAASsvC,EAAaA,EAAWtvC,OAAS,EAE9C,GAAqB,iBAAVA,EACT,OAASsB,EAAQtB,KACV6/B,EAASp9B,EAAS6sC,EAAWhuC,GAAQA,EAAOguC,WAKnDwQ,GAAOxQ,GAAY,SAASruC,EAAOK,EAAOguC,GACxC,QAASzP,EAASp9B,EAASxB,EAAOK,EAAOguC,OAG7C,QAASzP,EAkIX,IAAI+lB,GAAQ/oC,GAgNZ,SAASm/B,GAAMb,EAAO14C,EAAUs8C,GAC9B,IAAI/8C,EAAI,EACJhC,EAASm7C,EAAQA,EAAMn7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,GAAS,EAEb,IADAmB,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,KAC3Cz9C,EAAQtB,GAAUyC,EAAS04C,EAAM75C,GAAQA,EAAO65C,IACvDn5C,SAIF,GAAS,OADTA,EAAIS,IACas8C,EACf,OAAO5D,EAAQA,EAAM,QA9sIzBp4C,EAitIA,OAAOvE,EAAM28C,EAAO,EAAG+C,GAAUD,GAAU,EAAGj8C,GAAIhC,IAiFpD,SAASuB,GAAQ45C,EAAOl6C,EAAOm6C,GAC7B,GAAwB,iBAAbA,EAAuB,CAChC,IAAIp7C,EAASm7C,EAAQA,EAAMn7C,OAAS,EACpCo7C,EAAaA,EAAY,EAAI6C,GAAU,EAAGj+C,EAASo7C,GAAaA,GAAa,OACxE,GAAIA,EAAW,CACpB,IAAI95C,EAAQukD,GAAY1K,EAAOl6C,GAC/B,OAAOk6C,EAAM75C,KAAWL,EAAQK,GAAS,EAE3C,OAAO45C,EAAYC,EAAOl6C,EAAOm6C,GAgbnC,SAAS0K,GAAK3K,EAAO14C,EAAUs8C,GAC7B,GAAuB,iBAAZt8C,GAAoC,MAAZA,EAAkB,CACnD,IAAIT,EAAI,EACJV,GAAS,EACTtB,EAASm7C,EAAQA,EAAMn7C,OAAS,EAGpC,IADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,KAC3Cz9C,EAAQtB,GAAUyC,EAAS04C,EAAM75C,GAAQA,EAAO65C,IACvDn5C,SAGFA,EAAiB,MAAZS,GAAoBs8C,EAAW,EAAId,GAAU,EAAGx7C,GAEvD,OAAOjE,EAAM28C,EAAOn5C,GAmDtB,SAAS6jD,GAAY1K,EAAOl6C,EAAOwB,EAAUs8C,GAC3C,IAAIhZ,EAAM,EACNggB,EAAO5K,EAAQA,EAAMn7C,OAAS+lC,EAMlC,IAFA9kC,GADAwB,EAAWA,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAAKoB,IACnDl/C,GAEV8kC,EAAMggB,GAAM,CACjB,IAAI9J,EAAOlW,EAAMggB,IAAU,EAC1BtjD,EAAS04C,EAAMc,IAAQh7C,EACpB8kC,EAAMkW,EAAM,EACZ8J,EAAO9J,EAEb,OAAOlW,EAiET,SAASigB,GAAK7K,EAAOoH,EAAU9/C,EAAUs8C,GAUvC,MARuB,kBAAZwD,GAAqC,MAAZA,IAClCxD,EAAUt8C,EACVA,EAA+B,mBAAZ8/C,GAA0BxD,GAAWA,EAAQwD,KAAcpH,EAAS,KAAOoH,EAC9FA,GAAW,GAEG,MAAZ9/C,IACFA,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,IAE/CuD,GAASnH,EAAOoH,EAAU9/C,GAsEnC,SAASwjD,KAMP,IALA,IAAI9K,EAAQv6C,UAAUZ,OAAS,EAAIY,UAAYA,UAAU,GACrDU,GAAS,EACTtB,EAASm7C,EAAQzkB,GAAIgU,GAAMyQ,EAAO,WAAa,EAC/Ctb,EAASzwB,EAAMpP,EAAS,EAAI,EAAIA,KAE3BsB,EAAQtB,GACf6/B,EAAOv+B,GAASopC,GAAMyQ,EAAO75C,GAE/B,OAAOu+B,EAqBT,SAASgB,GAAUpjB,EAAMotB,GACvB,IAAIvpC,GAAS,EACTtB,EAASyd,EAAOA,EAAKzd,OAAS,EAC9B6/B,EAAS,GAKb,IAHKgL,IAAU7qC,GAAWmwC,GAAQ1yB,EAAK,MACrCotB,EAAS,MAEFvpC,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM+D,EAAKnc,GACXupC,EACFhL,EAAOnmB,GAAOmxB,EAAOvpC,GACZoY,IACTmmB,EAAOnmB,EAAI,IAAMA,EAAI,IAGzB,OAAOmmB,EA8DT,SAAS/2B,GAAK20C,EAAMsB,GAClB,OAAOn+C,UAAUZ,OAAS,EACtB6iD,GAAcpF,EAAM,GAAIj/C,EAAMoC,UAAW,GAAI,KAAMm+C,GACnD8D,GAAcpF,EAAM,EAAG,KAAM,KAAMsB,GAyMzC,SAASmH,GAASzI,EAAM0I,EAAMl8B,GAC5B,IAAItpB,EACAylD,EACAvmB,EACAwmB,EACAtH,EACAuH,EACAC,EACAC,EAAa,EACb7M,GAAU,EACVC,GAAW,EAEf,IAAKxD,GAAWqH,GACd,MAAM,IAAIV,EAGZ,GADAoJ,EAAOlI,GAAU,EAAGkI,IAAS,GACb,IAAZl8B,EAAkB,CACpB,IAAIyvB,GAAU,EACdE,GAAW,OACFuF,GAASl1B,KAClByvB,EAAUzvB,EAAQyvB,QAClBC,EAAU,YAAa1vB,IAAYg0B,GAAUkI,EAAMl8B,EAAQ0vB,UAAY,GACvEC,EAAW,aAAc3vB,EAAUA,EAAQ2vB,SAAWA,GAExD,IAAI6M,EAAU,WACZ,IAAIC,EAAYP,GAAQ3W,KAAQ6W,GAChC,GAAIK,GAAa,EAAG,CACdN,GACFhJ,GAAagJ,GAEf,IAAIO,EAAWJ,EACfH,EAAeE,EAAYC,OAhxK/BxjD,EAixKQ4jD,IACFH,EAAahX,KACb3P,EAAS4d,EAAK38C,MAAMi+C,EAASp+C,GACxB2lD,GAAcF,IACjBzlD,EAAOo+C,EAAU,YAIrBuH,EAAYrjD,GAAWwjD,EAASC,IAIhCE,EAAa,WACXN,GACFlJ,GAAakJ,GAEfF,EAAeE,EAAYC,OAjyK7BxjD,GAkyKM62C,GAAaD,IAAYwM,KAC3BK,EAAahX,KACb3P,EAAS4d,EAAK38C,MAAMi+C,EAASp+C,GACxB2lD,GAAcF,IACjBzlD,EAAOo+C,EAAU,QAKvB,OAAO,WAML,GALAp+C,EAAOC,UACPylD,EAAQ7W,KACRuP,EAAUr7C,KACV6iD,EAAe3M,IAAa0M,IAAc5M,IAE1B,IAAZC,EACF,IAAIkN,EAAcnN,IAAY4M,MACzB,CACAF,GAAiB1M,IACpB8M,EAAaH,GAEf,IAAIK,EAAY/M,GAAW0M,EAAQG,GAC/BG,EAAWD,GAAa,EAExBC,GACEP,IACFA,EAAehJ,GAAagJ,IAE9BI,EAAaH,EACbxmB,EAAS4d,EAAK38C,MAAMi+C,EAASp+C,IAErBylD,IACRA,EAAenjD,GAAW2jD,EAAYF,IAgB1C,OAbIC,GAAYL,EACdA,EAAYlJ,GAAakJ,GAEjBA,GAAaH,IAASxM,IAC9B2M,EAAYrjD,GAAWwjD,EAASN,IAE9BU,IACFF,GAAW,EACX9mB,EAAS4d,EAAK38C,MAAMi+C,EAASp+C,KAE3BgmD,GAAaL,GAAcF,IAC7BzlD,EAAOo+C,EAAU,MAEZlf,GAuYX,SAASsgB,GAASl/C,GAChB,OAAOA,EA+BT,SAAS6lD,GAAM1M,EAAQrW,EAAQ9Z,GAC7B,IAAI8W,GAAQ,EACRgmB,EAAchjB,GAAU4gB,GAAU5gB,GAEjCA,IAAY9Z,GAAY88B,EAAY/mD,UACxB,MAAXiqB,IACFA,EAAU8Z,GAEZ2b,EAAOnB,GACPxa,EAASqW,EACTA,EAAS1c,GACTqpB,EAAcpC,GAAU5gB,KAEV,IAAZ9Z,EACF8W,GAAQ,EACCoe,GAASl1B,IAAY,UAAWA,IACzC8W,EAAQ9W,EAAQ8W,OAElB,IAAI2e,EAAOtF,EACP4M,EAAS5Q,GAAWsJ,GAExBv1C,GAAQ48C,GAAa,SAASE,GAC5B,IAAIxJ,EAAOrD,EAAO6M,GAAcljB,EAAOkjB,GACnCD,IACFtH,EAAKrhD,UAAU4oD,GAAc,WAC3B,IAAIzI,EAAW96C,KAAK+6C,UAChBx9C,EAAQyC,KAAKg7C,YACb/9C,EAAO,CAACM,GAEZJ,GAAKC,MAAMH,EAAMC,WACjB,IAAIi/B,EAAS4d,EAAK38C,MAAMs5C,EAAQz5C,GAChC,GAAIogC,GAASyd,EAAU,CACrB,GAAIv9C,IAAU4+B,GAAUsf,GAAStf,GAC/B,OAAOn8B,MAETm8B,EAAS,IAAI6f,EAAK7f,IACX4e,UAAYD,EAErB,OAAO3e,OAmCf,SAAS4jB,MAiBT,IA4qBM1f,GA5qBFyL,GAAM+N,GAAS/N,GAAM5wB,EAAK4wB,MAAQA,IAAO,WAC3C,OAAO,IAAI5wB,GAAOsoC,WAsBhB/6C,GAAgD,GAArCgyC,GAAegJ,oDAA0BhJ,GAAiB,SAASl9C,EAAOmmD,GAEvF,OAAOjJ,GAAe4G,GAAS9jD,GAASA,EAAMd,QAAQw4C,EAAyB,IAAM13C,EAAOmmD,GAAS,IA2BvG,SAASC,GAAS3tC,GAChB,OAAO,SAAS0gC,GACd,OAAOA,EAAO1gC,IAydlB,SAAS4tC,KACP,OAAO5jD,KAAKg7C,YA6Od,OAvOAhhB,GAAO6pB,MAr2CP,SAAevlD,EAAGy7C,GAChB,IAAKrH,GAAWqH,GACd,MAAM,IAAIV,EAEZ,OAAO,WACL,KAAM/6C,EAAI,EACR,OAAOy7C,EAAK38C,MAAM4C,KAAM9C,aAg2C9B88B,GAAOmiB,OAASA,GAChBniB,GAAO8pB,GA7/GP,SAAYlY,GAOV,IANA,IAAI3uC,EAAOC,UACPU,GAAS,EACT0G,EAAQm5C,GAAYxgD,GAAM,GAAM,EAAO,GACvCX,EAAUW,EAAK,IAAMA,EAAK,GAAGA,EAAK,MAAQ2uC,EAAc,EAAItnC,EAAMhI,OAClE6/B,EAASzwB,EAAMpP,KAEXsB,EAAQtB,GACd6/B,EAAOv+B,GAASguC,EAAWtnC,EAAM1G,IAEnC,OAAOu+B,GAo/GTnC,GAAO50B,KAAOA,GACd40B,GAAO+pB,QA1yCP,SAAiBrN,GAKf,IAJA,IAAIsN,EAAQ9mD,UAAUZ,OAAS,EAAImhD,GAAYvgD,WAAW,GAAM,EAAO,GAAK+jD,GAAUvK,GAClF94C,GAAS,EACTtB,EAAS0nD,EAAM1nD,SAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAMguC,EAAMpmD,GAChB84C,EAAO1gC,GAAOmpC,GAAczI,EAAO1gC,GAAM,EAAG,KAAM,KAAM0gC,GAE1D,OAAOA,GAkyCT1c,GAAOiqB,QA7vCP,SAAiBvN,EAAQ1gC,GACvB,OAAO9Y,UAAUZ,OAAS,EACtB6iD,GAAcnpC,EAAK,GAAIlb,EAAMoC,UAAW,GAAI,KAAMw5C,GAClDyI,GAAcnpC,EAAK,EAAG,KAAM,KAAM0gC,IA2vCxC1c,GAAOqD,MAvGP,SAAe9/B,GAGb,OAFAA,EAAQ,IAAIs9C,GAAct9C,IACpBw9C,WAAY,EACXx9C,GAqGTy8B,GAAOkqB,QA72EP,SAAiBzM,GAKf,IAJA,IAAI75C,GAAS,EACTtB,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChC6/B,EAAS,KAEJv+B,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQk6C,EAAM75C,GACdL,GACF4+B,EAAOh/B,KAAKI,GAGhB,OAAO4+B,GAm2ETnC,GAAOmqB,QA5tCP,WAIE,IAHA,IAAIH,EAAQ9mD,UACRZ,EAAS0nD,EAAM1nD,OAEZA,KACL,IAAKo2C,GAAWsR,EAAM1nD,IACpB,MAAM,IAAI+8C,EAGd,OAAO,WAIL,IAHA,IAAIp8C,EAAOC,UACPZ,EAAS0nD,EAAM1nD,OAEZA,KACLW,EAAO,CAAC+mD,EAAM1nD,GAAQc,MAAM4C,KAAM/C,IAEpC,OAAOA,EAAK,KA6sChB+8B,GAAOnG,SAjwBP,SAAkBt2B,GAChB,OAAO,WACL,OAAOA,IAgwBXy8B,GAAOsnB,QAAUA,GACjBtnB,GAAO91B,OAxlJP,SAAgBvJ,EAAW2hD,GACzB,IAAIngB,EAASqf,GAAW7gD,GACxB,OAAO2hD,EAAaH,GAAOhgB,EAAQmgB,GAAcngB,GAulJnDnC,GAAOklB,eA/tBP,SAAwBnF,EAAMsB,EAASmB,GACrC,IAAIp5C,SAAc22C,EAClB,GAAY,MAARA,GAAwB,YAAR32C,EAClB,OAAOm5C,GAAmBxC,EAAMsB,EAASmB,GAG3C,GAAY,UAARp5C,EACF,OAAOugD,GAAS5J,GAElB,IAAIz1C,EAAQyV,GAAKggC,GACb/jC,EAAM1R,EAAM,GACZqP,EAAIomC,EAAK/jC,GAGb,OAAoB,GAAhB1R,EAAMhI,QAAeqX,GAAMA,GAAM8nC,GAAS9nC,GAQvC,SAAS+iC,GAId,IAHA,IAAIp6C,EAASgI,EAAMhI,OACf6/B,GAAS,EAEN7/B,MACC6/B,EAAS6hB,GAAYtH,EAAOpyC,EAAMhI,IAAUy9C,EAAKz1C,EAAMhI,IAAU,MAAM,MAI/E,OAAO6/B,GAdA,SAASua,GACd,IAAIjnC,EAAIinC,EAAO1gC,GACf,OAAOrC,IAAMlE,IAAY,IAANkE,GAAY,EAAIA,GAAK,EAAIlE,KA6sBlDuqB,GAAOoqB,MAjrCP,SAAerK,EAAMkD,GAEnB,OAAOkC,GAAcpF,EAAM,EAAG,KAAM,KAAM,KAD1CkD,EAAwB,iBAATA,EAAoBA,GAAUA,GAASlD,EAAKz9C,SAirC7D09B,GAAOwoB,SAAWA,GAClBxoB,GAAOzE,SAAWA,GAClByE,GAAOqqB,MAphCP,SAAetK,GACb,IAAKrH,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAIp8C,EAAOnC,EAAMoC,UAAW,GAC5B,OAAOqC,IAAW,WAAaw6C,EAAK38C,WA12KpCiC,EA02KqDpC,KAAU,IAghCjE+8B,GAAOsqB,MA7/BP,SAAevK,EAAM0I,GACnB,IAAK/P,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAIp8C,EAAOnC,EAAMoC,UAAW,GAC5B,OAAOqC,IAAW,WAAaw6C,EAAK38C,WAl4KpCiC,EAk4KqDpC,KAAUwlD,IAy/BjEzoB,GAAOuqB,WA31EP,SAAoB9M,GAClB,OAAO6F,GAAe7F,EAAOgG,GAAYvgD,WAAW,GAAM,EAAM,KA21ElE88B,GAAO7gB,OAASA,GAChB6gB,GAAOpG,QAhoEP,SAAiB6jB,EAAOiG,EAAW3+C,EAAUs8C,GAU3C,MARwB,kBAAbqC,GAAuC,MAAbA,IACnCrC,EAAUt8C,EACVA,EAAgC,mBAAb2+C,GAA2BrC,GAAWA,EAAQqC,KAAejG,EAAS,KAAOiG,EAChGA,GAAY,GAEE,MAAZ3+C,IACF04C,EAAQr7C,GAAIq7C,EAAO14C,EAAUs8C,IAExBoC,GAAYhG,EAAOiG,IAunE5B1jB,GAAOvzB,QAAUA,GACjBuzB,GAAOwnB,aAAeA,GACtBxnB,GAAOwkB,MAAQA,GACfxkB,GAAOwqB,WAt4IP,SAAoB9N,EAAQ33C,EAAUs8C,GACpC,IAAIoJ,EAAQ,GAEZjG,GAAM9H,GAAQ,SAASn5C,EAAOyY,GAC5ByuC,EAAMtnD,KAAK6Y,EAAKzY,MAGlB,IAAIjB,EAASmoD,EAAMnoD,OAEnB,IADAyC,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,GAC1C/+C,MACoD,IAArDyC,EAAS0lD,EAAMnoD,KAAWmoD,EAAMnoD,GAASo6C,KAI/C,OAAOA,GAy3IT1c,GAAOoiB,OAASA,GAChBpiB,GAAOgnB,YAAcA,GACrBhnB,GAAOinB,UAAYA,GACnBjnB,GAAOynB,QAAUA,GACjBznB,GAAO0nB,QAAUA,GACjB1nB,GAAO0qB,QAxiEP,SAAiBjN,EAAO14C,EAAUs8C,GAChC,IAAI/8C,EAAI,EACJhC,EAASm7C,EAAQA,EAAMn7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,EAAQtB,EAEZ,IADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAC7Cz9C,KAAWmB,EAAS04C,EAAM75C,GAAQA,EAAO65C,IAC9Cn5C,SAGFA,EAAiB,MAAZS,GAAoBs8C,EAAW,EAAIt8C,GAAYT,EAEtD,OAAOxD,EAAM28C,EAAO,EAAG+C,GAAUD,GAAU,EAAGj+C,EAASgC,GAAIhC,KA4hE7D09B,GAAO2qB,aA3gEP,WASE,IARA,IAAI1nD,EAAO,GACP2jD,GAAa,EACbC,EAAa3jD,UAAUZ,OACvBsoD,EAASlM,IACT76C,EAAU0/C,KACVsH,EAAehnD,IAAY25C,EAC3BsH,EAAOpG,MAEFkI,EAAYC,GAAY,CAC/B,IAAItjD,EAAQL,UAAU0jD,IAClBnU,GAAQlvC,IAAUqgD,GAAYrgD,MAChCN,EAAKE,KAAKI,GACVqnD,EAAOznD,KAAK0nD,GAAgBtnD,EAAMjB,QA73IrB,IA83IX+7C,EAAYuI,EAAY3jD,EAAK2jD,GAAa9B,KAGhD,IAAIrH,EAAQx6C,EAAK,GACbW,GAAS,EACTtB,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChC6/B,EAAS,GAEb2oB,EACA,OAASlnD,EAAQtB,GAAQ,CACvB,IAAIs7C,EAAQgN,EAAO,GAGnB,GAFArnD,EAAQk6C,EAAM75C,IAETg6C,EAAQD,EAAaC,EAAOr6C,GAASM,EAAQihD,EAAMvhD,IAAU,EAAG,CAGnE,IAFAqjD,EAAYC,GACXjJ,GAASkH,GAAM3hD,KAAKI,KACZqjD,GAEP,KADAhJ,EAAQgN,EAAOhE,IACFjJ,EAAaC,EAAOr6C,GAASM,EAAQZ,EAAK2jD,GAAYrjD,IAAU,EAC3E,SAASunD,EAGb3oB,EAAOh/B,KAAKI,IAGhB,KAAOsjD,MACLjJ,EAAQgN,EAAO/D,KAEb9H,EAAcnB,GAKlB,OAFAkB,EAAa8L,GACb9L,EAAagG,GACN3iB,GA69DTnC,GAAOwmB,OAASA,GAChBxmB,GAAO+qB,OA/hGP,SAAgBnZ,EAAY2X,GAC1B,IAAItmD,EAAOnC,EAAMoC,UAAW,GACxBU,GAAS,EACT0lD,EAA8B,mBAAdC,EAChBjnD,EAASsvC,EAAaA,EAAWtvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAKxD,OAHAmK,GAAQmlC,GAAY,SAASruC,GAC3B4+B,IAASv+B,IAAU0lD,EAASC,EAAahmD,EAAMgmD,IAAanmD,MAAMG,EAAON,MAEpEk/B,GAshGTnC,GAAOjgB,KAAOA,GACdigB,GAAO59B,IAAMA,GACb49B,GAAOZ,UAj2HP,SAAmBsd,EAAQ33C,EAAUs8C,GACnC,IAAIlf,EAAS,GAMb,OALAp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAEpDe,GAAO1F,GAAQ,SAASn5C,EAAOyY,EAAK0gC,GAClCva,EAAOnmB,GAAOjX,EAASxB,EAAOyY,EAAK0gC,MAE9Bva,GA21HTnC,GAAOhH,IAAMA,GACbgH,GAAOgrB,QAr+BP,SAAiBjL,EAAMkL,GACrB,IAAKvS,GAAWqH,GACd,MAAM,IAAIV,EAEZ,IAAI6L,EAAW,WACb,IAAItN,EAAQsN,EAAStN,MACjB5hC,EAAMivC,EAAWA,EAAS7nD,MAAM4C,KAAM9C,WAAau3C,EAAYv3C,UAAU,GAE7E,OAAOtC,GAAeO,KAAKy8C,EAAO5hC,GAC9B4hC,EAAM5hC,GACL4hC,EAAM5hC,GAAO+jC,EAAK38C,MAAM4C,KAAM9C,YAGrC,OADAgoD,EAAStN,MAAQ,GACVsN,GAy9BTlrB,GAAO/E,MAvyHP,SAAeyhB,GACb,IAAIz5C,EAAOC,UACPZ,EAAS,EAEb,IAAKm/C,GAAS/E,GACZ,OAAOA,EAOT,GAHsB,iBAAXz5C,EAAK,KACdX,EAASW,EAAKX,QAEZA,EAAS,GAAgC,mBAApBW,EAAKX,EAAS,GACrC,IAAIyC,EAAWw9C,GAAmBt/C,IAAOX,EAAS,GAAIW,EAAKX,KAAW,QAC7DA,EAAS,GAAgC,mBAApBW,EAAKX,EAAS,KAC5CyC,EAAW9B,IAAOX,IAOpB,IALA,IAAIk3B,EAAU14B,EAAMoC,UAAW,EAAGZ,GAC9BsB,GAAS,EACTi+C,EAASnD,IACToD,EAASpD,MAEJ96C,EAAQtB,GACfmiD,GAAU/H,EAAQljB,EAAQ51B,GAAQmB,EAAU88C,EAAQC,GAItD,OAFAhD,EAAa+C,GACb/C,EAAagD,GACNpF,GA6wHT1c,GAAO3B,IA52FP,SAAauT,EAAY7sC,EAAUs8C,GACjC,IAAI0D,EAAW4C,EAAAA,EACXxlB,EAAS4iB,EAOb,GAHuB,mBAAZhgD,GAA0Bs8C,GAAWA,EAAQt8C,KAAc6sC,IACpE7sC,EAAW,MAEG,MAAZA,GAAoB0tC,GAAQb,GAI9B,IAHA,IAAIhuC,GAAS,EACTtB,EAASsvC,EAAWtvC,SAEfsB,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQquC,EAAWhuC,GACnBL,EAAQ4+B,IACVA,EAAS5+B,QAIbwB,EAAwB,MAAZA,GAAoBsiD,GAASzV,GACrCmM,EACA/d,GAAOklB,eAAengD,EAAUs8C,EAAS,GAE7C50C,GAAQmlC,GAAY,SAASruC,EAAOK,EAAOguC,GACzC,IAAIgW,EAAU7iD,EAASxB,EAAOK,EAAOguC,GACjCgW,EAAU7C,IACZA,EAAW6C,EACXzlB,EAAS5+B,MAIf,OAAO4+B,GA60FTnC,GAAOmrB,KAjvHP,SAAczO,EAAQ33C,EAAUs8C,GAC9B,IAAIlf,EAAS,GACb,GAAuB,mBAAZp9B,EAAwB,CACjC,IAAIuF,EAAQ,GACZk6C,GAAM9H,GAAQ,SAASn5C,EAAOyY,GAC5B1R,EAAMnH,KAAK6Y,MAOb,IAHA,IAAIpY,GAAS,EACTtB,GAHJgI,EAAQg5C,GAAeh5C,EAAOm5C,GAAYvgD,WAAW,GAAM,EAAO,KAG/CZ,SAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOnmB,GAAO0gC,EAAO1gC,SAGvBjX,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpDmD,GAAM9H,GAAQ,SAASn5C,EAAOyY,EAAK0gC,GAC5B33C,EAASxB,EAAOyY,EAAK0gC,KACxBva,EAAOnmB,GAAOzY,MAIpB,OAAO4+B,GA0tHTnC,GAAOorB,KAx8BP,SAAcrL,GACZ,IAAIsL,EACAlpB,EAEJ,IAAKuW,GAAWqH,GACd,MAAM,IAAIV,EAEZ,OAAO,WACL,OAAIgM,IAGJA,GAAM,EACNlpB,EAAS4d,EAAK38C,MAAM4C,KAAM9C,WAG1B68C,EAAO,MANE5d,IAg8BbnC,GAAOyqB,MA1sHP,SAAe/N,GAMb,IALA,IAAI94C,GAAS,EACT0G,EAAQyV,GAAK28B,GACbp6C,EAASgI,EAAMhI,OACf6/B,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GAChBu+B,EAAOv+B,GAAS,CAACoY,EAAK0gC,EAAO1gC,IAE/B,OAAOmmB,GAisHTnC,GAAOsrB,QAp6BP,SAAiBvL,GACf,OAAOoF,GAAcpF,EAAM,GAAIj/C,EAAMoC,UAAW,KAo6BlD88B,GAAOurB,aAt4BP,SAAsBxL,GACpB,OAAOoF,GAAcpF,EAAM,GAAI,KAAMj/C,EAAMoC,UAAW,KAs4BxD88B,GAAO3E,KArqHP,SAAcqhB,EAAQ33C,EAAUs8C,GAC9B,IAAIlf,EAAS,GACb,GAAuB,mBAAZp9B,EAKT,IAJA,IAAInB,GAAS,EACT0G,EAAQm5C,GAAYvgD,WAAW,GAAM,EAAO,GAC5CZ,EAASm/C,GAAS/E,GAAUpyC,EAAMhI,OAAS,IAEtCsB,EAAQtB,GAAQ,CACvB,IAAI0Z,EAAM1R,EAAM1G,GACZoY,KAAO0gC,IACTva,EAAOnmB,GAAO0gC,EAAO1gC,SAIzBjX,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpDmD,GAAM9H,GAAQ,SAASn5C,EAAOyY,EAAK0gC,GAC7B33C,EAASxB,EAAOyY,EAAK0gC,KACvBva,EAAOnmB,GAAOzY,MAIpB,OAAO4+B,GAipHTnC,GAAOgN,MAAQA,GACfhN,GAAO2pB,SAAWA,GAClB3pB,GAAOwrB,KA72DP,SAAc/N,GAMZ,IALA,IAAIx6C,EAAOC,UACP0jD,EAAY,EACZC,EAAa5jD,EAAKX,OAClBA,EAASm7C,EAAQA,EAAMn7C,OAAS,IAE3BskD,EAAYC,GAGnB,IAFA,IAAIjjD,GAAS,EACTL,EAAQN,EAAK2jD,KACRhjD,EAAQtB,GACXm7C,EAAM75C,KAAWL,IACnBX,GAAOzB,KAAKs8C,EAAO75C,IAAS,GAC5BtB,KAIN,OAAOm7C,GA81DTzd,GAAO9G,MA3zDP,SAAe5I,EAAO0uB,EAAKyM,GACzBn7B,GAASA,GAAS,EAGP,MAAP0uB,IACFA,EAAM1uB,EACNA,EAAQ,GAQV,IAJA,IAAI1sB,GAAS,EACTtB,EAASi+C,GAAU,EAAGpV,IAAM6T,EAAM1uB,KATtCm7B,EAAsB,iBAARA,EAAmBA,GAASA,GAAQ,IASM,KACpDtpB,EAASzwB,EAAMpP,KAEVsB,EAAQtB,GACf6/B,EAAOv+B,GAAS0sB,EAChBA,GAASm7B,EAEX,OAAOtpB,GA0yDTnC,GAAO0rB,OAnsFP,SAAgB9Z,EAAY7sC,EAAUs8C,GAEpC,OADAt8C,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAC7CliC,GAAOyyB,GAAY,SAASruC,EAAOK,EAAOguC,GAC/C,OAAQ7sC,EAASxB,EAAOK,EAAOguC,OAisFnC5R,GAAOh4B,OAxwDP,SAAgBy1C,EAAO14C,EAAUs8C,GAC/B,IAAIz9C,GAAS,EACTtB,EAASm7C,EAAQA,EAAMn7C,OAAS,EAChC6/B,EAAS,GAGb,IADAp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,KAC3Cz9C,EAAQtB,GAAQ,CACvB,IAAIiB,EAAQk6C,EAAM75C,GACdmB,EAASxB,EAAOK,EAAO65C,KACzBtb,EAAOh/B,KAAKI,GACZX,GAAOzB,KAAKs8C,EAAO75C,IAAS,GAC5BtB,KAGJ,OAAO6/B,GA2vDTnC,GAAOooB,KAAOA,GACdpoB,GAAO+nB,QAAUA,GACjB/nB,GAAOsD,OA7/EP,SAAgBsO,EAAY7sC,EAAUs8C,GACpC,IAAIz9C,GAAS,EACTq+C,EAAQxP,GAAQ1tC,GAChBzC,EAASsvC,EAAaA,EAAWtvC,OAAS,EAC1C6/B,EAASzwB,EAAuB,iBAAVpP,EAAqBA,EAAS,GAkBxD,IAhBK2/C,IACHl9C,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,IAEtD50C,GAAQmlC,GAAY,SAASruC,EAAOyY,EAAK41B,GACvC,IAAI8K,EAASva,IAASv+B,GAAS46C,IAC3ByD,EACFvF,EAAOyB,SAAW/7C,GAAI2C,GAAU,SAASiX,GAAO,OAAOzY,EAAMyY,OAE5D0gC,EAAOyB,SAAWO,KAAY,GAAK35C,EAASxB,EAAOyY,EAAK41B,GAE3D8K,EAAO94C,MAAQA,EACf84C,EAAOn5C,MAAQA,KAGjBjB,EAAS6/B,EAAO7/B,OAChB6/B,EAAO3X,KAAKyzB,GACL37C,KAAU,CACf,IAAIo6C,EAASva,EAAO7/B,GACpB6/B,EAAO7/B,GAAUo6C,EAAOn5C,MACnB0+C,GACHnD,EAAapC,EAAOyB,UAEtBY,EAAcrC,GAEhB,OAAOva,GAg+ETnC,GAAO2rB,IA/HP,SAAapoD,EAAOqoD,GAElB,OADAA,EAAYroD,GACLA,GA8HTy8B,GAAO6rB,SA/2BP,SAAkB9L,EAAM0I,EAAMl8B,GAC5B,IAAIyvB,GAAU,EACVE,GAAW,EAEf,IAAKxD,GAAWqH,GACd,MAAM,IAAIV,EAYZ,OAVgB,IAAZ9yB,EACFyvB,GAAU,EACDyF,GAASl1B,KAClByvB,EAAU,YAAazvB,EAAUA,EAAQyvB,QAAUA,EACnDE,EAAW,aAAc3vB,EAAUA,EAAQ2vB,SAAWA,GAExDH,EAAgBC,QAAUA,EAC1BD,EAAgBE,QAAUwM,EAC1B1M,EAAgBG,SAAWA,EAEpBsM,GAASzI,EAAM0I,EAAM1M,IA+1B9B/b,GAAO8rB,MAzOP,SAAexnD,EAAGS,EAAUs8C,GAC1B/8C,GAAKA,GAAKA,IAAM,EAAIA,EAAI,EACxB,IAAIV,GAAS,EACTu+B,EAASzwB,EAAMpN,GAGnB,IADAS,EAAWw9C,GAAmBx9C,EAAUs8C,EAAS,KACxCz9C,EAAQU,GACf69B,EAAOv+B,GAASmB,EAASnB,GAE3B,OAAOu+B,GAiOTnC,GAAO+rB,QAn9EP,SAAiBna,GACf,OAAIA,GAA0C,iBAArBA,EAAWtvC,OAC3BxB,EAAM8wC,GAERzE,GAAOyE,IAg9EhB5R,GAAO+S,UA5nHP,SAAmB2J,EAAQ33C,EAAU89C,EAAaxB,GAChD,IAAIY,EAAQxP,GAAQiK,GACpB,GAAmB,MAAfmG,EACF,GAAIZ,EACFY,EAAc,OACT,CACL,IAAIb,EAAOtF,GAAUA,EAAO4H,YACxB0H,EAAQhK,GAAQA,EAAKrhD,UAEzBkiD,EAAcrB,GAAWwK,GAS7B,OANIjnD,IACFA,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,IACnDY,EAAQx1C,GAAU21C,IAAQ1F,GAAQ,SAASn5C,EAAOK,EAAO84C,GACxD,OAAO33C,EAAS89C,EAAat/C,EAAOK,EAAO84C,OAGxCmG,GA2mHT7iB,GAAOgZ,MA7mDP,WACE,OAAO4L,GAASnB,GAAYvgD,WAAW,GAAM,KA6mD/C88B,GAAOsoB,KAAOA,GACdtoB,GAAOmN,OAASA,GAChBnN,GAAOkoB,MAAQA,GACfloB,GAAOisB,QAriDP,SAAiBxO,GACf,OAAO6F,GAAe7F,EAAO38C,EAAMoC,UAAW,KAqiDhD88B,GAAOrpB,KA/0BP,SAAcpT,EAAO2oD,GACnB,OAAO/G,GAAc+G,EAAS,GAAI,CAAC3oD,KA+0BrCy8B,GAAOmsB,IAlhDP,WAIE,IAHA,IAAIvoD,GAAS,EACTtB,EAASY,UAAUZ,SAEdsB,EAAQtB,GAAQ,CACvB,IAAIm7C,EAAQv6C,UAAUU,GACtB,GAAI6uC,GAAQgL,IAAUmG,GAAYnG,GAChC,IAAItb,EAASA,EACTyiB,GAAStB,GAAenhB,EAAQsb,GAAO96C,OAAO2gD,GAAe7F,EAAOtb,KACpEsb,EAGR,OAAOtb,GAAU,IAugDnBnC,GAAOuoB,IAAMA,GACbvoB,GAAOmD,UAAYA,GAGnBnD,GAAOosB,QAAUhqD,GACjB49B,GAAOqsB,KAAOjE,GACdpoB,GAAOhM,KAAOvnB,GACduzB,GAAOssB,UAAY9E,GACnBxnB,GAAOusB,OAASpK,GAChBniB,GAAOwsB,QAAUvF,GACjBjnB,GAAO0c,OAASvZ,GAChBnD,GAAO1f,OAASnB,GAChB6gB,GAAOysB,KAAOrE,GACdpoB,GAAO0sB,OAASpE,GAChBtoB,GAAO2sB,MAAQpE,GAGfa,GAAMppB,IAKNA,GAAOga,MA9vJP,SAAez2C,EAAOq+C,EAAQ78C,EAAUs8C,GAQtC,MALqB,kBAAVO,GAAiC,MAAVA,IAChCP,EAAUt8C,EACVA,EAAW68C,EACXA,GAAS,GAEJD,GAAUp+C,EAAOq+C,EAA2B,mBAAZ78C,GAA0Bw9C,GAAmBx9C,EAAUs8C,EAAS,KAuvJzGrhB,GAAOgF,UA3sJP,SAAmBzhC,EAAOwB,EAAUs8C,GAClC,OAAOM,GAAUp+C,GAAO,EAAyB,mBAAZwB,GAA0Bw9C,GAAmBx9C,EAAUs8C,EAAS,KA2sJvGrhB,GAAOl4B,SAAWA,GAClBk4B,GAAO0lB,OA/vBP,SAAgBj4C,GACd,OAAiB,MAAVA,EAAiB,GAAKpH,EAAOoH,GAAQhL,QAAQikD,GAAiBpB,KA+vBvEtlB,GAAOunB,MAAQA,GACfvnB,GAAOxhB,KAAOA,GACdwhB,GAAO4sB,UA53EP,SAAmBnP,EAAO14C,EAAUs8C,GAClC,IAAIz9C,GAAS,EACTtB,EAASm7C,EAAQA,EAAMn7C,OAAS,EAGpC,IADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,KAC3Cz9C,EAAQtB,GACf,GAAIyC,EAAS04C,EAAM75C,GAAQA,EAAO65C,GAChC,OAAO75C,EAGX,OAAQ,GAm3EVo8B,GAAO6sB,QAtlJP,SAAiBnQ,EAAQ33C,EAAUs8C,GACjC,IAAIlf,EAQJ,OAPAp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpDe,GAAO1F,GAAQ,SAASn5C,EAAOyY,EAAK0gC,GAClC,GAAI33C,EAASxB,EAAOyY,EAAK0gC,GAEvB,OADAva,EAASnmB,GACF,KAGJmmB,GA8kJTnC,GAAO8sB,SApyGP,SAAkBlb,EAAY7sC,EAAUs8C,GACtC,IAAIlf,EAQJ,OAPAp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpDmG,GAAa5V,GAAY,SAASruC,EAAOK,EAAOguC,GAC9C,GAAI7sC,EAASxB,EAAOK,EAAOguC,GAEzB,OADAzP,EAAS5+B,GACF,KAGJ4+B,GA4xGTnC,GAAO+sB,cAz0EP,SAAuBtP,EAAO14C,EAAUs8C,GACtC,IAAI/+C,EAASm7C,EAAQA,EAAMn7C,OAAS,EAEpC,IADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAC7C/+C,KACL,GAAIyC,EAAS04C,EAAMn7C,GAASA,EAAQm7C,GAClC,OAAOn7C,EAGX,OAAQ,GAk0EV09B,GAAOgtB,YApiJP,SAAqBtQ,EAAQ33C,EAAUs8C,GACrC,IAAIlf,EAQJ,OAPAp9B,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GACpD2F,GAAYtK,GAAQ,SAASn5C,EAAOyY,EAAK0gC,GACvC,GAAI33C,EAASxB,EAAOyY,EAAK0gC,GAEvB,OADAva,EAASnmB,GACF,KAGJmmB,GA4hJTnC,GAAOjM,IAr1IP,SAAa2oB,EAAQ1gC,GACnB,QAAO0gC,GAAS97C,GAAeO,KAAKu7C,EAAQ1gC,IAq1I9CgkB,GAAOyiB,SAAWA,GAClBziB,GAAOn8B,QAAUA,GACjBm8B,GAAO4jB,YAAcA,GACrB5jB,GAAOyS,QAAUA,GACjBzS,GAAOitB,UA/yIP,SAAmB1pD,GACjB,OAAiB,IAAVA,IAA4B,IAAVA,GACvBA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUk4C,IAAa,GA8yI9Ezb,GAAOktB,OA9xIP,SAAgB3pD,GACd,OAAOA,GAAyB,iBAATA,GAAqB6D,EAASjG,KAAKoC,IAAUm4C,IAAa,GA8xInF1b,GAAOmtB,UA9wIP,SAAmB5pD,GACjB,OAAOA,GAA4B,IAAnBA,EAAM2I,WAAkB,GA8wI1C8zB,GAAO3Q,QAtvIP,SAAiB9rB,GACf,IAAI4+B,GAAS,EACb,IAAK5+B,EACH,OAAO4+B,EAET,IAAI4f,EAAY36C,EAASjG,KAAKoC,GAC1BjB,EAASiB,EAAMjB,OAEnB,OAAKy/C,GAAavG,GAAcuG,GAAanG,GAAemG,GAAaxG,GACpEwG,GAAapG,GAAgC,iBAAVr5C,GAAsBo2C,GAAWn1C,EAAMX,SACrEN,GAEV8/C,GAAO7+C,GAAO,WACZ,OAAQ4+B,GAAS,KAEZA,IAwuITnC,GAAOotB,QA/rIP,SAAiBzzC,EAAGlE,EAAG1Q,EAAUs8C,GAC/B,OAAO2C,GAAYrqC,EAAGlE,EAAsB,mBAAZ1Q,GAA0Bw9C,GAAmBx9C,EAAUs8C,EAAS,KA+rIlGrhB,GAAOmgB,SAhqIP,SAAkB58C,GAChB,OAAO28C,GAAe38C,KAAW68C,GAAYiN,WAAW9pD,KAgqI1Dy8B,GAAO0Y,WAAaA,GACpB1Y,GAAOqgB,MAxlIP,SAAe98C,GAGb,OAAO2jD,GAAS3jD,IAAUA,IAAUA,GAslItCy8B,GAAOstB,OAnkIP,SAAgB/pD,GACd,OAAiB,OAAVA,GAmkITy8B,GAAOknB,SAAWA,GAClBlnB,GAAOyhB,SAAWA,GAClBzhB,GAAOqZ,cAAgBA,GACvBrZ,GAAOutB,SA9/HP,SAAkBhqD,GAChB,OAAOA,GAAyB,iBAATA,GAl5ET,mBAk5E8B6D,EAASjG,KAAKoC,KAAyB,GA8/HrFy8B,GAAOqnB,SAAWA,GAClBrnB,GAAO4C,YA79HP,SAAqBr/B,GACnB,YAAuB,IAATA,GA69HhBy8B,GAAO7T,YAn9DP,SAAqBsxB,EAAOl6C,EAAOm6C,GACjC,IAAI95C,EAAQ65C,EAAQA,EAAMn7C,OAAS,EAInC,IAHwB,iBAAbo7C,IACT95C,GAAS85C,EAAY,EAAI6C,GAAU,EAAG38C,EAAQ85C,GAAa8C,GAAU9C,EAAW95C,EAAQ,IAAM,GAEzFA,KACL,GAAI65C,EAAM75C,KAAWL,EACnB,OAAOK,EAGX,OAAQ,GA08DVo8B,GAAOopB,MAAQA,GACfppB,GAAOwtB,WAnrBP,WAEE,OADAtO,EAAQhsB,EAAIssB,EACLx5C,MAkrBTg6B,GAAO+lB,KAAOA,GACd/lB,GAAO8R,IAAMA,GACb9R,GAAOvxB,SAAWA,GAClBuxB,GAAO2gB,OAhkBP,SAAgBtiB,EAAKrF,EAAKy0B,GACxB,IAAIC,EAAe,MAAPrvB,EACRsvB,EAAe,MAAP30B,EAsBZ,GApBgB,MAAZy0B,IACgB,kBAAPpvB,GAAoBsvB,GAC7BF,EAAWpvB,EACXA,EAAM,GAEEsvB,GAAuB,kBAAP30B,IACxBy0B,EAAWz0B,EACX20B,GAAQ,IAGRD,GAASC,IACX30B,EAAM,GAERqF,GAAOA,GAAO,EACVsvB,GACF30B,EAAMqF,EACNA,EAAM,GAENrF,GAAOA,GAAO,EAEZy0B,GAAYpvB,EAAM,GAAKrF,EAAM,EAAG,CAClC,IAAIgvB,EAAOtH,KACX,OAAOF,GAAUniB,EAAO2pB,GAAQhvB,EAAMqF,EAAMgvB,WAAW,QAAUrF,EAAM,IAAI1lD,OAAS,KAAO02B,GAE7F,OAAO2rB,GAAWtmB,EAAKrF,IAqiBzBgH,GAAO7H,OAASA,GAChB6H,GAAO8nB,YAAcA,GACrB9nB,GAAOmC,OAzgBP,SAAgBua,EAAQ1gC,GACtB,GAAI0gC,EAAQ,CACV,IAAIn5C,EAAQm5C,EAAO1gC,GACnB,OAAO08B,GAAWn1C,GAASm5C,EAAO1gC,KAASzY,IAugB/Cy8B,GAAOif,aAAeA,EACtBjf,GAAOoO,KA/rFP,SAAcwD,GACZ,IAAItvC,EAASsvC,EAAaA,EAAWtvC,OAAS,EAC9C,MAAwB,iBAAVA,EAAqBA,EAASyd,GAAK6xB,GAAYtvC,QA8rF/D09B,GAAOioB,KAAOA,GACdjoB,GAAOmoB,YAAcA,GACrBnoB,GAAO4tB,SAjbP,SAAkBrlD,EAAMgN,EAAMgX,GAK5B,IAAIshC,EAAW7tB,GAAOylB,iBACtBl9C,EAAOlC,EAAOkC,GAAQ,IAGtBgkB,EAAUgP,GAAS,GAAIhP,EAASshC,GAEhC,IAIIC,EAJAhI,EAAUvqB,GAAS,GAAIhP,EAAQu5B,QAAS+H,EAAS/H,SACjDiI,EAAchuC,GAAK+lC,GACnBkI,EAAgB7gB,GAAO2Y,GAGvBliD,EAAQ,EACRgiD,EAAcr5B,EAAQq5B,aAAe1K,EACrC7U,EAAS,WAGT4nB,EAAe7nD,GAChBmmB,EAAQm5B,QAAUxK,GAAW7U,OAAS,IACvCuf,EAAYvf,OAAS,KACpBuf,IAAgB5K,EAAgBH,EAAeK,GAAW7U,OAAS,KACnE9Z,EAAQo5B,UAAYzK,GAAW7U,OAAS,KACzC,KAEF99B,EAAK9F,QAAQwrD,GAAc,SAAS5wC,EAAO6wC,EAAaC,EAAkBC,EAAiBC,EAAe7/C,GAqBxG,OApBA2/C,IAAqBA,EAAmBC,GAGxC/nB,GAAU99B,EAAKzH,MAAM8C,EAAO4K,GAAQ/L,QAAQ24C,EAAmBqD,GAG3DyP,IACF7nB,GAAU,YAAc6nB,EAAc,UAEpCG,IACFP,GAAe,EACfznB,GAAU,OAASgoB,EAAgB,eAEjCF,IACF9nB,GAAU,iBAAmB8nB,EAAmB,+BAElDvqD,EAAQ4K,EAAS6O,EAAM/a,OAIhB+a,KAGTgpB,GAAU,OAIV,IAAIwf,EAAWt5B,EAAQs5B,SACnByI,EAAczI,EAEbyI,IAEHjoB,EAAS,UADTwf,EAAW,OACoB,QAAUxf,EAAS,SAGpDA,GAAUynB,EAAeznB,EAAO5jC,QAAQi4C,EAAsB,IAAMrU,GACjE5jC,QAAQk4C,EAAqB,MAC7Bl4C,QAAQm4C,EAAuB,OAGlCvU,EAAS,YAAcwf,EAAW,SAC/ByI,EAAc,GAAKzI,EAAW,QAAUA,EAAW,aACpD,qCACCiI,EACG,uFAEA,OAEJznB,EACA,gBAIF,IAAIkoB,EAAY,wBAA0BhiC,EAAQgiC,WAAa,2BAA8BjT,IAAqB,KAAO,OAEzH,IACE,IAAInZ,EAASid,EAAS2O,EAAa,UAAY1nB,EAASkoB,GAAWnrD,WAppMrEiC,EAopMsF2oD,GACpF,MAAMtpD,GAEN,MADAA,EAAE2hC,OAASA,EACL3hC,EAER,OAAI6Q,EACK4sB,EAAO5sB,IAKhB4sB,EAAOkE,OAASA,EACTlE,IAiVTnC,GAAOwuB,SA5RP,SAAkB/gD,GAChB,OAAiB,MAAVA,EAAiB,GAAKpH,EAAOoH,GAAQhL,QAAQgkD,GAAeR,KA4RrEjmB,GAAOtL,SAzQP,SAAkB/wB,GAChB,IAAIiB,IAAO41C,EACX,OAAOn0C,EAAiB,MAAV1C,EAAiB,GAAKA,GAAUiB,GA0QhDo7B,GAAOyuB,IAAMlH,GACbvnB,GAAO0uB,IAAMzG,GACbjoB,GAAO2uB,OAASnwC,GAChBwhB,GAAO4uB,UAAYpwC,GACnBwhB,GAAO6uB,MAAQ12B,GACf6H,GAAO8uB,MAAQhH,GACf9nB,GAAO+uB,QAAUjnD,GACjBk4B,GAAOgvB,OAAS72B,GAEhBixB,IACM/iB,GAAS,GACb+b,GAAOpiB,IAAQ,SAAS+f,EAAMwJ,GACvBvpB,GAAOr/B,UAAU4oD,KACpBljB,GAAOkjB,GAAcxJ,MAGlB1Z,KACJ,GAKLrG,GAAOse,MAAQA,GACfte,GAAO1C,KA3iEP,SAAcmgB,EAAO14C,EAAUs8C,GAC7B,IAAI/8C,EAAI,EACJhC,EAASm7C,EAAQA,EAAMn7C,OAAS,EAEpC,GAAuB,iBAAZyC,GAAoC,MAAZA,EAAkB,CACnD,IAAInB,EAAQtB,EAEZ,IADAyC,EAAWi7B,GAAOklB,eAAengD,EAAUs8C,EAAS,GAC7Cz9C,KAAWmB,EAAS04C,EAAM75C,GAAQA,EAAO65C,IAC9Cn5C,SAIF,GAAS,OADTA,EAAIS,IACas8C,EACf,OAAO5D,EAAQA,EAAMn7C,EAAS,QA9+IlC+C,EAi/IA,OAAOvE,EAAM28C,EAAO8C,GAAU,EAAGj+C,EAASgC,KA4hE5C07B,GAAOivB,OA1xFP,SAAgBrd,EAAYttC,EAAGqiD,GAI7B,GAHI/U,GAA0C,iBAArBA,EAAWtvC,SAClCsvC,EAAazE,GAAOyE,IAEb,MAALttC,GAAaqiD,EACf,OAAO/U,EAAaA,EAAW+S,GAAW,EAAG/S,EAAWtvC,OAAS,SAxvHnE+C,EA0vHA,IAAI88B,EAAS4lB,GAAQnW,GAErB,OADAzP,EAAO7/B,OAASk+C,GAAUD,GAAU,EAAGj8C,GAAI69B,EAAO7/B,QAC3C6/B,GAoxFTnC,GAAOkvB,KAAO5Q,GACdte,GAAO/2B,KAAOq1C,GAEd8D,GAAOpiB,IAAQ,SAAS+f,EAAMwJ,GAC5B,IAAI4F,EAA8B,WAAf5F,EACdvpB,GAAOr/B,UAAU4oD,KACpBvpB,GAAOr/B,UAAU4oD,GAAa,SAASjlD,EAAGqiD,GACxC,IAAI7F,EAAW96C,KAAK+6C,UAChB5e,EAAS4d,EAAK/5C,KAAKg7C,YAAa18C,EAAGqiD,GAEvC,OAAQ7F,GAAkB,MAALx8C,KAAcqiD,GAAWwI,GAA4B,mBAAL7qD,GAEjE,IAAIu8C,GAAc1e,EAAQ2e,GAD1B3e,OAeVnC,GAAOovB,QAAU,QAGjBpvB,GAAOr/B,UAAU0iC,MA7OjB,WAEE,OADAr9B,KAAK+6C,WAAY,EACV/6C,MA4OTg6B,GAAOr/B,UAAUyG,SA7NjB,WACE,OAAOf,EAAOL,KAAKg7C,cA6NrBhhB,GAAOr/B,UAAU4C,MAAQqmD,GACzB5pB,GAAOr/B,UAAUwmD,QAAUyC,GAG3Bn9C,GAAQ,CAAC,OAAQ,MAAO,UAAU,SAAS88C,GACzC,IAAIxJ,EAAOT,EAASiK,GACpBvpB,GAAOr/B,UAAU4oD,GAAc,WAC7B,IAAIzI,EAAW96C,KAAK+6C,UAChB5e,EAAS4d,EAAK38C,MAAM4C,KAAKg7C,YAAa99C,WAE1C,OAAO49C,EACH,IAAID,GAAc1e,EAAQ2e,GAC1B3e,MAKR11B,GAAQ,CAAC,OAAQ,UAAW,OAAQ,YAAY,SAAS88C,GACvD,IAAIxJ,EAAOT,EAASiK,GACpBvpB,GAAOr/B,UAAU4oD,GAAc,WAE7B,OADAxJ,EAAK38C,MAAM4C,KAAKg7C,YAAa99C,WACtB8C,SAKXyG,GAAQ,CAAC,SAAU,QAAS,WAAW,SAAS88C,GAC9C,IAAIxJ,EAAOT,EAASiK,GACpBvpB,GAAOr/B,UAAU4oD,GAAc,WAC7B,OAAO,IAAI1I,GAAcd,EAAK38C,MAAM4C,KAAKg7C,YAAa99C,WAAY8C,KAAK+6C,eAIpE/gB,GAMDif,GAgBC7B,GAAeC,EAElBC,GACDD,EAAW54C,QAAUyuB,GAAGA,EAAIA,EAI7BkqB,EAAYlqB,EAAIA,EAKlBhb,EAAKgb,EAAIA,IAEX/xB,KAAK6E,QAEJ7E,KAAK6E,KAAuB,oBAAX8rB,OAAyBA,OAAyB,oBAATC,KAAuBA,KAAyB,oBAAXnsB,OAAyBA,OAAS,KAClI,KAAK,GAAG,CAAC,GAvkVoU,CAukVhU,MAUf7F,EAAO,sBAAsB,CAAC,cAAc,SAAUiyB,GAEpD,MAAM5R,EAAIhY,SAEJskB,EAAU,IAAItmB,OAAO,kCAmB3B,MAAO,CAML8D,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MACnBoE,MAAMuiB,IAKVviB,MAAQ,SAAUuiB,GAChB3mB,KAAK6wB,MAAQ,IAAI7W,OAAO,GAGxB,IAAI4M,EAAOxM,EAAE/X,cAAc,OAC3BukB,EAAKrf,UAAYof,EAEjB,MAAM0G,EAAI,IAAIrB,EAAMK,SAASoF,MAAM,CACjC0W,UAAa,IA2Bf,OAxBA9a,EAAE2E,SAAS,CACTmH,QAAY,GACZrD,QAAY,GACZmC,QAAY,GACZE,QAAY,KAEd9K,EAAE4lB,oBAAoB,IAEtBjzC,KAAKqpD,OAASh8B,EAGdrtB,KAAKspD,SACHtpD,KAAK6wB,QACL,CAAE04B,MAAU,SAIdvpD,KAAKmnB,OAAO,EAAGP,EAAKnhB,gBAAYpG,GAGH,IAAzBguB,EAAEY,SAAS,GAAG3xB,QAChB+wB,EAAEqG,WAAW,GAEf9M,OAAOvnB,EACAW,MAITwpD,GAAK,SAAUtnD,GACb,OAAOkY,EAAEqvC,gBAzEC,6BAyEsBvnD,IAOlCisB,MAAQ,WACN,OAAOnuB,KAAK6wB,OAKdy4B,SAAW,SAAU1qD,EAAI3D,GAIvB,OAHAA,EAAW,MAnFF,GAoFTA,EAAY,OApFU,GAqFtB+E,KAAKqpD,OAAOp3B,QAAQrzB,EAAI3D,GACjBA,GAKTyuD,SAAW,SAAUpmD,EAAKghB,GACxBtkB,KAAKqpD,OAAO56B,QAAQnrB,EAAKghB,IAK3BqlC,OAAS,SAAUr6C,GACjB,OAAOA,EAAM7S,QAAQiqB,EAAS,OAKhCS,OAAS,SAAU7W,EAAQ9K,EAAUmiB,GAsDnC,OArDAniB,EAASiB,SAAQ,SAAS2W,GAGxB,GAAkB,GAAdA,EAAElX,SAGJ,GAAIkX,EAAE2K,aAAa,SAAU,CAG3B,MAAMnpB,EAAKoB,KAAK6wB,QAEV51B,EAAM+E,KAAKspD,SAAS1qD,EAAI,CAC5B2qD,MAAU,SACVl7B,MAAUruB,KAAK2pD,OAAOvsC,EAAE2K,aAAa,iBAG1B1oB,IAATsoB,IACF1sB,EAAIsuD,OAAS,SAGfvpD,KAAK0pD,SAASp5C,EAAQ1R,GAGlBwe,EAAE+K,iBACJnoB,KAAKmnB,OAAOvoB,EAAIwe,EAAE3X,WAAYkiB,QAIzBvK,EAAE+K,iBAETnoB,KAAKmnB,OACH7W,EACA8M,EAAE3X,WACY,SAAd2X,EAAEoI,SAA4BmC,QAM/B,GAAkB,GAAdvK,EAAElX,UAELkX,EAAErX,UAAUsR,MAAM,cAAe,CAGnC,MAAMzY,EAAKoB,KAAK6wB,QAChB7wB,KAAKspD,SAAS1qD,EAAI,CAChB2qD,MAAU,OACVl7B,MAAUjR,EAAErX,YAGd/F,KAAK0pD,SAASp5C,EAAQ1R,MAEzBoB,MACIA,MAKTuN,KAAO,aAUPq8C,OAAS,WACP,QAAiBvqD,IAAbW,KAAKiF,IACP,OAEF,MAAM4kD,EAAU7pD,KAAKiF,IAAIY,WACnBikD,EAASzC,WAAWznD,OAAOmqD,iBAAiB/pD,KAAKiF,KAAKmqB,OACtD46B,EAAY3C,WAAWznD,OAAOmqD,iBAAiBF,GAASz6B,OAG1D06B,EAASE,IACXH,EAAQI,YAAcH,EAASE,GAAa,IAQhDE,SAAW,WAGT,MAAMC,EAAa/vC,EAAE/X,cAAc,OACnC8nD,EAAW5iD,UAAYvH,KAAK+E,UAAUqlD,UAEtC,MAAMC,EAAMF,EAAWtpD,WACjBsI,EAAQnJ,KAAKwpD,GAAG,SAYtB,OAVAa,EAAIzkD,qBAAqB,QAAQ,GAAGzD,YAAYgH,GAEhDA,EAAM5B,UACL,kSAOM+iD,KAAK9B,SAAS+B,mBAAmBF,EAAID,YAAY3tD,QAAQ,UAAW,OAO7EsI,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAEd,MAAMooB,EAAIrtB,KAAKqpD,OACfr9B,EAAMM,OAAOe,GAEb,MAAMm9B,EAASxqD,KAAKwpD,GAAG,OACvBxpD,KAAKiF,IAAMulD,EAEXA,EAAOroD,YAAYnC,KAAKwpD,GAAG,SAG3B,MAAM95C,EAAO1P,KAEb,IAAIsD,EAAKghB,EAAQ9lB,EAEjB6uB,EAAEuB,QAAQnoB,SACR,SAAU/H,GACR4E,EAAM+pB,EAAEzsB,KAAKlC,EAAEqF,GACfugB,EAAS+I,EAAEzsB,KAAKlC,EAAEwvB,GAClB1vB,EAAIkR,EAAK85C,GAAG,QACZhrD,EAAEisD,eAAe,KAAM,IA5O/B,SAAgBnnD,EAAKghB,GACnB,MAAMomC,EAAKpnD,EAAI8sB,EACTu6B,EAAKrnD,EAAI4sB,EACT06B,EAAKtmC,EAAO8L,EACZy6B,EAAKvmC,EAAO4L,EAAI5L,EAAO5a,OAAS,EAGtC,MAAO,KAAOghD,EAAK,IAAMC,EAAlB,MACED,EAAK,IAAMC,EAAK,IACvBC,EAAK,KAAOC,GAAMA,EAAKF,GAAM,GAAM,IACnCC,EAAK,IAAMC,EAkOqBC,CAAMxnD,EAAKghB,IACvC9lB,EAAEqD,UAAUE,IAAI,QAChByoD,EAAOroD,YAAY3D,MAIvB,IAAIkL,EAAS2jB,EAAEE,QAAQ7jB,OAgFvB,OA7EA2jB,EAAEc,QAAQ1nB,SACR,SAAU1C,GACRA,EAAIspB,EAAEzsB,KAAKmD,GACX,MAAMiO,EAAQtC,EAAK85C,GAAG,KACtBx3C,EAAMpI,aAAa,QAAS7F,EAAEwlD,OAG9B,MAAM/d,EAAOx5B,EAAM7P,YAAYuN,EAAK85C,GAAG,SAevC,GAdAhe,EAAK5hC,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACvCoc,EAAK5hC,aAAa,IAAK7F,EAAEmsB,EAAInsB,EAAE2F,OAAS,GACxC8hC,EAAK5hC,aAAa,KAAM,GACxB4hC,EAAK5hC,aAAa,KAAM,GACxB4hC,EAAK5hC,aAAa,QAAS7F,EAAEqrB,OAC7Boc,EAAK5hC,aAAa,SAAU7F,EAAE2F,QAEd,SAAZ3F,EAAEwlD,YAAgClqD,IAAZ0E,EAAEsqB,QAC1Bmd,EAAK5hC,aAAa,QAAS7F,EAAE2F,QAC7B8hC,EAAK5hC,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAE2F,OAAS,GACxC8hC,EAAK5hC,aAAa,QAAS,eAIbvK,IAAZ0E,EAAEsqB,MAAqB,CACzB,MAAM9rB,EAAOyP,EAAM7P,YAAYuN,EAAK85C,GAAG,SACvC,IAAIt5B,EAAInsB,EAAEmsB,EAAInsB,EAAE2F,OAAS,EACzBnH,EAAKqH,aAAa,IAAKsmB,GACvB3tB,EAAKqH,aACH,YACA,aAAe7F,EAAEqrB,MAAM,EAAI,KAAQrrB,EAAE2F,OAAS,EAAK,GAAK,KAG1D,MAAMi8B,EAAS5hC,EAAEsqB,MAAM5xB,QAAQ,UAAW,KACnCA,QAAQ,SAAU,KAClBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KAExB,GAAgB,SAAZsH,EAAEwlD,MAAkB,CACtBhnD,EAAKqH,aAAa,QAAS+7B,GAE3B,IACIolB,EADAzsD,EAAI,EAERqnC,EAAOxpC,MAAM,KAAKsK,SAAQ,SAASjI,GAChB,IAAbA,EAAElC,SAGNyuD,EAAQr7C,EAAK85C,GAAG,SAChBuB,EAAM5oD,YAAYiY,EAAE5X,eAAehE,IAEzB,IAANF,EACFysD,EAAMnhD,aAAa,KAAMohD,QAEzB1sD,EAAI,EAENysD,EAAMnhD,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACxCc,GA9S6B,GA+S7B3tB,EAAKJ,YAAY4oD,OAGnB76B,GAlT+B,GAqT3BA,EAAIxmB,IACNA,EAASwmB,OAER,CACH,MAAM66B,EAAQr7C,EAAK85C,GAAG,SACtBuB,EAAM5oD,YAAYiY,EAAE5X,eAAemjC,IACnColB,EAAMnhD,aAAa,IAAK7F,EAAEqsB,EAAIrsB,EAAEqrB,MAAQ,GACxC7sB,EAAKJ,YAAY4oD,IAGrBP,EAAOroD,YAAY6P,MAIvBw4C,EAAO5gD,aAAa,QAASyjB,EAAEE,QAAQ6B,OACvCo7B,EAAO5gD,aAAa,SAAUF,GACvB1J,KAAKiF,KAGdgmD,aAAe,WACb,MAAMt3C,EAAIyG,EAAE/X,cAAc,KAM1B,OALAsR,EAAE/J,aAAa,YAAa,iBAC5B+J,EAAE/J,aAAa,OAAQ,6BAA+B5J,KAAKkqD,YAC3Dv2C,EAAE/J,aAAa,WAAY,YAC3B+J,EAAE2Q,OAAS,SACX3Q,EAAE/J,aAAa,MAAO,uBACf+J,OAYb5Z,EAAO,gBAAgB,IAAI,WAEzB,MACM2sB,EAAU,IAAItmB,OAAO,kCACrBga,EAAIhY,SAEV,MAAO,CACL8B,OAAS,SAAUyiB,GACjB,OAAOjsB,OAAOwJ,OAAOlE,MAAMoE,MAAMuiB,IAInCviB,MAAQ,SAAUuiB,GAEhB,MAAM7f,EAAI9G,KAoBV,GAjBA8G,EAAEokD,QAAW,GACbpkD,EAAEqkD,MAAW,GACbrkD,EAAEskD,eAAiB,GACnBtkD,EAAEukD,GAAK,EACPvkD,EAAEwkD,qBAAkBjsD,EAGpByH,EAAEykD,OAAc,IAChBzkD,EAAE0kD,YAAc,GAChB1kD,EAAE2kD,QAAc,GAChB3kD,EAAE4kD,WAAc,EAChB5kD,EAAE6kD,YAAc,GAChB7kD,EAAE8kD,SAAc,GAChB9kD,EAAE+kD,SAAc,GAChB/kD,EAAEglD,SAAc,EAGDzsD,MAAXsnB,GAAmC,MAAXA,EAC1B,OAAO7f,EAGT,MAAM8f,EAAOxM,EAAE/X,cAAc,OAC7BukB,EAAKrf,UAAYof,EAGjB7f,EAAEilD,KAAO,CACPznC,OAAS,GACTsK,MAAS,GACTroB,IAAS,GAIXO,EAAEqgB,OAAO,EAAGP,EAAKnhB,gBAAYpG,GAG7B,MAAM2sD,EAAYllD,EAAEilD,KAAa,OAGjC,IAAIE,EAAU3nC,EAAQ4nC,EAoCtB,OAtCcplD,EAAEilD,KAAY,MAOtBtlD,SAAQ,SAASgnB,GAGrBw+B,EAAWx+B,EAAKw+B,SAChB3nC,EAAS0nC,EAAUC,GAEL5sD,MAAVilB,IAWF4nC,EAAW,CACT5hC,MAAQ,CAACmD,EAAK0+B,SAAU1+B,EAAK2+B,QAC7BpT,IAAM10B,EACN+nC,UAAY,MACZh+B,MAAQZ,EAAKY,OAGfruB,KAAKssD,OAAOJ,MAEbplD,UAGIA,EAAQ,KAER9G,MAITmnB,OAAS,SAAU7W,EAAQ9K,EAAUmiB,GAGnCjc,MAAMma,KAAKrgB,GAAUiB,SAAQ,SAAS2W,GAGpC,GAAkB,GAAdA,EAAElX,SAAe,CAEnB,IAAIqmD,EAAOjoC,EAAQgG,EAAO0uB,EAG1B,GAAI57B,EAAEyK,aAAa,UAGjB0kC,EAAQnvC,EAAE2K,aAAa,UAEvBuC,EAAQtqB,KAAK+rD,KAAU,IACvB/S,EAAMh5C,KAAK+rD,KAAU,SAKlB,GAAI3uC,EAAEyK,aAAa,cAGtB,GAAoC,SAAhCzK,EAAE2K,aAAa,eACf3K,EAAEyK,aAAa,gBACkB,QAAjCzK,EAAE2K,aAAa,eAEjBwkC,EAAQnvC,EAAE2K,aAAa,cAActrB,QAAQ,KAAM,IACnD6tB,EAAQtqB,KAAK+rD,KAAU,IACvB/S,EAAMh5C,KAAK+rD,KAAU,QAQlB,CACH,IAAI19B,EAGJ/J,EAASlH,EAAE2K,aAAa,cAActrB,QAAQ,KAAM,IAEhD2gB,EAAEyK,aAAa,iBACjBwG,EAAQruB,KAAK2pD,OAAOvsC,EAAE2K,aAAa,iBAKrC,IAAI0F,EAAO,CACTY,MAAWA,EACX89B,SAAWnsD,KAAK+rD,KAAU,IAC1BE,SAAW3nC,GAIR+J,EAAMhX,MAAM,QAAWgX,EAAMhX,MAAM,UACtCrX,KAAK+rD,KAAY,MAAE5uD,KAAKswB,GAa9B,GANIrQ,EAAE+K,iBACJnoB,KAAKmnB,OAAO,EAAG/J,EAAE3X,WAAYkiB,QAKjBtoB,IAAVktD,EAAqB,CAKvB,QAAmCltD,IAA/BW,KAAK+rD,KAAa,OAAEQ,GAAsB,CAC5C,MAAMC,EAAYxsD,KAAK+rD,KAAa,OAAEQ,GACtCvT,EAAMh5C,KAAK+rD,KAAU,IAAI,EACzBS,EAAU,GAAKliC,EAAQkiC,EAAU,GAAKliC,EAAQkiC,EAAU,GACxDA,EAAU,GAAKxT,EAAMwT,EAAU,GAAKxT,EAAMwT,EAAU,QAKpDxT,EAAMh5C,KAAK+rD,KAAU,IAAI,EACzB/rD,KAAK+rD,KAAa,OAAEQ,GAAS,CAACjiC,EAAO0uB,GAUvCuT,OAAQltD,YAIUA,IAAXilB,IAGPmJ,EAAa,OAAIztB,KAAK+rD,KAAU,IAAG,EAUnCznC,OAASjlB,QAKR,GAAkB,GAAd+d,EAAElX,eAGW7G,IAAhB+d,EAAErX,UAAyB,CAE7B,MAAMmN,EAAMkK,EAAErX,UAAUM,YAEZhH,IAAR6T,GAAqBA,EAAI5W,OAAS,IAGpC0D,KAAKysD,SAASv5C,GAGdlT,KAAK+rD,KAAU,UAIpB/rD,OAOL2pD,OAAS,SAAUr6C,GACjB,OAAOA,EAAM7S,QAAQiqB,EAAS,OAQhC0hB,KAAO,WACL,OAAOpoC,KAAKkrD,QAAQ5uD,QAKtBktD,GAAK,SAAUtnD,GACb,OAAOkY,EAAEqvC,gBA5PC,6BA4PsBvnD,IAKlCwqD,MAAQ,SAAU9rD,GAChB,GAAoB,SAAhBA,EAAK4kB,UAAuBmnC,UAAUC,UAAUv1C,MAAM,QAAS,CACjE,MAAM6b,EAAQ9Y,EAAEyyC,cAChB35B,EAAM45B,WAAWlsD,GACjB,MAAM4qC,EAAOtY,EAAMhkB,wBAEnB,OADAgkB,EAAM65B,SACCvhB,EAET,OAAO5qC,EAAKsO,yBAKd89C,YAAc,SAAUpsD,GACvB,MAAMqsD,EAAMjtD,KAAK0sD,MAAM9rD,GACvB,OAAOqsD,EAAI99C,KAAQ89C,EAAI79B,MAAQ,GAKhC89B,YAAc,SAAUC,GAGtB,MAAMC,EAAWptD,KAAK0sD,MAAM1sD,KAAKorD,eAAe+B,EAAO7U,QACjD+U,EAAWrtD,KAAK0sD,MAAM1sD,KAAKorD,eAAe+B,EAAO71B,OAEjDpH,EAAIlwB,KAAKqrD,GAAM8B,EAAOG,SAAWttD,KAAK0rD,WAAc1rD,KAAK2rD,YACzDnrC,EAAIxgB,KAAKwpD,GAAG,QAEnBxpD,KAAKutD,aAAaprD,YAAYqe,GAE7B,MAAMgtC,EAAU,MACXJ,EAASj+C,KAAOnP,KAAKytD,YACtB,IACAv9B,EACA,OACCm9B,EAAQK,MAAQ1tD,KAAKytD,YACtB,IAAMv9B,EAMV,OAJA1P,EAAE5W,aAAa,IAAK4jD,GACpBhtC,EAAE5W,aAAa,QAAS,UACxBujD,EAAOpoD,QAAUyb,EACjB2sC,EAAOj9B,EAAIA,EACJ1P,GAMTmtC,SAAW,SAAUC,GAEnB,MAAM9mD,EAAI9G,KACV,IAAI6tD,EAAUC,EACVC,EAAS/tD,KAAKqrD,GACd2C,EAAOhuD,KAAKqrD,QAEQhsD,IAApBuuD,EAAIK,aACNJ,EAAW/mD,EAAEkmD,YAAYY,EAAIK,YAAYlpD,SACzCgpD,EAASH,EAAIK,YAAY/9B,GAGzB29B,EAAW/mD,EAAEkmD,YAAYlmD,EAAEskD,eAAewC,EAAItV,aAG1Bj5C,IAAlBuuD,EAAIM,WACNJ,EAAShnD,EAAEkmD,YAAYY,EAAIM,UAAUnpD,SACrCipD,EAAOJ,EAAIM,UAAUh+B,GAGrB49B,EAAShnD,EAAEkmD,YAAYlmD,EAAEskD,eAAewC,EAAIt2B,OAG9Cu2B,GAAY/mD,EAAE2mD,WACdK,GAAUhnD,EAAE2mD,WAGZ,IAAIH,EAAWM,EAAIN,SACfO,GAAYC,IACdD,GAAY/mD,EAAE0kD,YAAc,EAC5BsC,GAAYhnD,EAAE0kD,YAAc,EAC5B8B,GAAY,IAGd,MAAMjgC,EAAIvmB,EAAE0iD,GAAG,KACfn8B,EAAEzjB,aAAa,QAAS,OACxB,MAAMpL,EAAI6uB,EAAElrB,YAAY2E,EAAE0iD,GAAG,SAC7BhrD,EAAEoL,aAAa,QAAS,QAGxB9C,EAAEymD,aAAaprD,YAAYkrB,GAG3B,IAAI8gC,EAASp7B,KAAKwE,IAAIu2B,EAASD,GAAY,EAIvCO,EAAUtnD,EAAE2kD,QAAW6B,EAAWxmD,EAAE0kD,YAAgB2C,EAAS,EAGjEC,EAAUA,EAAUtnD,EAAEykD,OAAS6C,EAAUtnD,EAAEykD,OAE3C,IAAIn7B,EAAI2C,KAAKsF,IAAIw1B,EAAUC,GAG3B,IAAIO,EAAYL,EAAOI,EAEvB,MAAME,EAAO,KAAMT,EAAW,IAAME,EAChC,MAAQF,EAAW,IAAMQ,EACzB,IAAMP,EAAS,IAAMO,EACrB,IAAMP,EAAS,IAAME,EAWzB,GATAxvD,EAAEoL,aAAa,IAAK0kD,QAEEjvD,IAAlBuuD,EAAIvB,YACN7tD,EAAEoL,aAAa,aAAc,aACP,OAAlBgkD,EAAIvB,WACN7tD,EAAEoL,aAAa,eAAgB,mBAIjBvK,IAAduuD,EAAIv/B,MACN,OAAOhB,EAST,IAAIkhC,IAAaR,EAASM,GAAY,EAAKA,GAAY,EAGvD,MAAMhgC,EAAQruB,KAAKwpD,GAAG,KACtBn7B,EAAMzkB,aAAa,QAAS,SAC5B9C,EAAE0nD,eAAersD,YAAYksB,GAG7BA,EAAMogC,OAASphC,EAEf,MAAM3d,EAAO5I,EACbunB,EAAMvkB,iBAAiB,cAAc,WACnC4F,EAAKg/C,QAAQ1uD,SAGf,MAAM2uD,EAAStgC,EAAMlsB,YAAY2E,EAAE0iD,GAAG,SACtCmF,EAAO/kD,aAAa,IAAKwmB,EAAI+9B,GAC7BQ,EAAO/kD,aAAa,IAAK2kD,EAAU,GACnCI,EAAO/kD,aAAa,cAAe,UACnC,MAAMglD,EAAWx0C,EAAE5X,eAAeorD,EAAIv/B,OACtCsgC,EAAOxsD,YAAYysD,GAEnB,MAAMC,EAAaF,EAAOG,UAOpBC,EAAaF,EAASz/B,MACtB4/B,EAAaH,EAASnlD,OAGtBulD,EAAS5gC,EAAM3nB,aAAaI,EAAE0iD,GAAG,QAASmF,GAC1CO,EAAWH,EAAY,EAAIjoD,EAAE+kD,SACnCoD,EAAOrlD,aAAa,IAAKwmB,EAAI+9B,EAAUe,EAAW,GAClDD,EAAOrlD,aAAa,KAAM,GAC1BqlD,EAAOrlD,aAAa,IAAKilD,EAAS3+B,EAAIppB,EAAEglD,UACxCmD,EAAOrlD,aAAa,QAASslD,GAC7BD,EAAOrlD,aAAa,SAAUolD,EAAa,EAAIloD,EAAEglD,WAOnD/mD,QAAU,WACR,QAAiB1F,IAAbW,KAAKiF,IACP,OAAOjF,KAAKiF,IAGd,MAAMolD,EAAMrqD,KAAKwpD,GAAG,OAEpB5pD,OAAOkK,iBAAiB,SAAU,WAKhC9J,KAAKuN,QACLnI,KAAKpF,OAGP,MACMmvD,EADO9E,EAAIloD,YAAYnC,KAAKwpD,GAAG,SACjBrnD,YAAYnC,KAAKwpD,GAAG,WACxC2F,EAAOvlD,aAAa,OAAQ,GAC5BulD,EAAOvlD,aAAa,KAAM,OAC1BulD,EAAOvlD,aAAa,SAAU,sBAC9BulD,EAAOvlD,aAAa,cAAc,kBAElC,MAAMwlD,EAAQpvD,KAAKwpD,GAAG,QAMtB,OALA4F,EAAMxlD,aAAa,YAAa,cAChCwlD,EAAMxlD,aAAa,IAAK,qBACxBulD,EAAOhtD,YAAYitD,GAEnBpvD,KAAKiF,IAAMolD,EACJrqD,KAAKiF,KAMdqnD,OAAS,SAAU+C,GAEjB,OADArvD,KAAKmrD,MAAMhuD,KAAKkyD,GACTrvD,MAKTysD,SAAW,SAASxmC,GAElB,OADAjmB,KAAKkrD,QAAQ/tD,KAAK8oB,GACXjmB,MAKT0uD,QAAU,SAAU3pD,GAClB,IAAIuqD,EAEJ,GAAItvD,KAAKsrD,gBAAiB,CAGxB,GAAItrD,KAAKsrD,kBAAoBvmD,EAC3B,OAEFuqD,EAAMtvD,KAAKsrD,gBACXgE,EAAIztD,UAAUG,OAAO,WACrBstD,EAAIb,OAAO5sD,UAAUG,OAAO,WAG9BstD,EAAMtvD,KAAKsrD,gBAAkBvmD,EAC7B/E,KAAKwuD,eAAersD,YAAYmtD,GAChCtvD,KAAKutD,aAAaprD,YAAYmtD,EAAIb,QAClCa,EAAIztD,UAAUE,IAAI,WAClButD,EAAIb,OAAO5sD,UAAUE,IAAI,YAQ3BwtD,UAAY,WAMV,IAAIC,EAAU,GAYd,MAAMC,EAAazvD,KAAKmrD,MAAM/uD,KAAI,SAAU2H,GAG1C,GAAIA,EAAEumB,iBAAiB5e,MAErB,GAAI3H,EAAEumB,MAAM,IAAMvmB,EAAEumB,MAAM,GACxBvmB,EAAEumB,MAAQvmB,EAAEumB,MAAM,OAGf,CAEH,MAAM6jC,EAASp7B,KAAKoS,KAAKpS,KAAKwE,IAAIxzB,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,IAAM,GAAKvmB,EAAEumB,MAAM,GAG1E,IAAIolC,EAAY,IAAM3rD,EAAEumB,MAAM,GAAK,IAAMvmB,EAAEumB,MAAM,GAG7CvmB,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,KACvBolC,EAAY,IAAM3rD,EAAEumB,MAAM,GAAK,IAAMvmB,EAAEumB,MAAM,IAI/C,IAAI6iC,EAASqC,EAAQE,QACNrwD,IAAX8tD,IACFA,EAAS,CACP7U,MAAWv0C,EAAEumB,MAAM,GACnBgN,KAAWvzB,EAAEumB,MAAM,GACnBhuB,OAAWyH,EAAEumB,MAAM,GAAKvmB,EAAEumB,MAAM,IAElCklC,EAAQE,GAAavC,GAGvBppD,EAAEkqD,YAAcd,EAGhBppD,EAAEumB,MAAQ6jC,EAId,GAAIpqD,EAAEi1C,eAAettC,MAEnB,GAAI3H,EAAEi1C,IAAI,IAAMj1C,EAAEi1C,IAAI,GACpBj1C,EAAEi1C,IAAMj1C,EAAEi1C,IAAI,OAGX,CAEH,MAAMmV,EAASp7B,KAAKwE,IAAIxzB,EAAEi1C,IAAI,GAAKj1C,EAAEi1C,IAAI,IAAMj1C,EAAEi1C,IAAI,GAGrD,IAAI0W,EAAY,IAAM3rD,EAAEi1C,IAAI,GAAK,IAAMj1C,EAAEi1C,IAAI,GAGzCj1C,EAAEi1C,IAAI,GAAKj1C,EAAEi1C,IAAI,KACnB0W,EAAY,IAAM3rD,EAAEi1C,IAAI,GAAK,IAAMj1C,EAAEi1C,IAAI,IAI3C,IAAImU,EAASqC,EAAQE,QACNrwD,IAAX8tD,IACFA,EAAS,CACP7U,MAAWv0C,EAAEi1C,IAAI,GACjB1hB,KAAWvzB,EAAEi1C,IAAI,GACjB18C,OAAWyH,EAAEi1C,IAAI,GAAKj1C,EAAEi1C,IAAI,IAE9BwW,EAAQE,GAAavC,GAGvBppD,EAAEmqD,UAAYf,EAGdppD,EAAEi1C,IAAMmV,EAgBZ,OAZApqD,EAAEu0C,MAAQv0C,EAAEumB,MACZvmB,EAAEuzB,KAAQvzB,EAAEi1C,IAGRj1C,EAAEumB,MAAQvmB,EAAEi1C,IACdj1C,EAAEzH,OAASyH,EAAEi1C,IAAMj1C,EAAEumB,MAIrBvmB,EAAEzH,OAASyH,EAAEumB,MAAQvmB,EAAEi1C,IAGlBj1C,KAIT0rD,EAAWjrC,MAAK,SAAU7Q,EAAGlE,GAC3B,OAAIkE,EAAErX,OAASmT,EAAEnT,QACP,EAED,KAIX0D,KAAK2vD,YAAiBC,EAAWH,GAAY,GAC7CzvD,KAAK6vD,eAAiBD,EAAWl1D,OAAOysC,OAAOqoB,IAAU,IAS3D5F,OAAS,WACP,QAAiBvqD,IAAbW,KAAKiF,IACR,OAED,MAAM4kD,EAAU7pD,KAAKiF,IAAIY,WAEnBikD,EAASzC,WAAWznD,OAAOmqD,iBAAiB/pD,KAAKiF,KAAKmqB,OACtD46B,EAAY3C,WAAWznD,OAAOmqD,iBAAiBF,GAASz6B,OAE9D,GAAI06B,EAASE,EAAW,CACvB,IAAI8F,GAAehG,EAASE,GAAa,EACzCH,EAAQI,WAAa6F,IAMxBviD,KAAO,WACL,MAAMzG,EAAI9G,KACJqqD,EAAMrqD,KAAKiF,IACXyE,EAAS1J,KAAKurD,YAGqBlsD,IAArCgrD,EAAIzkD,qBAAqB,KAAK,KAChCykD,EAAIvpD,YACFupD,EAAIzkD,qBAAqB,KAAK,IAEhCkB,EAAEskD,eAAiB,IAGrB,MAAM/9B,EAAIg9B,EAAIloD,YAAY2E,EAAE0iD,GAAG,MAGzBjnD,EAAO8qB,EAAElrB,YAAY2E,EAAE0iD,GAAG,SAChCjnD,EAAKqH,aAAa,QAAS,QAC3BrH,EAAKqH,aAAa,cAAe,SACjCrH,EAAKqH,aAAa,IAAKF,GAGvB5C,EAAEukD,GAAK3hD,EAAU5C,EAAa,YAG9B,MAAMi+B,EAAKxiC,EAAKJ,YAAY2E,EAAE0iD,GAAG,UACjCzkB,EAAG5iC,YAAYiY,EAAE5X,eAAe,MAChCuiC,EAAG57B,MAAM4mD,WAAa,QAEtBjpD,EAAEokD,QAAQzkD,SAAQ,SAASupD,GAGzB,MAAMjF,EAAQxoD,EAAKJ,YAAYnC,KAAKwpD,GAAG,UACvCuB,EAAM5oD,YAAYiY,EAAE5X,eAAewtD,IACnCjF,EAAMnhD,aAAa,cAAe,UAElC5J,KAAKorD,eAAejuD,KAAK4tD,GAGzBA,EAAMnhD,aAAa,KAAM5J,KAAK4rD,YAC7B9kD,GAGHA,EAAE2mD,WAAa3mD,EAAE4lD,MAAMr/B,GAAGle,KAG1B,MAAM8gD,EAAO5iC,EAAElrB,YAAY2E,EAAE0iD,GAAG,MAChC1iD,EAAEymD,aAAe0C,EACjBA,EAAKpuD,UAAUE,IAAI,QAEnB,MAAMmuD,EAAS7iC,EAAElrB,YAAY2E,EAAE0iD,GAAG,MAClC1iD,EAAE0nD,eAAiB0B,EACnBA,EAAOruD,UAAUE,IAAI,eAGC1C,IAAlByH,EAAE6oD,aACJ7oD,EAAEyoD,YAGJzoD,EAAE+oD,eAAeppD,QACf1K,GAAK+K,EAAEomD,YAAYnxD,IAIrB+K,EAAE6oD,YAAYlpD,QACZ1K,GAAK+K,EAAE6mD,SAAS5xD,IAIlBsuD,EAAIzgD,aAAa,QAAS9C,EAAE4lD,MAAMnqD,GAAM6sB,MAAQ,IAChDi7B,EAAIzgD,aAAa,SAAUF,EAAS,IACpC2gD,EAAIzgD,aAAa,QAAS,aAK9B,SAASgmD,EAAY3kD,EAAMklD,GAQzB,IAAIviC,EAAQ,GAgDZ,OA7CA3iB,EAAKxE,SAAQ,SAASm7C,GAGpB,IACI7xC,EADAu9C,EAAW,EAEf,IAAK,IAAItxD,EAAK4xB,EAAMtxB,OAAS,EAAIN,GAAK,EAAGA,IAAK,CAI5C,GAHA+T,EAAQ6d,EAAM5xB,GAGV4lD,EAAQtJ,OAASvoC,EAAMuoC,OAASsJ,EAAQtqB,MAAQvnB,EAAMunB,KAAM,CAC9Dg2B,EAAWv9C,EAAMu9C,SAAW,EAC5B,MAIO1L,EAAQtJ,OAASvoC,EAAMuoC,OAASsJ,EAAQtqB,MAAQvnB,EAAMuoC,OAEzD6X,GAAcvO,EAAQtJ,OAASvoC,EAAMuoC,OAASsJ,EAAQtqB,MAAQvnB,EAAMuoC,SACtEgV,EAAWv9C,EAAMu9C,UAAY1L,EAAQtlD,QAAUyT,EAAMzT,OAAS,EAAI,IAK7DslD,EAAQtJ,OAASvoC,EAAMunB,MAAQsqB,EAAQtqB,MAAQvnB,EAAMunB,OAExD64B,GAAcvO,EAAQtJ,OAASvoC,EAAMunB,MAAQsqB,EAAQtqB,MAAQvnB,EAAMunB,QACrEg2B,EAAWv9C,EAAMu9C,UAAY1L,EAAQtlD,QAAUyT,EAAMzT,OAAS,EAAI,IAMxEslD,EAAQ0L,SAAWA,EAEnB1/B,EAAMzwB,KAAKykD,GAMXh0B,EAAMpJ,MAAK,SAAU7Q,EAAElE,GACrBA,EAAE69C,SAAW35C,EAAE25C,eAIZ1/B,MAMX7zB,EAAO,uBAAuB,CAC5B,OACA,sBACA,kBACC,SAAUmkB,EAAWkyC,EAAyBC,GAE/C,MAAMj2C,EAAIhY,SACJO,EAAQ9C,MAAM6C,OAIpB,OAHAC,EAAIif,SAAWjf,EAAIif,UAAY,WAGxB,CACL1d,OAAS,SAAUmT,EAAMwM,EAAQE,EAAM3gB,GACrC,OAAO1I,OAAOwJ,OAAOga,GAClB9Z,MAAM,CAAC,cACPC,UAAUrE,MACVoE,MAAMiT,EAAOwM,EAASE,EAAO3gB,IAKlCgB,MAAQ,SAAUiT,EAAMwM,EAASE,EAAO3gB,GAKtC,OAJApD,KAAK2oB,OAAStR,EACdrX,KAAK8jB,SAAWD,EAChB7jB,KAAKgkB,OAASD,EACd/jB,KAAKsX,MAAQlU,EACNpD,MAOTuN,KAAO,WAEL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAM2xC,EAAYl2C,EAAE/X,cAAc,OAClCiuD,EAAUzuD,UAAUE,IAAI,YAAa,WAGrC,MAAMwuD,EAAKD,EAAUruD,KAAK,MAM1B,OALAsuD,EAAGtuD,KAAK,QAAQK,KAAKtC,KAAK8jB,UAC1BysC,EAAGtuD,KAAK,QAAQK,KAAKtC,KAAKgkB,QAE1BhkB,KAAKwwD,MAAQF,EAAUruD,KAAK,OAErBjC,KAAK2e,MAAQ2xC,GAOtB3yC,WAAa,WAEX,MAAMkG,EAAU7jB,KAAK8jB,SACfC,EAAQ/jB,KAAKgkB,OACb5gB,EAAOpD,KAAKsX,MAEZ5H,EAAO1P,KACPy9B,EAAOz9B,KAAKwwD,MACZF,EAAYtwD,KAAK2e,MAGvB3e,KAAK6oB,QAAQhF,EAASE,EAAO3gB,GAAM,SAAUqtD,GAE3CH,EAAUzuD,UAAUG,OAAO,WAIX,OAAZyuD,EACFhzB,EAAKn7B,KAAK,uBAGVm7B,EAAKt7B,YAAYsuD,EAAQ1rD,WACzB0rD,EAAQljD,OAOK,UAATnK,GAGFsM,EAAK2N,QAAQtb,IACXY,EAAIif,SACJ,CAACrQ,IAAM,CAAC,cAAc,cACtB,SAAU7S,GACR,MAAMiV,EAAI88C,EAAQxF,eAClB7wC,EAAEs2C,KAAKvuD,YAAYwR,GACnBA,EAAEgJ,QACFvC,EAAEs2C,KAAK5vD,YAAY6S,MAKzB88C,EAAQ7G,aAIZ0G,EAAUzuD,UAAUG,OAAO,YAM7BqV,MAAQ,WACN,OAAOrX,KAAK2oB,QAQdE,QAAU,SAAUhF,EAASE,EAAO3gB,EAAMoM,GAGxC,IAEE3P,MAAM4C,IAAIumB,aACRhpB,KAAK2oB,OAAQ,CACXM,OAAU,EACVpF,QAAYA,EACZE,MAAUA,GAEZ,SAAUmF,QACc7pB,IAAlB6pB,QAM6B7pB,IAA7B6pB,EAAuB,QAKvB1Z,EADW,UAATpM,EACCgtD,EAAwBlsD,OAAOglB,EAAuB,SAEzC,SAAT9lB,EACJitD,EAAkBnsD,OAAOglB,EAAuB,SAKhD,MAlBL1Z,EAAG,OAwBLpK,KAAKpF,OAGX,MAAOtB,GACLmB,MAAMsD,IAAI,EAAGzE,GACb8Q,EAAG,QAMPyO,QAAU,WACRje,KAAK2oB,YAAStpB,OAYpBtF,EAAO,cAAc,CACnB,QACA,iBACA,wBACA,kBACA,uBACA,qBACC,SAAUwlB,EAAWoxC,EAAcC,EAAUC,EAASC,EAAcC,GAGrElxD,MAAM4C,IAAIumB,aAAenpB,MAAM4C,IAAIumB,cAAgB,WAEjD,OADAnpB,MAAMsD,IAAI,EAAG,4CACN,IAGT,MAAMR,EAAM9C,MAAM6C,OAMlB,OAJAC,EAAI+e,SAAY/e,EAAI+e,UAAa,SACjC/e,EAAIof,UAAYpf,EAAIof,WAAa,WACjCpf,EAAI8e,QAAY9e,EAAI8e,SAAa,YAE1B,CACLvd,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,cAAcC,UAAUrE,MAAMoE,MAAMiT,IAI9EjT,MAAQ,SAAUiT,GAEhBrX,KAAK2oB,OAAStR,EAEd,MAAM1D,EAAI3T,KAAKqd,QAITzb,EAAK+R,EAAE5O,UAAUlD,UA4CvB,GA3CAD,EAAGI,OAAO,aACVJ,EAAGG,IAAI,oBAGP4R,EAAE5R,IACAY,EAAIof,UAAW,CAACxQ,IAAM,CAAC,eAAe,SAAU7S,GAC9CsB,KAAKgxD,aAKTr9C,EAAE5R,IACAY,EAAI+e,SAAU,CAACnQ,IAAM,CAAC,UAAU,SAAU7S,GACxCsB,KAAKixD,cAKTt9C,EAAE5R,IACAY,EAAI8e,QAAS,CAAClQ,IAAM,CAAC,UAAU,SAAU7S,QAGhBW,IAAnBQ,MAAMqxD,WACRrxD,MAAMqxD,SAAWH,EAAqB7sD,OAAO,GAAIysD,GACjD9wD,MAAMqxD,SAASnsD,UAAU6E,aAAa,KAAM,aAG9C,MAAMunD,EAAKtxD,MAAMqxD,SAGjBC,EAAG3iD,MAAMxO,MAGTmxD,EAAGxlD,UAAU3L,KAAKoxD,iBAGlBD,EAAG5jD,OACH4jD,EAAGxiD,OAAO3O,KAAK2O,QACfwiD,EAAGzmD,WAKH7K,MAAMwxD,OAAQ,CAChB,MAAMC,EAAezxD,MAAMwxD,OAAOjzC,YAAY,SAC1CkzC,GAGFA,EAAa7qD,QAAQQ,GAAK0M,EAAE5R,IAAI3E,MAAMuW,EAAG1M,IAI7C,OAAOjH,MAOTgxD,QAAU,WACR,MAAMlqD,EAAI9G,KACN8G,EAAEyqD,WAAazqD,EAAEyqD,UAAUjjD,UAG/BxH,EAAEyqD,UAAYV,EAAS3sD,OAAO4C,EAAE6hB,QAChC7hB,EAAE/E,IAAI+E,EAAEyqD,aAOVN,SAAW,WACT,MAAMnqD,EAAI9G,KACN8G,EAAE0qD,YAAc1qD,EAAE0qD,WAAWljD,UAEjCxH,EAAE0qD,WAAaZ,EAAU1sD,OAAO4C,EAAE6hB,QAClC7hB,EAAE/E,IAAI+E,EAAE0qD,cAOVvtC,QAAU,SAAUJ,EAASE,EAAO3gB,GAClCpD,KAAK+B,IACH+uD,EAAc5sD,OAAOlE,KAAK2oB,OAAQ9E,EAASE,EAAO3gB,KAOtDguD,cAAgB,WAEd,GAAIpxD,KAAKyxD,UACP,OAAOzxD,KAAKyxD,UAGd,IAAIC,EAAa,GAEjB,MAAMr6C,EAAQrX,KAAK2oB,OACnBtR,EAAMs6C,WAAWlrD,QAAQ1K,GAAK21D,EAAWv0D,KAAKpB,IAC9Csb,EAAMu6C,UAAUnrD,QAAQ1K,GAAK21D,EAAWv0D,KAAKpB,IAG7C21D,EAAaA,EAAWltC,MACtB,SAAU7Q,EAAGlE,GACX,OAAIkE,EAAEkQ,QAAUpU,EAAEoU,SACR,EAEDlQ,EAAEkQ,QAAUpU,EAAEoU,QACd,EAEAlQ,EAAEoQ,MAAQtU,EAAEsU,OACX,EAEDpQ,EAAEoQ,MAAQtU,EAAEsU,MACZ,EAEF,KAGX,IAAI8tC,EAAW,GAef,OAZAH,EAAWjrD,QACT8C,GAEEsoD,EAAS10D,KAAK,CACZoM,EAAEsa,QAAU,IAAMta,EAAEwa,MACpBxa,EAAEsa,QACFta,EAAEwa,MACFxa,EAAEnG,QAIRpD,KAAKyxD,UAAYI,EACVA,OAkBb93D,EAAO,QAAQ,CACb,cACA,cACD,SACE,SAAUoW,EAAiB2hD,GAG5B,MAAMnvD,EAAQ9C,MAAM6C,OACpBC,EAAI0d,SAAe1d,EAAI0d,UAAa,WAGpC,MAAM0xC,EAAe,CAAC,YAAa,UAAW,aAEpC3vD,SAKV,MAAO,CAML8B,OAAS,SAAUmT,GACjB,OAAO3c,OAAOwJ,OAAOlE,MAAMoE,MAAMiT,IAOnCjT,MAAQ,SAAUiT,GAChB,MAAMvQ,EAAG9G,KAKT,GAJA8G,EAAE7B,IAAM,KACR6B,EAAEkrD,cAAe,EAGb90D,UAAUZ,OAAS,GAAnBY,MACAma,EAEF,MAAM,IAAI5Z,MAAM,sBA2ClB,IAAIsmB,EAaJ,OApDS1M,aAAiBsN,MACxB7d,EAAE7B,IAAOoS,EAGTA,EAAc,OAAIvQ,EAEduQ,EAAMwQ,aAAa,mBACrB/gB,EAAEmrD,UAAY56C,EAAM0Q,aAAa,mBAGjCjhB,EAAEmrD,UAAY56C,EAAM0Q,aAAa,kBAC/B,IACA1Q,EAAM0Q,aAAa,eACnB,IACA1Q,EAAM0Q,aAAa,gBAGvBjhB,EAAEorD,QAAY76C,EAAM0Q,aAAa,iBAGjCjhB,EAAEqrD,UAAY96C,EAAM0Q,aAAa,uBAAuB5rB,MAAM,MAO9D41D,EAAYtrD,SAAQ,SAASuf,GAC3BhmB,KAAKgmB,QAAwB3mB,IAAhBgY,EAAM2O,GAAsB3O,EAAM2O,QAAQ3mB,IACtDyH,GAGLA,EAAEsrD,OAAS,CACTtpC,OAAS,GACTG,MAAS,GACTopC,KAAS,IAKXvrD,EAAEqrD,UAAU1rD,SAAQ,SAASuf,GAG3B,IACEjC,EAAQjqB,EAAQ,mBAAmBoK,OAAO8hB,GAC1ChmB,KAAKoyD,OAAOruC,EAAM3gB,MAAMjG,KAAK4mB,GAE/B,MAAOrlB,GACL,UAEDoI,GAEIA,GAMT6qD,SAAW,WACT,OAAO3xD,KAAKoyD,OAAOnpC,OAOrBF,UAAY,WACV,OAAO/oB,KAAKoyD,OAAOtpC,QAOrB8oC,QAAU,WACR,OAAO5xD,KAAKoyD,OAAOC,MAMrBhoD,KAAO,WACL,MAAMvD,EAAI9G,KACV,GAAI8G,EAAEkrD,aACJ,OAAOlrD,EAGT,MAAM/B,EAAU+B,EAAE7B,IAGlB,GAAIF,MAAAA,EACF,OAGF,MAAMutD,EAAUvtD,EAAQwtD,cAAc,SAGtC,OAAKD,GAILxrD,EAAE0H,MAAQsjD,EAAgB5tD,OAAO4C,GAEjCA,EAAE7B,IAAIyB,aACJI,EAAE0H,MAAMzJ,UACR+B,EAAE7B,IAAIstD,cAAc,UAItBD,EAAQ5rD,aACNI,EAAE0H,MAAM6O,QAAQtY,UAChButD,EAAQzxD,YAGViG,EAAEkrD,cAAe,EACVlrD,QAlBP,GAwBFka,KAAO,WAGL,MAAMjc,EAAU/E,KAAKiF,IAGrB,GAAIF,MAAAA,EACF,OAAO,EAGT,GAAIA,EAAQlD,UAAUC,SAAS,UAC7B,OAAO,EAGTiD,EAAQlD,UAAUE,IAAI,UAEtB,MAAM6M,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAGNwL,EAAO1P,KAMb,OALA4O,EAAI7M,IAAIY,EAAI0d,SAAU,CAAC9O,IAAM,CAAC,cAAc,cAAc,WACxD7B,EAAKsO,cAEPjZ,EAAQ5C,YAAYyM,EAAI7J,WAEL1F,MAAfW,KAAKqK,QAWXmoD,OAAS,WACHxyD,KAAKiF,IAAIpD,UAAUC,SAAS,UAC9B9B,KAAKge,WAELhe,KAAKghB,QAOThD,SAAW,WACThe,KAAKiF,IAAIpD,UAAUG,OAAO,WAO5B+C,QAAU,WACR,OAAO/E,KAAKiF,SAYlBlL,EAAO,aAAa,CAAC,SAAS,WAE5B,MAAO,CAKLmK,OAAS,SAAUa,GACjB,OAAOrK,OAAOwJ,OAAOlE,MAAMoE,MAAMW,IAKnCX,MAAQ,SAAUW,GAChB/E,KAAKiF,IAAMF,EAEX/E,KAAKyyD,WAAarwD,SAASC,cAAc,OACzCrC,KAAKyyD,WAAW7oD,aAAa,KAAM,QAKnC5J,KAAK0yD,QAAUtwD,SAASC,cAAc,OACtC,MAAM4E,EAAIjH,KAAK0yD,QACfzrD,EAAEpF,UAAUE,IAAI,OAAQ,UACxBkF,EAAEhF,KAAK,QACPgF,EAAE9E,YAAYnC,KAAKyyD,YACnBxrD,EAAEkC,MAAMO,OAAS,MACjBtH,SAASwD,qBAAqB,QAAQ,GAAGzD,YAAY8E,GAGrD,MAAMsN,EAAKvU,KAAK2yD,WAAWvtD,KAAKpF,MAIhC,OAHAJ,OAAOkK,iBAAiB,SAAUyK,GAClCvU,KAAKiF,IAAI6E,iBAAiB,UAAWyK,GACrCvU,KAAK2yD,aACE3yD,MAOT4yD,OAAS,WACP,OAAO5yD,KAAK0yD,SAUdG,UAAY,WACV,OAAO7yD,KAAKyyD,YAQd1tD,QAAU,WACR,OAAO/E,KAAKiF,KAQd1H,MAAQ,WACN,OAAOyC,KAAKiF,IAAI1H,OAOlBu1D,YAAc,WACZ,OAAO9yD,KAAK0yD,QAAQ7xD,WAAWmG,aAOjCa,MAAQ,WACN7H,KAAKiF,IAAI1H,MAAQ,IAOnB0T,OAAS,WAGP,OAFAjR,KAAK0yD,QAAQ7xD,WAAWmG,YAAchH,KAAK+yD,SAAS,GACpD/yD,KAAKyyD,WAAWtpD,MAAMgG,KAAOnP,KAAKgzD,YAAc,KACzChzD,MASTizD,OAAS,SAAU1wD,GACjB,MAAM2wD,EAAelzD,KAAK+yD,SACpBxpD,EAAIvJ,KAAKiF,IAOf,OANAsE,EAAEhM,MAAQ21D,EAAa,GAAK3wD,EAAO2wD,EAAa,GAChD3pD,EAAE4pD,gBAAkBD,EAAa,GAAK3wD,GAAMjG,OAC5CiN,EAAE6pD,aAAe7pD,EAAE4pD,eAGnBnzD,KAAK0yD,QAAQ7xD,WAAWmG,YAAcksD,EAAa,GAAK3wD,EACjDvC,MAOTqzD,OAAS,SAAUC,GACjB,MAAM50D,EAAIsB,KAAKiF,IAIf,OAHAvG,EAAEy0D,eAAiBG,EACnB50D,EAAE00D,aAAeE,EACjB50D,EAAEgM,QACK1K,KAAKiR,UAQd0hD,WAAa,WACX,MAAMY,EAAkBvzD,KAAKiF,IAAIiK,wBAC3BskD,EAAa5zD,OAAOmqD,iBAAiB/pD,KAAKiF,IAAK,MAE/CwuD,EACArxD,SAASwD,qBAAqB,QAAQ,GAAGsJ,wBAGzCwkD,EAAc1zD,KAAK0yD,QAAQvpD,MACjCuqD,EAAYvkD,KAAQ1G,SAAS8qD,EAAgBpkD,MAAQ,KACrDukD,EAAYtqD,IAAQX,SAAS8qD,EAAgB74B,OAAS+4B,EAAerqD,KAAO,KAC5EsqD,EAAYtkC,MAAQokC,EAAWG,iBAAiB,SAGhDD,EAAYE,YAAkBJ,EAAWG,iBAAiB,gBAC1DD,EAAYG,WAAkBL,EAAWG,iBAAiB,eAC1DD,EAAYI,gBAAkBN,EAAWG,iBAAiB,qBAC1DD,EAAYK,gBAAkBP,EAAWG,iBAAiB,qBAC1DD,EAAYM,SAAkBR,EAAWG,iBAAiB,aAC1DD,EAAYO,WAAkBT,EAAWG,iBAAiB,gBAS5Dza,QAAU,WACR,OAAOl5C,KAAK+yD,SAAS,IAKvBC,UAAY,WACV,MAAM/F,EAAMjtD,KAAK0yD,QAAQ7xD,WAAWqO,wBACpC,OAAO+9C,EAAIS,MAAQT,EAAI99C,MASzB4jD,OAAS,SAAUzoC,GACjB,MAAM/gB,EAAIvJ,KAAKiF,IACT1H,EAAQgM,EAAEhM,MAMhB,OAHyB,IAArBL,UAAUZ,SACZguB,EAAQ/gB,EAAE4pD,gBAEL,IAAIznD,MACTnO,EAAMO,UAAU,EAAGwsB,GACnB/sB,EAAMO,UAAUwsB,EAAO/sB,EAAMjB,cAWrCvC,EAAO,YAAY,CAAC,YAAa,SAAS,SAAU4T,GAClD,MAAO,CAKLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MACVoE,MAAMD,IAIVC,MAAQ,SAAUD,GAChB,QAAkB9E,IAAd8E,EAAO,SACM9E,IAAd8E,EAAO,GACT,MAAM,IAAI1G,MAAM,sBAWjB,OATAuC,KAAKoZ,MAAUjV,EAAO,GACtBnE,KAAK0E,QAAUP,EAAO,GACtBnE,KAAK4E,SAAW,IAAM5E,KAAKoZ,MAAM7X,cAE7B4C,EAAO7H,OAAS,IACnB0D,KAAKk0D,MAAQ/vD,EAAO,GACpBnE,KAAK4E,UAAY,IAAM5E,KAAKk0D,MAAM3yD,eAG5BvB,MAMTuE,QAAU,SAAUA,GAIlB,OAHyB,IAArBrH,UAAUZ,SACb0D,KAAKwE,SAAWD,GAEVvE,KAAKwE,UAOdW,QAAU,SAAUzG,GAClB,IAAIuI,EAAIjH,KAAKkH,OAIbD,EAAEtJ,OAAO,IAET,IAAIk0B,EAAI5qB,EAAEktD,OAGEtiC,EAAEuiC,aACRnB,OAAOjzD,KAAK0E,SAASuM,SAE3BvS,EAAEqB,OAGF8xB,EAAEtkB,MAAK,IAMTlS,KAAO,WACL,OAAO2E,KAAKoZ,OAOd3U,OAAS,WACP,OAAOzE,KAAK0E,SAMd2vD,KAAO,WACL,OAAOr0D,KAAKk0D,OAOdnvD,QAAU,WAER,QAAiB1F,IAAbW,KAAKiF,IACR,OAAOjF,KAAKiF,IAGb,IAAIC,EAAK9C,SAASC,cAAc,WAEXhD,IAAjBW,KAAKmF,UACRD,EAAY,QAAIlF,KAAKmF,QAAQC,KAAKpF,OAInC,IAAI3E,EAAQ+G,SAASC,cAAc,QAMnC,GALAhH,EAAKiH,KAAKtC,KAAKoZ,OAEflU,EAAG/C,YAAY9G,QAGIgE,IAAfW,KAAKk0D,MAAqB,CAC7B,IAAIG,EAAOjyD,SAASC,cAAc,QAClCgyD,EAAKxyD,UAAUE,IAAI,QACnBsyD,EAAK/xD,KAAKtC,KAAKk0D,OACfhvD,EAAG/C,YAAYkyD,GAEhB,OAAOr0D,KAAKiF,IAAMC,OAOxBnL,EAAO,cAAc,CAAC,gBAAgB,SAAUuf,GAC9C,MAAO,CAKLpV,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOoV,GACpBjV,UAAUrE,MAAMoE,MAAMD,IAMzBgB,QAAU,SAAUzG,GAClB,MAAMuI,EAAIjH,KAAKkH,OACT3J,EAAQyC,KAAKzC,QACbs0B,EAAI5qB,EAAEktD,OACZtiC,EAAEuiC,aAAanB,OAAO11D,GACtBs0B,EAAEhtB,OAAO,MACToC,EAAEE,OAEFzI,EAAEqB,YAORhG,EAAO,mBAAmB,CAAC,mBAAoB,SAAS,SAAUu6D,GAChE,MAAO,CAKLpwD,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOowD,GACpBjwD,UAAUrE,MAAMoE,SAMnBrC,IAAM,SAAU6F,GACd5H,KAAKiF,IAAIhD,KAAK,QAAQK,KAAKsF,EAAM,GAAK,MAEtC,IAAIysD,EAAOr0D,KAAKiF,IAAIhD,KAAK,QACzBoyD,EAAKxyD,UAAUE,IAAI,QACnBsyD,EAAK/xD,KAAKsF,EAAM,GAAK,MACrB5H,KAAKiF,IAAI9C,YAAYkyD,QAW3Bt6D,EAAO,YAAY,CACjB,OACD,YACA,cACA,qBACE,SACDwU,EACAZ,EACA2L,EACAg7C,GAEA,MAAO,CAKLpwD,OAAS,SAAUiwD,EAAMjb,EAAS/0C,GAChC,MAAMlJ,EAAMP,OAAOwJ,OAAOqK,GACtBlK,UAAUrE,MACVoE,MAAMD,EAAQ,CACbwJ,UAAYA,EACZ2L,YAAcA,EACdg7C,iBAAmBA,IAyBxB,OAvBAr5D,EAAIs5D,SAAWrb,EACfj+C,EAAIgK,IAAIpD,UAAUE,IAAI,QACtB9G,EAAIu5D,MAAQL,EAGZl5D,EAAI+Q,cAAe,EAEnB/Q,EAAI8J,UAAU+E,iBAAiB,QAAQ,SAAUpL,GAC/CsB,KAAKkH,KAAKC,UAIZlM,EAAI6S,OAAS,WACX,MAAM+jB,EAAI7xB,KAAKw0D,MACf3iC,EAAE4iC,YAAY1vD,UAAU2F,QACL,OAAfmnB,EAAEhtB,WACAgtB,EAAE6iC,OAAO7vD,QACXgtB,EAAE8iC,eAEJ9iC,EAAEhtB,OAAO,QAIN5J,GAOTk5D,KAAO,WACL,OAAOn0D,KAAKw0D,WAUlBz6D,EAAO,uBAAuB,CAK5BmK,OAAS,SAAU2P,GACjB,OAAOnZ,OAAOwJ,OAAOlE,MAAMoE,MAAMyP,IAInCzP,MAAQ,SAAUyP,GAChB,IACE7T,KAAK+T,OAAS,IAAI3T,OAAOyT,GAE3B,MAAOnV,GAEL,YADAmB,MAAMsD,IAAI,EAAGzE,GAGf,OAAOsB,MAOTxD,KAAO,SAAU+F,GACf,GAAKvC,KAAK+T,OAAO+T,KAAKvlB,GAEtB,OAAOnC,OAAO6nB,MASlBluB,EAAO,aAAa,IAAG,WAErB,MAAO,CAKLmK,OAAS,SAAUb,GACjB,OAAO3I,OAAOwJ,OAAOlE,MAAMoE,MAAMf,IAInCe,MAAQ,SAAUf,GAChB,MAAMyD,EAAI9G,KAMV,OALA8G,EAAEwQ,MAAQ,QACVxQ,EAAEjC,QAAS,EACXiC,EAAE7B,IAAM7C,SAASC,cAAc,OAC/ByE,EAAE7B,IAAIkE,MAAMK,QAAU,OACtB1C,EAAE7B,IAAIpD,UAAUE,IAAI,QAAS,QACtB+E,GAOTyG,KAAO,SAAUlK,GACfrD,KAAK6E,QAAS,EACd,MAAMnG,EAAIsB,KAAKiF,IACfvG,EAAEsI,YAAc3D,EAChB3E,EAAEyK,MAAMK,QAAU,SAOpBrC,KAAO,WACL,QAAKnH,KAAK6E,SAEV7E,KAAKiF,IAAIkE,MAAMK,QAAU,OACzBxJ,KAAK6E,QAAS,GACP,IAOTE,QAAU,WACR,OAAO/E,KAAKiF,SA0BlBlL,EAAO,OAAO,CACZ,aACA,YACA,uBACA,aACA,SACC,SAAU66D,EACArmD,EACAsmD,EACAC,GAUX,MAAO,CAKL5wD,OAAS,SAAU0D,GACjB,OAAOlN,OAAOwJ,OAAOlE,MAAMoE,MAAMwD,IAKnCxD,MAAQ,SAAUwD,GAWhB,GAVAA,EAAQA,GAAS,GAGjB5H,KAAKoH,MAAU,GACfpH,KAAK00D,OAAUI,EAAW5wD,SAG1BlE,KAAKiI,QAAU,MAGVpI,MAAM2D,iBAET,YADAD,QAAQJ,IAAI,+BAOdtD,MAAMq5C,QAAUr5C,MAAMq5C,SACpB,yGAYF,MAAM6b,EAASntD,EAAkB,YAAKxF,SAAS8iB,eAAe,WAC9D,IAAK6vC,EACH,OAAO,KAGT/0D,KAAKy0D,YAAcG,EAAW1wD,OAAO6wD,GAGrC,MAAMrlD,EAAO1P,KAEPod,EAAIpd,KAAKy0D,YAAY5B,YAC3Bz1C,EAAEjb,YAAYnC,KAAK00D,OAAO3vD,WAC1BqY,EAAEtT,iBAAiB,SAAS,SAAUpL,GAC/BsB,KAAK6B,UAAUC,SAAS,WAC3B4N,EAAKnC,MAAK,MAKd,MAAMynD,EAAoBh1D,KAAKy0D,YAAY1vD,UAC3CiwD,EAAkBlrD,iBAAiB,QAAS9J,KAAKiR,OAAO7L,KAAKpF,OAC7Dg1D,EAAkBlrD,iBAAiB,QAAS9J,KAAKiR,OAAO7L,KAAKpF,OAmC7D,OAzBAg1D,EAAkBlrD,iBAChB,UARU,SAAUpL,GACM,KAAtBqC,EAAerC,KACjBsB,KAAKuN,MAAK,GACV7O,EAAEqB,SAKaqF,KAAKpF,OAAO,GAI/Bg1D,EAAkBlrD,iBAChB,aACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAEFg1D,EAAkBlrD,iBAChB,WACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAEFg1D,EAAkBlrD,iBAChB,YACA9J,KAAKwL,OAAOpG,KAAKpF,OACjB,GAIFA,KAAKi1D,UAAYJ,EAAc3wD,OAC7B0D,EAAe,SAAK/H,MAAMq5C,SAErBl5C,MAOTo0D,WAAa,WACX,OAAOp0D,KAAKy0D,aAOdS,MAAQ,SAAUC,EAAS9xD,GACzB,MAAMyD,EAAI9G,KACV,OAAyB,IAArB9C,UAAUZ,OACLwK,EAAE4tD,QAGP5tD,EAAE4tD,OAAO7vD,SAIbiC,EAAE2tD,YAAYpB,OAAO8B,GAIrBruD,EAAE4tD,OAAOnnD,KAAKlK,GACdyD,EAAEjC,OAAOiC,EAAE4tD,SACJ,IAOTzjD,OAAS,WACPjR,KAAKy0D,YAAYxjD,SACbjR,KAAK00D,OAAOvtD,QACdnH,KAAK6E,OAAO,OAOhBqC,KAAO,SAAUzC,GACf,QAA2BpF,IAAvBW,KAAKoH,MAAM3C,GAAuB,CAGpC,QAAuCpF,IAAnCQ,MAAM2D,iBAAiBiB,GACzB,OAGFzE,KAAKoH,MAAM3C,GAAU8J,EAAUrK,OAC7BlE,KAAMyE,EAAQ5E,MAAM2D,iBAAiBiB,IAKzC,OAAOzE,KAAKoH,MAAM3C,IAOpB2wD,YAAc,SAAUC,GACtB,MAAMC,EAAMD,OAAYh2D,EAAYW,KAAKkH,KAAK,KAG9C,IAAIgyC,EAAUl5C,KAAKy0D,YAAYvb,UAE/B,YAAgB75C,IAAZ65C,GAA4C,IAAnBA,EAAQ58C,OAC5Bg5D,GAITpc,EAAUl5C,KAAKi1D,UAAUz4D,KAAK08C,QAEd75C,IAAZ65C,GAA2C,GAAlBA,EAAQ58C,OAC5Bg5D,EAGFt1D,KAAKkH,KAAKgyC,IAAYoc,IAU/BzwD,OAAS,SAAU5J,GAGjB,GAAyB,IAArBiC,UAAUZ,OAAc,CAC1B,MAAM8gB,EAAIpd,KAAKy0D,YAAY5B,YAGf,OAAR53D,GACFmiB,EAAEvb,UAAUE,IAAI,UAChB/B,KAAKiI,QAAUhN,IAKfmiB,EAAEvb,UAAUG,OAAO,UACnBhC,KAAKiI,QAAU,MAKnB,OAAOjI,KAAKiI,SAadsF,KAAO,SAAU8nD,GAMf,IAAInuD,EACJ,GAJAlH,KAAKu1D,UAIDruD,EAAOlH,KAAKo1D,YAAYC,GAAY,CAEtCr1D,KAAK6E,OAAOqC,GAEZ,IAAIxI,EAAIwI,EAAKnC,UAEb/E,KAAKiI,QAAQlD,UAAUiK,OACvBhP,KAAKy0D,YAAY5B,YAAY1wD,YAAYzD,GAEzCwI,EAAKqG,OACLrG,EAAKwD,aAML1K,KAAKy0D,YAAY1vD,UAAU2F,SAM/B8qD,WAAa,aAMbC,OAAS,WACPz1D,KAAKu1D,UACLv1D,KAAKy0D,YAAY1vD,UAAU2F,SAK7Bc,OAAS,SAAU9M,GACF,eAAXA,EAAE0E,KACJpD,KAAK8M,WAAapO,EAAEqO,QAAQ,GAAG3C,QAGb,aAAX1L,EAAE0E,KACTpD,KAAK8M,gBAAazN,EAGD,aAAVX,EAAE0E,OACJpD,KAAK8M,WAAa,GAAMpO,EAAEqO,QAAQ,GAAG3C,UACxCpK,KAAKuN,OACLvN,KAAK8M,gBAAazN,GAEpBX,EAAEqB,SAMNw1D,QAAU,WACc,OAAlBv1D,KAAK6E,WAGF7E,KAAK00D,OAAO7vD,OASf7E,KAAK20D,eANL30D,KAAKy0D,YACF5B,YACA/xD,YAAYd,KAAKiI,QAAQlD,WAO9B/E,KAAK6E,OAAO,QAKhB8vD,aAAe,WACb30D,KAAK00D,OAAOvtD,OACZnH,KAAK6E,OAAO,WAclB9K,EAAO,UAAU,CAKfmK,OAAS,SAAU7I,EAAO,SACxB,MAAMJ,EAAMP,OAAOwJ,OAAOlE,MAI1B,OAHA/E,EAAIme,MAAQ/d,EAAKkG,cACjBtG,EAAIy6D,MAAQ,GACZz6D,EAAIksB,SACGlsB,GAQT06D,IAAM,SAAU3/C,GACd,OAAOhW,KAAK01D,MAAM1/C,EAAIzU,gBAQxBsZ,IAAM,SAAU7E,EAAKzY,GACnByC,KAAK01D,MAAM1/C,GAAOzY,EAClByC,KAAK8a,UAOPpT,MAAQ,WACN1H,KAAK01D,MAAQ,GACbtzD,SAASwzD,OAAS51D,KAAKoZ,MAAQ,iBAKjC0B,OAAS,WACP1Y,SAASwzD,OAAS51D,KAAKoB,YAOzBA,SAAW,WAKT,OAAOpB,KAAKoZ,MAAQ,IAAMmxC,mBAAmBj5B,KAAKC,UAAUvxB,KAAK01D,QAAU,iBAO7EvuC,OAAS,WACP/kB,SAASwzD,OAAOz5D,MAAM,KAAKsK,SACzB,SAAU1K,GACR,MAAM85D,EAAO95D,EAAEI,MAAM,KAErB,GADa05D,EAAK,GAAGxvD,OAAO9E,gBACfvB,KAAKoZ,WAAlB,CACC,GAAoB,IAAhBy8C,EAAKv5D,QAAmC,IAAnBu5D,EAAK,GAAGv5D,OAC/B,OACD0D,KAAK01D,MAAQpkC,KAAKwkC,MAAM1rC,mBAAmByrC,EAAK,QAIpD71D,SAcNjG,EAAO,WAAW,CAAC,UAAU,cAAc,SAAS,SAAUg8D,EAAc5lD,GAG1E,MAAMxN,EAAQ9C,MAAM6C,OACpBC,EAAIkb,MAAQlb,EAAIkb,OAAS,QAEzB,MAAMzD,EAAIhY,SAEV,MAAO,CAML8B,OAAS,SAAUjJ,EAAI+6D,GACrB,OAAK/6D,EAEEP,OAAOwJ,OAAOlE,MAAMoE,MAAMnJ,EAAI+6D,GAD7B,MAMV5xD,MAAQ,SAAUnJ,EAAK+6D,GACrB,MAAMlvD,EAAI9G,KASV,GANC8G,EAAEmvD,cADa52D,IAAZ22D,EACUD,EAAa7xD,SAGb8xD,EAGV/6D,EAAK,CAKP,GAJD6L,EAAE6X,MAAQ1jB,EACV6L,EAAEwjB,MAAQrvB,EAAI8sB,aAAa,SAGrBjhB,EAAEwjB,MACL,OAAO,KAEVrvB,EAAIi7D,gBAAgB,QAEpBj7D,EAAIkK,QAAU,WACZnF,KAAKuN,QACLnI,KAAK0B,GAGP,MAAMqvD,EAAM/7C,EAAE/X,cAAc,OAC5B8zD,EAAIvsD,aAAa,KAAM,YACvBusD,EAAIhtD,MAAMK,QAAU,OACpB4Q,EAAExU,qBAAqB,QAAQ,GAAGzD,YAAYg0D,GAE9CrvD,EAAEsvD,QAAU,KACZtvD,EAAE7B,IAAMkxD,EAGRrvD,EAAEme,IAAU7K,EAAE8K,eAAe,YAC7Bpe,EAAEqe,GAAU/K,EAAE8K,eAAe,WAC7Bpe,EAAEuvD,QAAUj8C,EAAE8K,eAAe,kBAG9B,OAAOpe,GAOTwvD,SAAW,SAAU53D,GACnB,MAAMoI,EAAI9G,KACJu2D,EAAK73D,EAAEqpB,aAAa,cACpBzB,EAAK5nB,EAAEqpB,aAAa,uBACpByuC,EAAK93D,EAAEqpB,aAAa,qBAO1B,GALW,IAAPyuC,GAAmB,MAAPA,GAAqB,QAAPA,GAAuB,OAAPA,GACxC1vD,EAAE2vD,WACL3vD,EAAEuvD,QAAQK,SAAU,GAGnB72D,MAAM82D,OACR92D,MAAM82D,OAAOC,YAAYtwC,QAGtB,GAAIxf,EAAEme,IAAK,CACd,IAAIzL,EAAQ9N,MAAMma,KAAK/e,EAAEme,IAAIsB,SAAS/N,KAAKyT,GAAKA,EAAE1uB,QAAU+oB,GACxD9M,IACFA,EAAM3B,UAAW,GAGjB/Q,EAAEqe,KACJre,EAAEqe,GAAG5nB,MAAQg5D,GAEfzvD,EAAE+vD,QAAQn4D,GACVoI,EAAEK,QAOJ2vD,YAAc,SAAU18C,GACtB,IAAI28C,EAAK38C,EAAE48C,iBAAiB,wCAC5B,MAAMtnD,EAAO1P,KACb,IAAK,IAAIjE,EAAI,EAAGA,EAAIg7D,EAAGz6D,OAAQP,IAC9Bg7D,EAAGh7D,GAAGoJ,QAAU,SAAUzG,GACxBgR,EAAK4mD,SAASt2D,KAAKtB,KAQxBu4D,aAAe,SAAU78C,GACvB,MAAM1K,EAAO1P,KACb0L,MAAMma,KAAKzL,EAAEgF,uBAAuB,aAAa3Y,QAChD1K,GACGA,EAAEoJ,QAAU,WAEX,OADAuK,EAAKmnD,QAAQ72D,KAAK+nB,aAAa,UACxB,KASdxa,KAAO,WACL,MAAMzG,EAAI9G,KACJ+E,EAAU+B,EAAE7B,IAClB,GAA8B,UAA1BF,EAAQoE,MAAMK,QAAlB,CAGA,GAAkB,OAAd1C,EAAEsvD,QAAkB,CACvBtvD,EAAEsvD,QAAUh8C,EAAE/X,cAAc,UAC5ByE,EAAEsvD,QAAQxsD,aACR,OACC9C,EAAEowD,WAAapwD,EAAEwjB,OAAS,kBAG5B,MAAM1b,EAAMuB,EAAiBjM,OAC3B,CAAC,SAAS,gBAGZ0K,EAAI7M,IAAIY,EAAIkb,MAAO,CAACtM,IAAM,CAAC,cAAc,WAAW,WAClDxM,EAAQoE,MAAMK,QAAU,UAG1BzE,EAAQ5C,YAAYyM,EAAI7J,WAczBA,EAAQ5C,YAAY2E,EAAEsvD,SAGvBrxD,EAAQoE,MAAMK,QAAU,UAO1BrC,KAAO,WACLnH,KAAKiF,IAAIkE,MAAMK,QAAU,QAQ3BqtD,QAAU,SAAU57D,GAClB,IAAIk8D,EAAOl8D,EAEX,GAAmB,iBAARk8D,EAAkB,CAC5B,MAAM32C,EAAqB,OAAjBxgB,KAAKo2D,QAAmBx2D,OAAOw3D,OAAO,GAAGC,SAAWz3D,OAAOy3D,SAErEF,EAAO32C,EAAE82C,SAAW92C,EAAE+2C,OAEtB,IAAK,IAAIx7D,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAsB,YAAjBd,EAAIu8D,UAA2C,QAAjBv8D,EAAIu8D,WAAuBv8D,EAAI4sB,aAAa,MAAO,CACpFsvC,GAAQ,IAAMl8D,EAAI8sB,aAAa,MAC/B,MAIC,GAAY,QADb9sB,EAAMA,EAAI4K,YAEP,OAKR7F,KAAKi2D,SAASp7C,IAAI,UAAWs8C,IAO/BD,QAAU,WACR,OAAOl3D,KAAKi2D,SAASN,IAAI;;;;;;AAiB/B57D,EAAO,eAAe,IAAG,WACrB,aAEA,IAAI09D,EAAOC,EAASC,EAChBC,EAA8B,oBAAXh4D,QAA0BA,OAAOwC,SACpDy1D,GAAgBD,EAChBxgD,EAAMwgD,EAAYx1D,SAAW,KAC7B01D,EAAa,GASjB,SAASC,IACL,IAAIC,EAAYF,EAEZD,GAEIG,EAAU17D,SACVw7D,EAAa,GAbzB,SAAsBE,GAClB,IAAIj8D,EACJ,IAAKA,EAAI,EAAGA,EAAIi8D,EAAU17D,OAAQP,GAAK,EACnCi8D,EAAUj8D,GAAGqb,GAWT6gD,CAAaD,IAQzB,SAASE,IACAL,IACDA,GAAe,EACXF,GACAQ,cAAcR,GAGlBI,KAIR,GAAIH,EAAW,CACX,GAAIx1D,SAAS0H,iBAGT1H,SAAS0H,iBAAiB,mBAAoBouD,GAAY,GAC1Dt4D,OAAOkK,iBAAiB,OAAQouD,GAAY,QACzC,GAAIt4D,OAAOw4D,YAAa,CAC3Bx4D,OAAOw4D,YAAY,SAAUF,GAE7BR,EAAUt1D,SAASC,cAAc,OACjC,IACIo1D,EAAgC,OAAxB73D,OAAOy4D,aACjB,MAAO35D,IAKLg5D,EAAQY,UAAYb,GAAS73D,OAAO24D,WACpCZ,EAAmBa,aAAY,WAC3B,IACId,EAAQY,WACRJ,IACF,MAAOx5D,OACV,KAeiB,aAAxB0D,SAASq2D,YACTP,IAWR,SAASQ,EAAS35D,GAMd,OALI84D,EACA94D,EAASqY,GAET0gD,EAAW36D,KAAK4B,GAEb25D,EAkBX,OAfAA,EAAS/rC,QAAU,QAKnB+rC,EAASt5D,KAAO,SAAU/D,EAAMnB,EAAKy+D,EAAQp+D,GACrCA,EAAOq+D,QACPD,EAAO,MAEPD,EAASC,IAMVD,KAGX3+D,EAAO,WAAW,IAAG,WACnB,MAAO,CAGL,CAAC,SAAU,QAEX,CAAC,eAAgB,QAEjB,CAAC,cAAe,UAChB,CAAC,iBAAkB,QACnB,CAAC,cAAe,QAChB,CAAC,eAAgB,QACjB,CAAC,YAAa,QAEd,CAAC,WAAY,UACb,CAAC,cAAe,QAChB,CAAC,WAAY,QAGb,CAAC,YAAa,UACd,CAAC,WAAY,UACb,CAAC,WAAY,UACb,CAAC,UAAW,UAEZ,CAAC,UAAW,QAEZ,CAAC,WAAY,UAEb,CAAC,WAAY,QACb,CAAC,YAAa,UACd,CAAC,aAAc,UACf,CAAC,aAAc,UACf,CAAC,YAAa,UACd,CAAC,WAAY,UACb,CAAC,cAAe,UAChB,CAAC,cAAe,UAChB,CAAC,QAAS,YAKb,SAAU+xB,EAAQzsB,GAClB,aAEA,IACIw5D,EADAz2D,EAAW0pB,EAAO1pB,SAGtBy2D,EAAW,WAEV,IAKIC,EAAGC,EAAWC,EAAOC,EAAUC,EAAcC,EAAUC,EAAUC,EAASC,EAAUC,EAAazhD,EAAO0hD,EALxGC,EAAY,GACZC,EAAY,GACZC,GAAY,EACZ5/C,EAAqB,GAArBA,EAA8B,GAA9BA,EAAyC,GACzC6/C,EAAY,GA8kBhB,OAvkBAF,EAAU,CACTG,QAAU,CACTC,OAAS,kDACTC,OAAS,oGACTC,GAAS,sFACTC,OAAS,mGAEVniD,MAAU,wGACVoiD,QAAU,8CACV/2D,IAAU,gEAOXq2D,EAAqB,WACpB,IAAI1yD,EACA1D,EACA+2D,GAAc,EACdxwD,EAAcvH,EAASC,cAAc,eACrC+3D,EAAc,CACbC,iBAAqB,sBACrBC,cAAqB,gBACrBC,YAAqB,iBACrBC,WAAqB,iBAG1B,IAAK1zD,KAAKszD,EACT,QAhDJ,IAgDQzwD,EAAGR,MAAMrC,GAAkB,CAC9B1D,EAAYg3D,EAAYtzD,GACxBqzD,GAAY,EACZ,MAIF,MAAO,CACN/2D,KAAYA,EACZ+2D,UAAYA,IAUdrB,EAAI,SAAUl6D,GACb,OAAOwD,EAAS8iB,eAAetmB,IAshBzB,CACNs2D,MAAU,SAAUgF,EAASruB,EAAI4uB,GAAkE,OAAtDhB,EAAUiB,OAAOR,EAAS,QAASruB,EAAI,GAAI4uB,GAAkBz6D,MAC1G26D,QAAU,SAAUT,EAASruB,EAAI4uB,GAAoE,OAAxDhB,EAAUiB,OAAOR,EAAS,UAAWruB,EAAI,GAAI4uB,GAAkBz6D,MAC5GumD,QAlhBDkT,EAAY,CAMXvJ,OAAS,CACR8J,GAAS,KACTC,OAAS,UAOV3V,MAAQ,IAMRsW,eAAgB,EAMhBC,YAAc,KAMdL,gBA5GH,EAqHGM,aAAe,SAAUjvB,GACxB,IAKImuB,EAAIC,EAAQc,EAAQ/kD,EAAKnO,EALzBmzD,OAA8B,IAAVhC,EACpBiC,OAAkC,IAAdlC,EACpBmC,OAA8B,IAAVpjD,EACpB5D,EAAY,GACZ6X,EAAY/rB,KAIhBg6D,EAAK,SAAU50C,GAUd,YAToC,IAAzBA,EAAMllB,gBAAgCklB,EAAMllB,iBACvD66D,EAAO31C,QACc,IAAVtN,IAAuB5D,EAAM4D,EAAMva,OAC5B,mBAAPsuC,SACW,IAAV/zB,EACV+zB,GAAG,EAAM33B,GAEL23B,GAAG,KAEF,GAIRouB,EAAS,SAAU70C,GAIlB,YAHoC,IAAzBA,EAAMllB,gBAAgCklB,EAAMllB,iBACvD66D,EAAO31C,GACW,mBAAPymB,GAAmBA,GAAG,IAC1B,GAIRkvB,EAAS,SAAU31C,GAClB2G,EAAK5kB,OACL4kB,EAAKovC,OAAO/4D,EAASsuD,KAAM,QAAS16C,GACpC+V,EAAKovC,OAAOlC,EAAU,QAASpxD,GAC3BmzD,GAAOjvC,EAAKovC,OAAOnC,EAAO,QAASgB,GACnCiB,GAAWlvC,EAAKovC,OAAOpC,EAAW,QAASkB,IAIhDjkD,EAAM,SAAUoP,GACf,IAAIpkB,EAAUokB,EAAMpkB,SACfA,IAAY+Y,IAAemhD,GAAcA,GAAYl6D,IAAY+Y,IAAaigD,EAAG50C,GAClFpkB,IAAY+Y,GAAYkhD,GAAWhB,EAAO70C,IAI/Cvd,EAAQ,SAAUud,GACb81C,EAAUpjD,EAAMpN,SACVuwD,GAAalvC,EAAK6uC,cAAe5B,EAAMtuD,QAC5CquD,EAAUruD,SAOhB1K,KAAKoF,KAAK6zD,EAAU,QAASpxD,GAC7B7H,KAAKoF,KAAK8zD,EAAc,QAASrxD,GAE7BmzD,GAAOh7D,KAAKoF,KAAK4zD,EAAO,QAASgB,GAEjCiB,GAAWj7D,KAAKoF,KAAK2zD,EAAW,QAASkB,GAE7Cj6D,KAAKoF,KAAKhD,EAASsuD,KAAM,QAAS16C,GAC7BhW,KAAKw6D,WAAWL,WACpBn6D,KAAKo7D,YAaPh2D,KAAO,SAAUuE,EAAIyb,EAAOymB,GACQ,mBAAxBliC,EAAGG,iBACbH,EAAGG,iBAAiBsb,EAAOymB,GAAI,GACrBliC,EAAGyuD,aACbzuD,EAAGyuD,YAAY,KAAOhzC,EAAOymB,IAS/BwvB,aAAe,WACd,QAA8B,IAAnBvvC,EAAOwvC,QAAyB,CAC1C,IAAIvvC,EAAO/rB,KAIX,OAHA8rB,EAAOwvC,QAAU,SAAUj4D,EAAK8mB,EAAKoxC,GACpCxvC,EAAKyvC,MAAM,IAAMn4D,EAAM,YAAck4D,EAAO,OAASpxC,EAAM,IAAK,KAE1D,EAEP,OAAO,GAYTsxC,cAAgB,SAAUC,EAAWC,GACpC,OAAO37D,KAAK46D,cAAgBe,EAAUD,EAAYA,EAAYC,GAU/DC,MAAQ,SAAUvuD,GACjB,IAAIuZ,EAAU,GACVxjB,EAAUiK,EAAKjK,KACf82D,EAAU7sD,EAAK6sD,QACf2B,EAAUxuD,EAAKotD,UAAY,GAuB/B,OArBA7zC,GAAQ,gCACRA,GAAQ,uFAEsB,SAA1B6yC,EAAUoB,cAAwBj0C,GAAQ,oEAGjC,WAATxjB,IAAmBwjB,GAAQ,4BAE/BA,GAAQ,mCACRA,GAAQ8yC,EAAQQ,QAAQz9D,QAAQ,cAAey9D,GAElC,WAAT92D,IAAmBwjB,GAAQ8yC,EAAQ5hD,OAEvC8O,GAAQ8yC,EAAQG,QAAQC,OACxBlzC,GAAQ,aAEK,WAATxjB,IAAmBwjB,GAAQ,UAE/BA,GAAQ,mFACRA,GAAQ,SAEAxjB,GACR,IAAK,UAEJwjB,GADAA,EAAOA,EAAKnqB,QAAQ,cAAeuD,KAAKy7D,cAAc/B,EAAQG,QAAQI,OAAQP,EAAQG,QAAQG,MAClFv9D,QAAQ,SAAUuD,KAAKkwD,OAAO8J,IAAIv9D,QAAQ,aAAcuD,KAAKkwD,OAAO+J,QAChF,MACD,IAAK,SAEJrzC,GADAA,EAAOA,EAAKnqB,QAAQ,cAAeuD,KAAKy7D,cAAc/B,EAAQG,QAAQI,OAAQP,EAAQG,QAAQE,UAClFt9D,QAAQ,SAAUuD,KAAKkwD,OAAO8J,IAAIv9D,QAAQ,aAAcuD,KAAKkwD,OAAO+J,QAChF,MACD,IAAK,QAEJrzC,GADAA,EAAOA,EAAKnqB,QAAQ,cAAei9D,EAAQG,QAAQG,KACvCv9D,QAAQ,SAAUuD,KAAKkwD,OAAO8J,IAQ3C,OAFAV,EAASvd,UAAY,qBAAuB34C,EAAO,IAAMy4D,EACzDxC,EAAQtd,UAAa,iBACdn1B,GAWR7I,MAAQ,SAAU/X,EAAMy8C,GAEvB,IAEIqZ,EAAaC,EAFbC,EAASvZ,IAASpI,MAAMoI,IAAUA,EAAOziD,KAAKskD,MAC9Cv4B,EAAQ/rB,KAIZA,KAAKoF,KAAKY,EAAM,SAAS,WACxB81D,EAAY91D,MAIb+1D,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBAEN8rB,EAAKovC,OAAOn7D,KAAM+rB,EAAKyuC,WAAWp3D,KAAM24D,GAExCxC,EAAMz4D,YAAYd,MACbu5D,EAAMpxC,kBAAiBoxC,EAAMxd,WAAa,0BAIhD+f,EAAc,SAAUnyD,QAEL,IAAPA,GAAsBA,EAAG9D,aAAe0zD,IAE9CxtC,EAAKyuC,WAAWL,WACnBpuC,EAAK3mB,KAAKuE,EAAIoiB,EAAKyuC,WAAWp3D,KAAM24D,GACpCpyD,EAAGoyC,WAAa,uBAEhBwd,EAAMz4D,YAAY6I,GACb4vD,EAAMpxC,kBAAiBoxC,EAAMxd,WAAa,4BAKrC,IAAT0G,GAEJljD,YAAW,WAAcu8D,EAAY91D,KAAUg2D,IAchDtB,OAAS,SAAUR,EAAS92D,EAAMyoC,EAAIowB,EAAaxB,GAIlDrB,EAAWh3D,EAAS85D,cAGpB,IAAInsD,EAAQ,WACNwpD,GAA6B,OAApBA,EAAM4C,WAAwB9C,GAAiC,OAAtBA,EAAQ8C,WAC1DpsD,KAGN,GAAuB,iBAAZmqD,EAAsB,MAAM,IAAIz8D,MAAM,4BACjD,GAAoB,iBAAT2F,EAAmB,MAAM,IAAI3F,MAAM,yBAC9C,QAAkB,IAAPouC,GAAoC,mBAAPA,EAAmB,MAAM,IAAIpuC,MAAM,yBAQ3E,OANAuC,KAAKqK,OACL0F,IAEA6pD,EAAMz8D,KAAK,CAAEiG,KAAMA,EAAM82D,QAASA,EAASn7D,SAAU8sC,EAAIowB,YAAaA,EAAaxB,SAAUA,IACxFd,GAAQ35D,KAAKo8D,QAEXp8D,MAURumD,OAAS,SAAUnjD,GAClB,GAAoB,iBAATA,EAAmB,MAAM,IAAI3F,MAAM,gDAC9C,OAAO,SAAUy8D,EAASzX,GAEzB,OADAziD,KAAKmD,IAAI+2D,EAAS92D,EAAMq/C,GACjBziD,OASTmH,KAAO,WACN,IAAI40D,EACAhwC,EAAO/rB,KAEX45D,EAAMh9D,OAAO,EAAE,GAEXg9D,EAAMt9D,OAAS,EAAG0D,KAAKo8D,OAAM,IAEhCzC,GAAS,EAGToC,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBAEN8rB,EAAKovC,OAAO7B,EAAUvtC,EAAKyuC,WAAWp3D,KAAM24D,IAGzC/7D,KAAKw6D,WAAWL,WACnBn6D,KAAKoF,KAAKk0D,EAAUt5D,KAAKw6D,WAAWp3D,KAAM24D,GAC1CzC,EAASvd,UAAY,0CAErBud,EAASvd,UAAY,2DAEtBsd,EAAQtd,UAAa,uCAGrBqd,EAAS1uD,UAUXL,KAAO,WAENjI,EAASC,cAAc,OACvBD,EAASC,cAAc,WACvBD,EAASC,cAAc,WAEI,MAAvBy2D,EAAE,qBACLO,EAAUj3D,EAASC,cAAc,QACzBuH,aAAa,KAAM,kBAC3ByvD,EAAQtd,UAAY,uCACpB35C,EAASsuD,KAAKvuD,YAAYk3D,IAGN,MAAjBP,EAAE,cACLa,GAAS,EACTC,EAAQ,IACRN,EAAWl3D,EAASC,cAAc,YACzBuH,aAAa,KAAM,YAC5B0vD,EAASvd,UAAY,2BACrB35C,EAASsuD,KAAKvuD,YAAYm3D,IAGD,MAAtBR,EAAE,oBACLS,EAAQn3D,EAASC,cAAc,YACzBuH,aAAa,KAAM,iBACzB2vD,EAAMxd,UAAY,qCAClB35C,EAASsuD,KAAKvuD,YAAYo3D,IAK3Bn3D,EAASsuD,KAAK9mD,aAAa,WAAY,KAEvC5J,KAAKw6D,WAAahB,KAYnBr2D,IAAM,SAAU+2D,EAAS92D,EAAMq/C,GAG9B,IAAI1yC,EAAQ,WACPwpD,GAA6B,OAApBA,EAAM4C,WACdpsD,KAQN,OALA/P,KAAKqK,OACL0F,IAEAwpD,EAAMxd,UAAY,gBAClB/7C,KAAKq8D,OAAOnC,EAAS92D,EAAMq/C,GACpBziD,MAcRq8D,OAAS,SAAUnC,EAAS92D,EAAMq/C,GACjC,IAAIt/C,EAAMf,EAASC,cAAc,WACjCc,EAAI44C,UAAY,gBAAmC,iBAAT34C,GAA8B,KAATA,EAAe,iBAAmBA,EAAO,IACxGD,EAAIoE,UAAY2yD,EAEhBX,EAAMp3D,YAAYgB,GAElB5D,YAAW,WAAa4D,EAAI44C,UAAY54C,EAAI44C,UAAY,uBAAyB,IACjF/7C,KAAK+d,MAAM5a,EAAKs/C,IAUjB5nC,IAAM,SAAU5d,GACf,IAAIgZ,EAEJ,GAAoB,iBAAThZ,GAAqBA,aAAgByO,MAAO,MAAM,IAAIjO,MAAM,0BAEvE,IAAKwY,KAAKhZ,EACLA,EAAKrC,eAAeqb,KACvBjW,KAAKiW,GAAKhZ,EAAKgZ,KAUlBmlD,SAAW,WACNtjD,GACHA,EAAMpN,QACNoN,EAAMwC,UAEF6+C,EAASzuD,SAQf0xD,MAAQ,SAAUE,GACjB,IAEIP,EAFA1uD,EAAOusD,EAAM,GACb7tC,EAAO/rB,KAIX25D,GAAS,EAEToC,EAAiB,SAAU32C,GAC1BA,EAAMnlB,kBACN8rB,EAAKqvC,WAELrvC,EAAKovC,OAAO7B,EAAUvtC,EAAKyuC,WAAWp3D,KAAM24D,IAGzC/7D,KAAKw6D,WAAWL,YAAcmC,GACjCt8D,KAAKoF,KAAKk0D,EAAUt5D,KAAKw6D,WAAWp3D,KAAM24D,GAG3CzC,EAAS/xD,UAAYvH,KAAK47D,MAAMvuD,GAEhC4rD,EAAYH,EAAE,uBACdI,EAAgBJ,EAAE,2BAClBE,EAAYF,EAAE,qBA7jBlB,EA8jBIC,EAAYD,EAAE,yBA9jBlB,EA+jBIK,EAAuC,WAA1BM,EAAUoB,YAA4B9B,EAAwC,SAA1BU,EAAUoB,YAA0B/B,EAAE,sBAAwBE,EAC/HlhD,EAAYghD,EAAE,uBAhkBlB,EAikBgBA,EAAE,uBAjkBlB,EAmkBoC,iBAArBzrD,EAAK4uD,aAAiD,KAArB5uD,EAAK4uD,cAAoBnkD,EAAMva,MAAQ8P,EAAK4uD,aACpFK,GAAWt8D,KAAKo7D,WACpBp7D,KAAK86D,aAAaztD,EAAKtO,WAYxBo8D,OAAS,SAAUxxD,EAAIyb,EAAOymB,GACS,mBAA3BliC,EAAGY,oBACbZ,EAAGY,oBAAoB6a,EAAOymB,GAAI,GACxBliC,EAAG4yD,aACb5yD,EAAG4yD,YAAY,KAAOn3C,EAAOymB,MAQX0a,OACpBl8C,KAAUovD,EAAUpvD,KACpBlH,IAAU,SAAU+2D,EAAS92D,EAAMq/C,GAA4C,OAApCgX,EAAUt2D,IAAI+2D,EAAS92D,EAAMq/C,GAAcziD,MACtFw8D,OAAU,SAAUtC,EAASruB,EAAIowB,EAAaxB,GAA4E,OAAhEhB,EAAUiB,OAAOR,EAAS,SAAUruB,EAAIowB,EAAaxB,GAAkBz6D,MACjIy8D,QAAU,SAAUvC,EAASzX,GAAiD,OAAzCgX,EAAUt2D,IAAI+2D,EAAS,UAAWzX,GAAcziD,MACrFw7D,MAAU,SAAUtB,EAASzX,GAA+C,OAAvCgX,EAAUt2D,IAAI+2D,EAAS,QAASzX,GAAcziD,MACnF6a,IAAU,SAAU5d,GAAQw8D,EAAU5+C,IAAI5d,IAC1CizD,OAAUuJ,EAAUvJ,OACpB3jC,MAAUktC,EAAU4B,eAKA,mBAAXthE,EACVA,EAAO,eAAe,IAAI,WAAc,OAAO,IAAI8+D,UACd,IAApB/sC,EAAO4wC,WACxB5wC,EAAO4wC,SAAW,IAAI7D,GA7mBxB,CAgnBE74D,MAIFjG,EAAO,kBAAkB,CAAC,cAAc,SAAU4T,GAIhD,MAAO,CAMLzJ,OAAS,SAAUC,GACjB,OAAOzJ,OAAOwJ,OAAOyJ,GACnBtJ,UAAUrE,MAAMoE,MAAMD,IAO1BgB,QAAU,SAAUzG,GAClB,IAAIwI,EAAOlH,KAAKkH,OAChBA,EAAKC,OAELD,EAAKoT,OAAOta,KAAK28D,QACjBz1D,EAAK01D,YACLl+D,EAAEqB,QAOJuP,MAAQ,WACN,OAAOtP,KAAKuE,UAAUyC,iBAO5BjN,EACE,aAAa,CAAC,OAAQ,kBAAmB,SACzC,SAAUwU,EAAWsuD,GAEnB,MAAO,CACL34D,OAAS,SAAUa,GAElB,MAAMuV,EAASvV,EAAQa,qBAAqB,UAAU,GAErD,GAAe,OAAX0U,EACF,OAGH,MAAMrP,EAAO,GAIZS,MAAMma,KACJvL,EAAO1U,qBAAqB,WAC5Ba,SAAQ,SAAS4G,GAElB,MAAMyvD,EAAM,CACVzvD,EAAKrG,YACLqG,EAAK0a,aAAa,UAIhB1a,EAAKwa,aAAa,SACpBi1C,EAAI3/D,KAAKkQ,EAAK0a,aAAa,SAE7B9c,EAAK9N,KAAK2/D,MAIZ,MAAM7hE,EAAMP,OAAOwJ,OAAOqK,GAAWlK,UAAUrE,MACxCoE,MACE6G,EAAM,CACL0C,UAAYkvD,IAkCtB,OA9BA5hE,EAAIw3D,WAAa1tD,EACjB9J,EAAI8hE,QAAUziD,EACdA,EAAOnR,MAAMK,QAAU,OAGvBvO,EAAI+hE,OAAS/hE,EAAIw3D,WAAWxwD,KAAK,QACjChH,EAAI+hE,OAAO16D,KAAK,IAEfrH,EAAIw3D,WAAWtwD,YAAYlH,EAAI8J,WAGhC9J,EAAIw3D,WAAW3oD,iBAAiB,QAAS7O,EAAIgiE,aAAa73D,KAAKnK,IAG/DA,EAAIwQ,OAAOhF,QAAQ,CAAC/H,EAAE3C,IAAM2C,EAAEi+D,OAAS5gE,GAGvCd,EAAI8J,UAAU+E,iBAAiB,QAAQ,SAAUpL,GAC/CsB,KAAKkH,KAAKC,OACVnH,KAAKkH,KAAK01D,eAMZtiD,EAAOxQ,iBAAiB,SAAU,SAAUpL,GAC1CsB,KAAK48D,aACLx3D,KAAKnK,IAEPA,EAAI2hE,YACG3hE,GAMRqf,OAAS,SAAU1c,GACjB,MAAMkJ,EAAI9G,KAMX,OALI9C,UAAUZ,OAAS,IACrBwK,EAAEuT,UAAYzc,EACdkJ,EAAEi2D,QAAQG,cAAgBt/D,GAGrBkJ,EAAEuT,WAAavT,EAAEi2D,QAAQG,eAAiB,GAOlDtG,YAAc,SAAUuG,GACtB,MAAMr2D,EAAI9G,KACJo9D,EAAMt2D,EAAEi2D,QAAQx2C,QACtB,IAAK,IAAIxqB,EAAI,EAAGA,EAAIqhE,EAAI9gE,OAAQP,IAC/B,GAAIqhE,EAAIrhE,GAAGwB,OAAS4/D,EAAQ,CACzBr2D,EAAEK,OACFL,EAAEwT,OAAOve,GACT+K,EAAE81D,YACF,MAGJ,OAAO91D,GAOTm2D,aAAe,WACb,MAAMn2D,EAAI9G,KACX8G,EAAEk2D,OAAO7zD,MAAMK,QAAU,OACzB1C,EAAEyG,KAAKzG,EAAEuT,UAAYvT,EAAEi2D,QAAQG,eAC/Bp2D,EAAE4D,SAOHkyD,UAAY,WAGV,MAAM91D,EAAI9G,KACD8G,EAAEwT,SACZxT,EAAEk2D,OAAOh2D,YAAcF,EAAEuG,KACvBvG,EAAEwT,UACFhL,QACFxI,EAAEk2D,OAAO7zD,MAAMK,QAAU,cAM/B,SAAS9K,GAAG,oBAAoBD,QAAQC,EAAED,UAAUmB,OAAOy9D,KAAK3+D,EAAE,IAAI,mBAAmB3E,GAAQA,EAAO2F,KAAK3F,EAAO,+BAA+B,IAAG,WAAW,OAAO6F,OAAOy9D,SAA/K,EAAwL,SAAS3+D,GAAG,SAASJ,EAAEI,GAAG,OAAOA,EAAEjC,QAAQ,MAAM,SAASA,QAAQ,MAAM,QAAQA,QAAQ,MAAM,QAAQ,SAASqK,EAAEpI,GAAG,OAAOA,EAAE84D,SAASj2D,cAAc,SAAS+S,EAAE5V,EAAEJ,GAAG,IAAIwI,EAAEpI,GAAGA,EAAEopB,KAAKxpB,GAAG,OAAOwI,GAAG,GAAGA,EAAElJ,MAAgP,SAAS7B,EAAE2C,EAAEJ,GAAG,IAAIwI,EAAEwN,EAAE,GAAG,IAAIxN,KAAKpI,EAAE4V,EAAExN,GAAGpI,EAAEoI,GAAG,GAAGxI,EAAE,IAAIwI,KAAKxI,EAAEgW,EAAExN,GAAGxI,EAAEwI,GAAG,OAAOwN,EAAE,SAAS2X,EAAEvtB,GAAG,IAAIJ,EAAE,GAAG,OAAO,SAASgW,EAAE5V,EAAEiV,GAAG,IAAI,IAAI5X,EAAE2C,EAAEmC,WAAW9E,EAAEA,EAAEA,EAAE6pB,YAAY,GAAG7pB,EAAEmK,SAASyN,GAAG5X,EAAEgK,UAAUzJ,OAAO,GAAGP,EAAEmK,WAAW5H,EAAEnB,KAAK,CAACioB,MAAM,QAAQ5c,OAAOmL,EAAE/S,KAAK7E,IAAI4X,EAAEW,EAAEvY,EAAE4X,GAAG7M,EAAE/K,GAAGsb,MAAM,oBAAoB/Y,EAAEnB,KAAK,CAACioB,MAAM,OAAO5c,OAAOmL,EAAE/S,KAAK7E,KAAK,OAAO4X,EAA5O,CAA+OjV,EAAE,GAAGJ,EAAE,SAAS4tB,EAAExtB,EAAE4V,EAAEX,GAAG,SAAS5X,IAAI,OAAO2C,EAAEpC,QAAQgY,EAAEhY,OAAOoC,EAAE,GAAG8J,QAAQ8L,EAAE,GAAG9L,OAAO9J,EAAE,GAAG8J,OAAO8L,EAAE,GAAG9L,OAAO9J,EAAE4V,EAAE,SAASA,EAAE,GAAG8Q,MAAM1mB,EAAE4V,EAAE5V,EAAEpC,OAAOoC,EAAE4V,EAAE,SAAS2X,EAAEvtB,GAA0D8hB,GAAG,IAAI1Z,EAAEpI,GAAGgN,MAAM/Q,UAAUyB,IAAIjB,KAAKuD,EAAE4+D,YAA9F,SAAW5+D,GAAG,MAAM,IAAIA,EAAE84D,SAAS,KAAKl5D,EAAEI,EAAEnB,OAAO,OAAyDV,KAAK,IAAI,IAAI,SAASqvB,EAAExtB,GAAG8hB,GAAG,KAAK1Z,EAAEpI,GAAG,IAAI,SAAS0e,EAAE1e,IAAI,SAASA,EAAE0mB,MAAM6G,EAAEC,GAAGxtB,EAAEkC,MAAM,IAAI,IAAI2I,EAAE,EAAEiX,EAAE,GAAGniB,EAAE,GAAGK,EAAEpC,QAAQgY,EAAEhY,QAAQ,CAAC,IAAI+wB,EAAEtxB,IAAI,GAAGykB,GAAGliB,EAAEqV,EAAEtS,OAAOkI,EAAE8jB,EAAE,GAAG7kB,OAAOe,IAAIA,EAAE8jB,EAAE,GAAG7kB,OAAO6kB,GAAG3uB,EAAE,CAACL,EAAE2a,UAAUvS,QAAQylB,GAAG,GAAG9O,EAAEiQ,EAAEzwB,OAAO,EAAE,GAAG,IAAIywB,EAAEtxB,UAAUsxB,GAAG3uB,GAAG2uB,EAAE/wB,QAAQ+wB,EAAE,GAAG7kB,QAAQe,GAAGlL,EAAE2a,UAAUvS,QAAQwlB,OAAO,SAASoB,EAAE,GAAGjI,MAAM/mB,EAAElB,KAAKkwB,EAAE,GAAGzsB,MAAMvC,EAAEmiC,MAAMpjB,EAAEiQ,EAAEzwB,OAAO,EAAE,GAAG,IAAI,OAAO4jB,EAAEliB,EAAEqV,EAAEtS,OAAOkI,IAAI,SAAS6T,EAAE1e,GAAG,SAASJ,EAAEI,GAAG,OAAOA,GAAGA,EAAE2hC,QAAQ3hC,EAAE,SAASoI,EAAEA,EAAEwN,GAAG,OAAO,IAAIlU,OAAO9B,EAAEwI,GAAG,KAAKpI,EAAE6+D,GAAG,IAAI,KAAKjpD,EAAE,IAAI,MAAK,SAASA,EAAEX,EAAEsY,GAAG,IAAItY,EAAE6pD,SAAS,CAAC,GAAG7pD,EAAE6pD,UAAS,EAAG7pD,EAAEsC,EAAEtC,EAAEsC,GAAGtC,EAAE8pD,GAAG9pD,EAAEsC,EAAE,CAAC,IAAIiW,EAAE,GAAG9O,EAAE,SAAS9e,EAAEwI,GAAGpI,EAAE6+D,KAAKz2D,EAAEA,EAAEvF,eAAeuF,EAAE3K,MAAM,KAAKsK,SAAQ,SAAS/H,GAAG,IAAIoI,EAAEpI,EAAEvC,MAAM,KAAK+vB,EAAEplB,EAAE,IAAI,CAACxI,EAAEwI,EAAE,GAAGkT,OAAOlT,EAAE,IAAI,OAAM,iBAAiB6M,EAAEsC,EAAEmH,EAAE,UAAUzJ,EAAEsC,GAAGvb,OAAOqf,KAAKpG,EAAEsC,GAAGxP,SAAQ,SAAS/H,GAAG0e,EAAE1e,EAAEiV,EAAEsC,EAAEvX,OAAMiV,EAAEsC,EAAEiW,EAAEvY,EAAE+pD,GAAG52D,EAAE6M,EAAE6M,GAAG,WAAU,GAAIyL,IAAItY,EAAE8pD,KAAK9pD,EAAElE,EAAE,OAAOkE,EAAE8pD,GAAGthE,MAAM,KAAKU,KAAK,KAAK,QAAQ8W,EAAElE,IAAIkE,EAAElE,EAAE,SAASkE,EAAEgqD,GAAG72D,EAAE6M,EAAElE,GAAGkE,EAAEjV,GAAGiV,EAAEiqD,KAAKjqD,EAAEjV,EAAE,SAASiV,EAAEjV,IAAIiV,EAAEkqD,GAAG/2D,EAAE6M,EAAEjV,IAAIiV,EAAEmqD,GAAGx/D,EAAEqV,EAAEjV,IAAI,GAAGiV,EAAEiqD,IAAI3xC,EAAE6xC,KAAKnqD,EAAEmqD,KAAKnqD,EAAEjV,EAAE,IAAI,IAAIutB,EAAE6xC,KAAKnqD,EAAE5X,IAAI4X,EAAEoqD,GAAGj3D,EAAE6M,EAAE5X,SAAI,IAAS4X,EAAEW,IAAIX,EAAEW,EAAE,GAAGX,EAAEyJ,IAAIzJ,EAAEyJ,EAAE,IAAI,IAAI7T,EAAE,GAAGoK,EAAEyJ,EAAE3W,SAAQ,SAAS/H,GAAGA,EAAEqF,EAAErF,EAAEqF,EAAE0C,SAAQ,SAASnI,GAAGiL,EAAEpM,KAAKpB,EAAE2C,EAAEJ,OAAMiL,EAAEpM,KAAK,QAAQuB,EAAEiV,EAAEjV,MAAKiV,EAAEyJ,EAAE7T,EAAEoK,EAAEyJ,EAAE3W,SAAQ,SAAS/H,GAAG4V,EAAE5V,EAAEiV,MAAKA,EAAEqqD,QAAQ1pD,EAAEX,EAAEqqD,OAAO/xC,GAAG,IAAIzL,EAAE7M,EAAEyJ,EAAEhhB,KAAI,SAASsC,GAAG,OAAOA,EAAE++D,GAAG,QAAQ/+D,EAAE+Q,EAAE,QAAQ/Q,EAAE+Q,KAAI9S,OAAO,CAACgX,EAAEmqD,GAAGnqD,EAAE5X,IAAIK,IAAIkC,GAAG6a,OAAOggC,SAASxlC,EAAE7M,EAAE0Z,EAAElkB,OAAOwK,EAAE0Z,EAAE3jB,KAAK,MAAK,GAAI,CAACirB,KAAK,WAAW,OAAO,QAAQxT,CAAE5V,GAAG,SAAS6K,EAAE7K,EAAEoI,EAAE6M,EAAE5X,GAAG,SAASkwB,EAAEvtB,EAAEJ,GAAG,IAAI,IAAIwI,EAAE,EAAEA,EAAExI,EAAE8e,EAAE9gB,OAAOwK,IAAI,GAAGwN,EAAEhW,EAAE8e,EAAEtW,GAAG62D,GAAGj/D,GAAG,OAAOJ,EAAE8e,EAAEtW,GAAG,SAASolB,EAAExtB,EAAEJ,GAAG,GAAGgW,EAAE5V,EAAEm/D,GAAGv/D,GAAG,CAAC,KAAKI,EAAEu/D,YAAYv/D,EAAE4R,QAAQ5R,EAAEA,EAAE4R,OAAO,OAAO5R,EAAE,OAAOA,EAAEk/D,GAAG1xC,EAAExtB,EAAE4R,OAAOhS,QAAG,EAAO,SAASD,EAAEK,EAAEJ,GAAG,OAAOqV,GAAGW,EAAEhW,EAAEy/D,GAAGr/D,GAAG,SAAS2uB,EAAE3uB,EAAEJ,GAAG,IAAIwI,EAAEo3D,EAAEX,GAAGj/D,EAAE,GAAGiD,cAAcjD,EAAE,GAAG,OAAOI,EAAEuX,EAAErb,eAAekM,IAAIpI,EAAEuX,EAAEnP,GAAG,SAAStI,EAAEE,EAAEJ,EAAEwI,EAAEwN,GAAG,IAAyBvY,EAAE,iBAArBuY,EAAE,GAAG8b,EAAE+tC,aAAiD,OAAOpiE,GAAG2C,EAAE,MAAOJ,GAAlCwI,EAAE,GAAG,WAA0b,SAAS2I,IAAI,YAAO,IAAS2uD,EAAEC,GAAnN,WAAa,GAAGD,EAAEC,KAAKnwC,EAAEkwC,EAAEC,IAAI,OAAO//D,EAAE4xB,GAAG,IAAIxxB,EAAE0/D,EAAEC,GAAG90D,EAAE60D,EAAEC,GAAGnuC,GAAE,EAAGouC,EAAEF,EAAEC,KAAK79C,EAAE0P,GAAG,OAAOkuC,EAAE9pD,EAAE,IAAIiqD,GAAG7/D,EAAE4V,GAAG,cAAc8pD,EAAEI,kBAAkBF,EAAEF,EAAEC,IAAI3/D,EAAE0K,KAAK5K,EAAEE,EAAE+/D,SAAS//D,EAAEnB,OAAM,GAAG,GAAsCs0B,GAA3b,WAAa,IAAIusC,EAAEnoD,EAAE,OAAO3X,EAAE4xB,GAAG,IAAIxxB,EAAE,GAAGoI,EAAE,EAAEs3D,EAAEV,GAAG/hE,UAAU,EAAE,IAAI,IAAI2Y,EAAE8pD,EAAEV,GAAG51C,KAAKoI,GAAG5b,GAAG,CAAC5V,GAAGJ,EAAE4xB,EAAE7uB,OAAOyF,EAAEwN,EAAE1W,MAAMkJ,IAAI,IAAI6M,EAAE0Z,EAAE+wC,EAAE9pD,GAAGX,GAAG4qD,GAAG5qD,EAAE,GAAGjV,GAAGF,EAAEmV,EAAE,GAAGrV,EAAEgW,EAAE,MAAM5V,GAAGJ,EAAEgW,EAAE,IAAIxN,EAAEs3D,EAAEV,GAAG/hE,UAAU2Y,EAAE8pD,EAAEV,GAAG51C,KAAKoI,GAAG,OAAOxxB,EAAEJ,EAAE4xB,EAAE7uB,OAAOyF,IAA8NsT,GAAI,SAASrW,EAAErF,EAAEoI,GAAG,IAAIwN,EAAE5V,EAAEggE,GAAGlgE,EAAEE,EAAEggE,GAAG,IAAG,GAAI,GAAGhgE,EAAEigE,IAAI1oD,GAAG3B,EAAE4b,EAAE,IAAIxxB,EAAEkgE,IAAI3oD,GAAG3X,EAAEwI,GAAGwN,EAAE4b,EAAE,KAAKja,GAAG3B,EAAE4b,EAAEppB,GAAGs3D,EAAE1jE,OAAOwJ,OAAOxF,EAAE,CAAC4R,OAAO,CAAC/S,MAAM6gE,KAAK,SAASn3D,EAAEvI,EAAEoI,GAAG,GAAGopB,GAAGxxB,OAAE,IAASoI,EAAE,OAAOmP,GAAGxG,IAAI,EAAE,IAAI6E,EAAE2X,EAAEnlB,EAAEs3D,GAAG,GAAG9pD,EAAE,OAAO2B,GAAGxG,IAAI1L,EAAEuQ,EAAExN,GAAGwN,EAAEqqD,GAAG,EAAE73D,EAAExK,OAAO,IAAIqX,EAAEuY,EAAEkyC,EAAEt3D,GAAG,GAAG6M,EAAE,CAAC,IAAI5X,EAAEqiE,EAAEriE,EAAE8iE,IAAI9iE,EAAE+iE,KAAK5uC,GAAGppB,GAAGmP,GAAGxG,IAAI,GAAG2uD,EAAEM,KAAKzoD,GAAG,WAAWsoD,GAAGH,EAAE9pD,EAAE8pD,EAAEA,EAAE9tD,aAAa8tD,GAAGzqD,EAAErD,QAAQ,OAAOvU,EAAE+iE,KAAK7oD,GAAG3X,EAAEwI,IAAIopB,EAAE,GAAGvc,EAAEqqD,QAAQj6D,EAAE4P,EAAEqqD,OAAO,IAAIjiE,EAAE8iE,GAAG,EAAE/3D,EAAExK,OAAO,GAAG+B,EAAEyI,EAAEs3D,GAAG,MAAM,IAAI3gE,MAAM,mBAAmBqJ,EAAE,gBAAgBs3D,EAAEM,IAAI,aAAa,KAAK,OAAOxuC,GAAGppB,EAAEA,EAAExK,QAAQ,EAAE,IAAI4hE,EAAEa,EAAErgE,GAAG,IAAIw/D,EAAE,MAAM,IAAIzgE,MAAM,sBAAsBiB,EAAE,KAAK0e,EAAE8gD,GAAG,IAAIc,EAAEZ,EAAEriE,GAAGmiE,EAAEI,EAAE,GAAGroD,EAAE,GAAG,IAAI+oD,EAAEZ,EAAEY,GAAGd,EAAEc,EAAEA,EAAE1uD,OAAO0uD,EAAEN,KAAKzoD,EAAEzX,EAAEwgE,EAAEN,GAAG,IAAG,GAAIzoD,GAAG,IAAIia,EAAE,GAAGquC,EAAE,EAAE,IAAI,IAAI,IAAIU,EAAEjjE,EAAEkjE,EAAE,EAAQd,EAAEt3D,EAAEnL,UAAUujE,EAAED,EAAEb,EAAEt3D,EAAEghB,KAAKhhB,IAAY9K,EAAEiL,EAAEH,EAAEzF,OAAO69D,EAAED,EAAErhE,MAAMshE,GAAGD,EAAE,IAAIC,EAAED,EAAErhE,MAAM5B,EAAE,IAAIiL,EAAEH,EAAEzF,OAAO69D,IAAIF,EAAEZ,EAAEY,EAAE1uD,OAAO0uD,EAAEA,EAAE1uD,OAAO0uD,EAAEN,KAAKzoD,GAAG,WAAW,MAAM,CAAC3B,EAAEiqD,EAAEhhE,MAAM0Y,EAAEwoD,SAAS//D,EAAE0K,IAAIg1D,GAAG,MAAMe,GAAG,IAAI,GAAGA,EAAEjF,QAAQr8D,QAAQ,WAAW,MAAM,CAACyW,EAAE,EAAE/W,MAAMe,EAAEwI,IAAI,MAAMq4D,GAAG,SAAS3+C,EAAE9hB,EAAEoI,GAAGA,EAAEA,GAAGspB,EAAEgvC,WAAW1kE,OAAOqf,KAAKmU,GAAG,IAAI5Z,EAAE,CAACA,EAAE,EAAE/W,MAAMe,EAAEI,IAAIiV,EAAEW,EAAE,OAAOxN,EAAEL,SAAQ,SAASnI,GAAG,GAAGygE,EAAEzgE,GAAG,CAAC,IAAIwI,EAAEyC,EAAEjL,EAAEI,GAAE,GAAIoI,EAAE23D,SAASngE,EAAEwI,EAAEwN,EAAEX,EAAEW,IAAIX,EAAE7M,GAAGA,EAAEwN,EAAEA,EAAEA,IAAIX,EAAEW,EAAEA,EAAExN,OAAM6M,EAAE8qD,WAAWnqD,EAAE+qD,YAAY1rD,GAAGW,EAAE,SAASjW,EAAEK,GAAG,OAAO0xB,EAAEkvC,aAAa5gE,EAAEA,EAAEjC,QAAQ,sBAAqB,SAASiC,EAAEJ,GAAG,OAAOA,EAAE7B,QAAQ,MAAM2zB,EAAEkvC,gBAAelvC,EAAEmvC,QAAQ7gE,EAAEA,EAAEjC,QAAQ,MAAM,SAASiC,EAA2I,SAASF,EAAEE,GAAG,IAAIJ,EAA1kJ,SAAWI,GAAG,IAAIJ,GAAGI,EAAEq9C,UAAU,KAAKr9C,EAAEmH,WAAWnH,EAAEmH,WAAWk2C,UAAU,KAAK5/C,MAAM,OAAO,OAAOmC,EAAEA,EAAElC,KAAI,SAASsC,GAAG,OAAOA,EAAEjC,QAAQ,gBAAgB,QAAQ0c,QAAO,SAASza,GAAG,OAAOqgE,EAAErgE,IAAI,6BAA6BlC,KAAKkC,MAAK,GAAq2IiV,CAAEjV,GAAG,IAAI,6BAA6BlC,KAAK8B,GAAG,CAAC,IAAIwI,EAAEspB,EAAEmvC,OAAOz4D,EAAE1E,SAASqnD,gBAAgB,+BAA+B,QAASliD,UAAU7I,EAAE6I,UAAU9K,QAAQ,MAAM,IAAIA,QAAQ,cAAc,MAAOqK,EAAEpI,EAAE,IAAI4V,EAAExN,EAAEE,YAAYjL,EAAEuC,EAAEiL,EAAEjL,EAAEgW,GAAE,GAAIkM,EAAElM,GAAG8I,EAAE6O,EAAEnlB,GAAG,GAAGsW,EAAE9gB,OAAO,CAAC,IAAIkC,EAAE4D,SAASqnD,gBAAgB,+BAA+B,OAAOjrD,EAAE+I,UAAUxL,EAAEwB,MAAMxB,EAAEwB,MAAM2uB,EAAE9O,EAAE6O,EAAEztB,GAAG8V,GAAGvY,EAAEwB,MAAMc,EAAEtC,EAAEwB,OAAOmB,EAAE6I,UAAUxL,EAAEwB,MAAMmB,EAAEq9C,UAAxjB,SAAWr9C,EAAEJ,EAAEwI,GAAG,IAAIwN,EAAEhW,EAAE4/D,EAAE5/D,GAAGwI,EAAE6M,EAAE,CAACjV,EAAE2H,QAAQ,OAAO3H,EAAE2Y,MAAM,aAAa1D,EAAExW,KAAK,SAAS,IAAIuB,EAAEb,QAAQyW,IAAIX,EAAExW,KAAKmX,GAAGX,EAAE9W,KAAK,KAAKwJ,OAAgcgnB,CAAE3uB,EAAEq9C,UAAUz9C,EAAEvC,EAAE0iE,UAAU//D,EAAEy9B,OAAO,CAACsiC,SAAS1iE,EAAE0iE,SAASlqD,GAAGxY,EAAEuY,GAAGvY,EAAEsjE,cAAc3gE,EAAE2gE,YAAY,CAACZ,SAAS1iE,EAAEsjE,YAAYZ,SAASlqD,GAAGxY,EAAEsjE,YAAY/qD,KAA4B,SAASud,IAAI,IAAIA,EAAE2tC,OAAO,CAAC3tC,EAAE2tC,QAAO,EAAG,IAAI9gE,EAAE0D,SAAS40D,iBAAiB,YAAYtrD,MAAM/Q,UAAU8L,QAAQtL,KAAKuD,EAAEF,IAA8M,SAASugE,EAAErgE,GAAG,OAAOwvB,EAAExvB,IAAIwvB,EAAEgwC,EAAEx/D,IAAI,IAAI0xB,EAAE,CAAC+tC,YAAY,QAAQmB,WAAW,KAAKC,OAAM,EAAGH,eAAU,GAAQlxC,EAAE,GAAGgwC,EAAE,GAAG,OAAOx/D,EAAE2G,UAAUkE,EAAE7K,EAAE+gE,cAAcj/C,EAAE9hB,EAAEghE,UAAUrhE,EAAEK,EAAEihE,eAAenhE,EAAEE,EAAEkhE,UAAphB,SAAWlhE,GAAG0xB,EAAEr0B,EAAEq0B,EAAE1xB,IAA4gBA,EAAEmhE,iBAAiBhuC,EAAEnzB,EAAEohE,uBAA1a,WAAah2D,iBAAiB,mBAAmB+nB,GAAE,GAAI/nB,iBAAiB,OAAO+nB,GAAE,IAAkXnzB,EAAEqhE,iBAAhX,SAAWzhE,EAAEwI,GAAG,IAAIwN,EAAE4Z,EAAE5vB,GAAGwI,EAAEpI,GAAG4V,EAAE0rD,SAAS1rD,EAAE0rD,QAAQv5D,SAAQ,SAAS/H,GAAGw/D,EAAEx/D,GAAGJ,MAAqTI,EAAEuhE,cAAnT,WAAa,OAAOvlE,OAAOqf,KAAKmU,IAAmSxvB,EAAEwhE,YAAYnB,EAAErgE,EAAEyhE,QAAQpkE,EAAE2C,EAAE0hE,GAAG,eAAe1hE,EAAE2hE,IAAI,gBAAgB3hE,EAAE4hE,GAAG,oBAAoB5hE,EAAE6hE,IAAI,kEAAkE7hE,EAAE8hE,IAAI,eAAe9hE,EAAE+hE,IAAI,+IAA+I/hE,EAAEgiE,GAAG,CAACjxD,EAAE,eAAe6E,EAAE,GAAG5V,EAAEiiE,IAAI,CAACjC,GAAG,SAASjvD,EAAE,IAAI/Q,EAAE,IAAI3C,EAAE,MAAMqhB,EAAE,CAAC1e,EAAEgiE,KAAKhiE,EAAEkiE,IAAI,CAAClC,GAAG,SAASjvD,EAAE,IAAI/Q,EAAE,IAAI3C,EAAE,MAAMqhB,EAAE,CAAC1e,EAAEgiE,KAAKhiE,EAAEmiE,IAAI,CAACpxD,EAAE,mHAAmH/Q,EAAEugE,EAAE,SAAS3gE,EAAEwI,EAAEwN,GAAG,IAAIX,EAAEjV,EAAEyhE,QAAQ,CAACzB,GAAG,UAAUjvD,EAAEnR,EAAEI,EAAEoI,EAAEsW,EAAE,IAAI9I,GAAG,IAAI,OAAOX,EAAEyJ,EAAEjgB,KAAKuB,EAAEmiE,KAAKltD,GAAGjV,EAAEoiE,KAAKpiE,EAAEugE,EAAE,KAAK,KAAKvgE,EAAEqiE,KAAKriE,EAAEugE,EAAE,OAAO,QAAQvgE,EAAEsiE,IAAItiE,EAAEugE,EAAE,IAAI,KAAKvgE,EAAEuiE,GAAG,CAACvC,GAAG,SAASjvD,EAAE/Q,EAAE4hE,GAAGhsD,EAAE,GAAG5V,EAAEwiE,IAAI,CAACxC,GAAG,SAASjvD,EAAE/Q,EAAE6hE,IAAIjsD,EAAE,GAAG5V,EAAEyiE,IAAI,CAACzC,GAAG,SAASjvD,EAAE/Q,EAAE8hE,IAAIlsD,EAAE,GAAG5V,EAAE0iE,MAAM,CAAC1C,GAAG,SAASjvD,EAAE/Q,EAAE4hE,GAAG,kGAAkGhsD,EAAE,GAAG5V,EAAE2iE,GAAG,CAAC3C,GAAG,SAASjvD,EAAE,KAAK/Q,EAAE,aAAa3C,EAAE,KAAKqhB,EAAE,CAAC1e,EAAEgiE,GAAG,CAACjxD,EAAE,KAAK/Q,EAAE,KAAK4V,EAAE,EAAE8I,EAAE,CAAC1e,EAAEgiE,OAAOhiE,EAAE4iE,GAAG,CAAC5C,GAAG,QAAQjvD,EAAE/Q,EAAE0hE,GAAG9rD,EAAE,GAAG5V,EAAE6iE,IAAI,CAAC7C,GAAG,QAAQjvD,EAAE/Q,EAAE2hE,IAAI/rD,EAAE,GAAG5V,KAAI2+D,KAAK0C,iBAAiB,QAAO,SAASrhE,GAAG,IAAIoI,EAAE,CAAC06D,QAAQ,mBAAmBzlE,EAAE,CAAC2C,EAAEkiE,IAAIliE,EAAEwiE,KAAK1gD,EAAE,CAACk+C,GAAG,QAAQhgE,EAAE,IAAIk/D,IAAG,EAAGkB,IAAG,EAAG1hD,EAAErhB,EAAEka,EAAEnP,GAAGsW,EAAE,CAAC3N,EAAE,IAAI/Q,EAAE,IAAI0e,EAAE,CAAC,CAACshD,GAAG,YAAYjvD,EAAE,QAAQ/Q,EAAE,aAAakgE,IAAG,EAAGE,IAAG,EAAG1hD,EAAE,CAAC1e,EAAEgiE,IAAI3kE,EAAE,MAAMiiE,OAAOx9C,IAAIzkB,EAAE,OAAOuC,EAAE,CAACmR,EAAE,MAAM/Q,EAAE,MAAM0e,EAAE,CAAC1e,EAAEyhE,QAAQ3/C,EAAE,CAACk+C,GAAG,QAAQ3iE,EAAE,OAAO,OAAOA,EAAEa,OAAOb,EAAEO,OAAO,EAAE8gB,EAAE9e,GAAG,CAAC8e,EAAErhB,EAAEka,EAAEnP,EAAE/K,EAAE,UAG3jPhC,EAAO,yBAAyB,CAC9B,OACA,iCACC,SAAUmkB,GACX,MAAO,CACLha,OAAS,SAAUmL,GACjB,OAAO3U,OAAOwJ,OAAOga,GAClB9Z,MAAMiL,GACNhL,UAAUrE,OAMfuN,KAAO,WACL,GAAIvN,KAAK2e,MACP,OAAO3e,KAAK2e,MAEd,MAAM8iD,EAAKr/D,SAASC,cAAc,OAClCo/D,EAAG73D,aAAa,KAAM,cAEtB,MAAM83D,EAAUD,EAAGx/D,KAAK,OAUxB,OARAy/D,EAAQp/D,KACNgvB,KAAKC,UAAU1xB,MAAM8hE,YAAc,GAAI,KAAM,OAI/CtE,KAAKsC,eAAe+B,GAEpB1hE,KAAK2e,MAAQ8iD,EACNA,OAYb1nE,EAAO,eAAe,CACpB,QACA,2BACC,SAAUwlB,EAAYqiD,GAEvB,MAAMxnD,EAAIhY,SAGJO,EAAM9C,MAAM6C,OAClBC,EAAIkf,aAAelf,EAAIkf,cAAgB,mBACvClf,EAAImf,QAAenf,EAAImf,SAAgB,kBAEvC,MAAM+/C,EAAQ,CAAC,OAAQ,QAAQ,UAE/B,MAAO,CACL39D,OAAS,SAAU49D,GACjB,OAAOpnE,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,WAAWC,UAAUrE,MAAMoE,MAAM09D,IAI3E19D,MAAQ,SAAU09D,GAgBhB,OAfA9hE,KAAK+hE,QAAUD,EAGXjiE,MAAMwxD,SAGRxxD,MAAMwxD,OACHjzC,YAAY,UACZ3X,QAAQ1K,GAAKiE,KAAKqd,QAAQtb,IAAI3E,MAAM4C,KAAKqd,QAASthB,IAErD8D,MAAMwxD,OAAO2Q,iBAAiB,WAGhChiE,KAAKsd,SAAU,EAERtd,MAOTiiE,YAAc,WAGZ,MAAMC,EAAWliE,KAAKqd,QAAQtb,IAC5BY,EAAImf,QACJ,CAACvQ,IAAM,CAAC,UAAU,iBAClB,WAEE,MAAMzK,EAAI9G,KAGN8G,EAAEq7D,KAAOr7D,EAAEq7D,IAAI7zD,QACjBxH,EAAEq7D,IAAIpkD,SAIRjX,EAAEq7D,IAAMP,EAAY19D,SAGpB4C,EAAEq7D,IAAIlkD,QAAU,kBACPje,KAAK+hE,QAAY,IACxB38D,KAAK0B,GAEPA,EAAEi7D,QAAY,IAAI,EAClBj7D,EAAE/E,IAAI+E,EAAEq7D,SAKRniE,KAAK+hE,QAAY,IACnBG,EAASvlD,SAObylD,eAAiB,WAIfpiE,KAAKqd,QAAQtb,IAAIY,EAAIkf,aAAc,CAACtQ,IAAM,CAAC,QAAQ,QAAQ,iBAAiB,SAAU7S,GACpF,IAAI2jE,EAAOjoD,EAAEm4C,cAAc,gBAAgB1wD,UAE3CggE,EAAMrpD,MAAK,SAASqsB,EAAO9oC,GACzB,GAAIsmE,EAAKvgE,SAAS,SAAW+iC,GAAQ,CACnC,MAAMvmC,EAAKvC,GAAK,EAAI,EAAIA,EAAE,EACpBumE,EAAKhkE,GAAK,EAAI,EAAIA,EAAE,EAI1B,OAHA+jE,EAAKrgE,OAAO,SAAW6iC,GACvBw9B,EAAKtgE,IAAI,SAAW8/D,EAAMvjE,IAC1B0B,KAAK2O,OAAOlN,YAAYogE,EAAMvjE,GAAIujE,EAAMS,KACjC,KAERtiE,cAaXjG,EAAO,cAAc,CACnB,UACC,SAAUwlB,GAEDnd,SAGEvC,MAAM6C,OAElB,MAAO,CACLwB,OAAS,SAAU49D,GACjB,OAAOpnE,OAAOwJ,OAAOqb,GAAYnb,MAAM,CAAC,UAAUC,UAAUrE,MAAMoE,MAAM09D,IAI1E19D,MAAQ,SAAU09D,GAChB9hE,KAAK+hE,QAAUD,EACf,MAAMnuD,EAAI3T,KAAKqd,QAaf,OAVIxd,MAAMwxD,SAGRxxD,MAAMwxD,OACHjzC,YAAY,SACZ3X,QAAQ1K,GAAK4X,EAAE5R,IAAI3E,MAAMuW,EAAG5X,IAE/B8D,MAAMwxD,OAAO2Q,iBAAiB,UAGzBhiE,UAYb,SAAU3B,GACN,GAAuB,iBAAZI,SAA0C,oBAAXE,OACtCA,OAAOF,QAAUJ,IAGjBM,OAAOF,QAAQ8jE,QAAU,WAGvB,OAFAh/D,QAAQi/D,KAAK,sGAENnkE,IAAIjB,MAAM4C,KAAM9C,iBAEtB,GAAsB,mBAAXnD,GAAyBA,EAAO2F,IAC9C3F,EAAO,YAAY,GAAIsE,OACpB,EAEmB,oBAAXuB,OACHA,OACqB,oBAAXksB,OACVA,OACmB,oBAATC,KACVA,KAEA/rB,MAENuiE,QAAUlkE,KAvBpB,EAyBG,WASD,SAASokE,EAAQxnE,GACf+E,KAAK0iE,eAAiBznE,EACtB+E,KAAK2iE,YAAc,GAEnB3iE,KAAK4iE,SAAW,CAEdC,UAAW,cAEXC,UAAW,cAEXC,UAAW,OAEXC,UAAW,OAEXC,UAAU,EAEVC,UAAU,EAEVC,gBAAiB,SAEjBC,aAAc,GAEdC,eAAgB,GAEhBC,WAAW,EAEXC,oBAAoB,EAEpBC,iBAAiB,EAEjBC,oBAAoB,EAEpBC,aAAa,EAEbC,aAAa,EAEbC,cAAc,EAEdC,iBAAiB,EAMjBr9C,SAAU,UAEVs9C,cAAe,GAEfC,eAAgB,GAEhBC,mBAAoB,CAAC,SAAU,MAAO,QAAS,QAE/CC,oBAAoB,EAEpBC,qBAAsB,GAEtBC,aAAc,aAEdC,gBAAiB,SAEjBC,eAAe,EAEfC,YAAa,kBAajB,SAASC,EAAiBC,EAAWxyD,GACnC,IAAIyyD,EAAgBD,EAAUxN,iBAAiB,iBAC3C0N,EAAa,GAEjB,GAAI1kE,KAAK4iE,SAAS+B,MAEhBC,EAAS5kE,KAAK4iE,SAAS+B,MAAO,SAAUlf,GACtC,IAAIof,EAAcC,EAAarf,GAY/B,GATAof,EAAYpf,KAAOif,EAAWpoE,OAAS,EAGF,iBAAzBuoE,EAAmB,UAE7BA,EAAY9/D,QAAU3C,SAASmwD,cAAcsS,EAAY9/D,eAItB,IAAzB8/D,EAAmB,SAA6C,OAAxBA,EAAY9/D,QAAkB,CAChF,IAAIggE,EAAuB3iE,SAASmwD,cAAc,2BAErB,OAAzBwS,KACFA,EAAuB3iE,SAASC,cAAc,QACzB05C,UAAY,yBAEjC35C,SAASsuD,KAAKvuD,YAAY4iE,IAG5BF,EAAY9/D,QAAWggE,EACvBF,EAAY54D,SAAW,WAGzB44D,EAAYr+C,SAAWq+C,EAAYr+C,UAAYxmB,KAAK4iE,SAASp8C,cAEb,IAApCq+C,EAA8B,qBACxCA,EAAYZ,mBAAqBjkE,KAAK4iE,SAASqB,oBAGrB,OAAxBY,EAAY9/D,SACd2/D,EAAWvnE,KAAK0nE,IAElBz/D,KAAKpF,WAEF,CAEL,IACIikE,EAGJ,GAJiBQ,EAAcnoE,OAId,EACf,OAAO,EAGTsoE,EAASH,EAAe,SAAUO,GAIhC,KAAIhzD,GAAUgzD,EAAej9C,aAAa,sBAAwB/V,IAK7B,SAAjCgzD,EAAe77D,MAAMK,QAAzB,CAIA,IAAIi8C,EAAOh9C,SAASu8D,EAAej9C,aAAa,aAAc,IAG5Dk8C,OADuE,IAA7De,EAAej9C,aAAa,8BACfi9C,EAAej9C,aAAa,4BAE9B/nB,KAAK4iE,SAASqB,mBAGjCxe,EAAO,IACTif,EAAWjf,EAAO,GAAK,CACrB1gD,QAASigE,EACTC,MAAOD,EAAej9C,aAAa,cACnC09B,KAAMh9C,SAASu8D,EAAej9C,aAAa,aAAc,IACzDq7C,aAAc4B,EAAej9C,aAAa,qBAC1Cs7C,eAAgB2B,EAAej9C,aAAa,uBAC5C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,gBACxE38C,SAAUw+C,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASp8C,SACxEy9C,mBAAoBA,MAGxB7+D,KAAKpF,OAIP,IAAIklE,EAAW,EAEfN,EAASH,EAAe,SAAUO,GAIhC,KAAIhzD,GAAUgzD,EAAej9C,aAAa,sBAAwB/V,IAIjB,OAA7CgzD,EAAej9C,aAAa,aAAuB,CAErD,UACsC,IAAzB28C,EAAWQ,IAGpBA,IAKFjB,OADuE,IAA7De,EAAej9C,aAAa,8BACfi9C,EAAej9C,aAAa,4BAE9B/nB,KAAK4iE,SAASqB,mBAGrCS,EAAWQ,GAAY,CACrBngE,QAASigE,EACTC,MAAOD,EAAej9C,aAAa,cACnC09B,KAAMyf,EAAW,EACjB9B,aAAc4B,EAAej9C,aAAa,qBAC1Cs7C,eAAgB2B,EAAej9C,aAAa,uBAC5C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,gBACxE38C,SAAUw+C,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASp8C,SACxEy9C,mBAAoBA,KAGxB7+D,KAAKpF,OAKT,IADA,IAAImlE,EAAiB,GACZC,EAAI,EAAGA,EAAIV,EAAWpoE,OAAQ8oE,IACjCV,EAAWU,IAEbD,EAAehoE,KAAKunE,EAAWU,IAyBnC,OArBAV,EAAaS,GAGF3gD,MAAK,SAAU7Q,EAAGlE,GAC3B,OAAOkE,EAAE8xC,KAAOh2C,EAAEg2C,QAIpBzlD,KAAK2iE,YAAc+B,EAGhBW,EAAiBlqE,KAAK6E,KAAMwkE,KAE7Bc,EAAUnqE,KAAK6E,MAEXA,KAAK4iE,SAASa,oBAChB8B,EAASC,GAAG5lE,OAAQ,UAAW6lE,EAAYzlE,MAAM,GAGnDulE,EAASC,GAAG5lE,OAAQ,SAAU8lE,EAAW1lE,MAAM,KAE1C,EAGT,SAAS0lE,IACP1lE,KAAK2lE,QAAQxqE,KAAK6E,MAqBpB,SAASylE,EAAY/mE,GACnB,IAAIytB,EAAmB,OAAXztB,EAAEytB,KAAiBztB,EAAEknE,MAAQlnE,EAAEytB,KAO3C,GAJa,OAATA,IACFA,EAAuB,OAAfztB,EAAEuC,SAAqBvC,EAAEsC,QAAUtC,EAAEuC,UAGjC,WAATkrB,GAA8B,KAATA,IAA4C,IAA5BnsB,KAAK4iE,SAASU,WAIjD,GAAa,cAATn3C,GAAiC,KAATA,EAEjC05C,EAAc1qE,KAAK6E,WACd,GAAa,eAATmsB,GAAkC,KAATA,EAElCm5C,EAAUnqE,KAAK6E,WACV,GAAa,UAATmsB,GAA6B,KAATA,EAAa,CAE1C,IAAI7H,EAAS5lB,EAAE4lB,QAAU5lB,EAAEonE,WACvBxhD,GAAUA,EAAOy3B,UAAU1kC,MAAM,sBAEnCwuD,EAAc1qE,KAAK6E,MACVskB,GAAUA,EAAOy3B,UAAU1kC,MAAM,uBAEtCrX,KAAK2iE,YAAYrmE,OAAS,IAAM0D,KAAK+lE,cAAyD,mBAAjC/lE,KAA2B,wBACxFA,KAAKgmE,uBAAuB7qE,KAAK6E,MAGrCimE,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,iBAClBp+C,GAAUA,EAAOyD,aAAa,mBAEvCzD,EAAO3H,QAGP2oD,EAAUnqE,KAAK6E,MAIdtB,EAAEwB,eACHxB,EAAEwB,iBAEFxB,EAAEwnE,aAAc,QAhClBD,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,gBA0C/B,SAASoC,EAAapuB,GAClB,GAAe,OAAXA,GAAuC,iBAAb,QAAsD,IAArBA,EAAe,SAC5E,OAAOA,EAET,IAAIqV,EAAO,GACX,IAAK,IAAI/1C,KAAO0gC,OACgB,IAAnB92C,OAAa,QAAqB82C,EAAO1gC,aAAgBpW,OAAOD,OACzEosD,EAAK/1C,GAAO0gC,EAAO1gC,GAEnB+1C,EAAK/1C,GAAO8uD,EAAapuB,EAAO1gC,IAGpC,OAAO+1C,EAQX,SAASoa,EAAU1gB,GAEjBzlD,KAAK+lE,aAAetgB,EAAO,OACO,IAAtBzlD,KAAgB,aAC1BslE,EAAUnqE,KAAK6E,MAUnB,SAASomE,EAAgB3gB,GACvBzlD,KAAKqmE,mBAAqB5gB,OACQ,IAAtBzlD,KAAgB,aAC1BslE,EAAUnqE,KAAK6E,MAUnB,SAASslE,IACPtlE,KAAKsmE,WAAa,eAEuB,IAA7BtmE,KAAuB,oBACjC4kE,EAAS5kE,KAAK2iE,YAAa,SAAUt1D,EAAMtR,GACrCsR,EAAKo4C,OAASzlD,KAAKqmE,qBACrBrmE,KAAK+lE,aAAehqE,EAAI,EACxBiE,KAAKqmE,wBAAqBhnE,IAE5B+F,KAAKpF,YAG0B,IAAvBA,KAAiB,aAC3BA,KAAK+lE,aAAe,IAElB/lE,KAAK+lE,aAGT,IAAIb,EAAWllE,KAAK2iE,YAAY3iE,KAAK+lE,cACjCQ,GAAe,EAOnB,YALiD,IAArCvmE,KAA+B,6BACzCumE,EAAevmE,KAAKwmE,2BAA2BrrE,KAAK6E,KAAMklE,EAASngE,WAIhD,IAAjBwhE,KACAvmE,KAAK+lE,cACA,GAGJ/lE,KAAK2iE,YAAkB,QAAK3iE,KAAK+lE,cAGS,mBAAjC/lE,KAA2B,wBACrCA,KAAKgmE,uBAAuB7qE,KAAK6E,WAEnCimE,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,sBAI7B+D,EAAatrE,KAAK6E,KAAMklE,GAS1B,SAASW,IAGP,GAFA7lE,KAAKsmE,WAAa,WAEQ,IAAtBtmE,KAAK+lE,aACP,OAAO,IAGP/lE,KAAK+lE,aAEP,IAAIb,EAAWllE,KAAK2iE,YAAY3iE,KAAK+lE,cACjCQ,GAAe,EAOnB,QALiD,IAArCvmE,KAA+B,6BACzCumE,EAAevmE,KAAKwmE,2BAA2BrrE,KAAK6E,KAAMklE,EAASngE,WAIhD,IAAjBwhE,EAEF,QADEvmE,KAAK+lE,cACA,EAGTU,EAAatrE,KAAK6E,KAAMklE,GAO1B,SAASwB,IAOP,GALAC,EAAwBxrE,KAAK6E,KAAMoC,SAASmwD,cAAc,yBAC1DoU,EAAwBxrE,KAAK6E,KAAMoC,SAASmwD,cAAc,mCAC1DoU,EAAwBxrE,KAAK6E,KAAMoC,SAASmwD,cAAc,qCAGjClzD,IAAtBW,KAAK+lE,cAAoD,OAAtB/lE,KAAK+lE,aAAuB,CAChE,IAAIa,EAAuBxkE,SAASmwD,cAAc,8BAChDsU,EAAuBzkE,SAASmwD,cAAc,kBAC9CuU,EAAuB1kE,SAASmwD,cAAc,oBAChDwU,EAAc5rE,KAAK6E,KAAMA,KAAK2iE,YAAY3iE,KAAK+lE,cAAchhE,QAAS+hE,EAAqBD,EAAeD,GAK5G,OADAI,EAAc7rE,KAAK6E,MACZA,KAWT,SAASimE,EAAWgB,EAAeC,GACjC,IAAIC,GAAe,EAWnB,QANsC9nE,IAAlCW,KAAKonE,2BACPD,EAAennE,KAAKonE,yBAAyBjsE,KAAK6E,OAK/CknE,IAA0B,IAAjBC,EAAd,CAGA,IAAIE,EAAgBJ,EAAcjQ,iBAAiB,oBAE/CqQ,GAAiBA,EAAc/qE,QACjCsoE,EAASyC,EAAe,SAAUC,GAChCA,EAAan+D,MAAMo+D,QAAU,EAC7B3nE,OAAOL,WAAW,WACZS,KAAK6F,YACP7F,KAAK6F,WAAW/E,YAAYd,OAE9BoF,KAAKkiE,GAAe,MACtBliE,KAAKpF,OAIT,IAAIwnE,EAAcP,EAAc1U,cAAc,wBAC1CiV,GACFA,EAAY3hE,WAAW/E,YAAY0mE,GAGrC,IAAIC,EAAiBR,EAAc1U,cAAc,kCAC7CkV,GACFA,EAAe5hE,WAAW/E,YAAY2mE,GAIxC,IAAIC,EAA0BT,EAAc1U,cAAc,+BACtDmV,GACFA,EAAwB7hE,WAAW/E,YAAY4mE,GAIjD,IAAIC,EAAkBvlE,SAASmwD,cAAc,2BACzCoV,GACFA,EAAgB9hE,WAAW/E,YAAY6mE,GAGzCC,IAIAhD,EADiBxiE,SAAS40D,iBAAiB,uBACtB,SAAU1mD,GAC7Bu3D,EAAav3D,EAAQ,yBAIvBi1D,EAASh9D,IAAI3I,OAAQ,UAAW6lE,EAAYzlE,MAAM,GAClDulE,EAASh9D,IAAI3I,OAAQ,SAAU8lE,EAAW1lE,MAAM,QAGhBX,IAA5BW,KAAK8nE,oBACP9nE,KAAK8nE,mBAAmB3sE,KAAK6E,MAI/BA,KAAK+lE,kBAAe1mE,GActB,SAAS0nE,EAAcE,EAAec,EAAcC,EAAYC,EAAmBC,GACjF,IACIC,EACAC,EACAC,EACAC,EACAC,EALAC,EAAkB,GAyBtB,GAlBAN,EAAWA,IAAY,EAGvBH,EAAa5+D,MAAMC,IAAa,KAChC2+D,EAAa5+D,MAAMukD,MAAa,KAChCqa,EAAa5+D,MAAMuxB,OAAa,KAChCqtC,EAAa5+D,MAAMgG,KAAa,KAChC44D,EAAa5+D,MAAM0qD,WAAa,KAChCkU,EAAa5+D,MAAMs/D,UAAa,KAEhCT,EAAW7+D,MAAMK,QAAU,UAEvB,MAAM,IACRy+D,EAAkB9+D,MAAMC,IAAO,KAC/B6+D,EAAkB9+D,MAAMgG,KAAO,MAI5BnP,KAAK2iE,YAAY3iE,KAAK+lE,cA2B3B,OAtBEyC,EAD2C,iBAD7CL,EAAiBnoE,KAAK2iE,YAAY3iE,KAAK+lE,eACA,aACnBoC,EAAe/E,aAEfpjE,KAAK4iE,SAASQ,aAGlC2E,EAAahsB,WAAa,mBAAqBysB,GAAiB/rE,QAAQ,aAAc,IACtFsrE,EAAan+D,aAAa,OAAQ,UAKH,cAH/B2+D,EAAyBvoE,KAAK2iE,YAAY3iE,KAAK+lE,cAAc95D,YAI3Ds8D,EAAyBG,EAAuBvtE,KAAK6E,KAAMinE,EAAec,EAAcQ,IAI1FF,EAAgBM,EAAW1B,GAC3BmB,EAAgBO,EAAWZ,GAC3BO,EAAgBM,IAEhBC,EAAUd,EAAc,WAAaQ,GAE7BA,GACN,IAAK,oBACHP,EAAWjsB,UAAiB,6BAE5B,IAAI+sB,EAAyB,EAC7BC,EAAWV,EAAcS,EAAwBV,EAAeL,GAChEA,EAAa5+D,MAAMuxB,OAAa2tC,EAAa3+D,OAAU,GAAM,KAC7D,MAEF,IAAK,qBACHs+D,EAAWjsB,UAAiB,8BAE5B,IAAIitB,EAA6BX,EAAaj5C,MAAQ,EAAIg5C,EAAch5C,MAAQ,EAG5E84C,IACFc,GAA8B,GAG5BD,EAAWV,EAAcW,EAA4BZ,EAAeL,KACtEA,EAAa5+D,MAAMukD,MAAQ,KAC3Bub,EAAYZ,EAAcW,EAA4BZ,EAAeE,EAAYP,IAEnFA,EAAa5+D,MAAMuxB,OAAU2tC,EAAa3+D,OAAS,GAAM,KACzD,MAEF,IAAK,mBAEL,IAAK,MACHs+D,EAAWjsB,UAAY,uBAIvBktB,EAAYZ,EAFY,EAAa,EAAI,GAEQD,EAAeE,EAAYP,GAC5EA,EAAa5+D,MAAMuxB,OAAU2tC,EAAa3+D,OAAU,GAAM,KAC1D,MACF,IAAK,QACHq+D,EAAa5+D,MAAMgG,KAAQk5D,EAAaj5C,MAAQ,GAAM,KAClDi5C,EAAaj/D,IAAMg/D,EAAc1+D,OAAS4+D,EAAW5+D,QAGvDs+D,EAAWjsB,UAAY,4BACvBgsB,EAAa5+D,MAAMC,IAAM,KAAOg/D,EAAc1+D,OAAS2+D,EAAa3+D,OAAS,IAAM,MAEnFs+D,EAAWjsB,UAAY,qBAEzB,MACF,IAAK,OACEmsB,IAA8C,IAAlCloE,KAAK4iE,SAASY,kBAC7BuE,EAAa5+D,MAAMC,IAAM,QAGvBi/D,EAAaj/D,IAAMg/D,EAAc1+D,OAAS4+D,EAAW5+D,QAGvDq+D,EAAa5+D,MAAMC,IAAM,KAAOg/D,EAAc1+D,OAAS2+D,EAAa3+D,OAAS,IAAM,KACnFs+D,EAAWjsB,UAAY,8BAEvBisB,EAAWjsB,UAAY,sBAEzBgsB,EAAa5+D,MAAMukD,MAAS2a,EAAaj5C,MAAQ,GAAM,KAEvD,MACF,IAAK,WACH44C,EAAW7+D,MAAMK,QAAU,OAG3Bu+D,EAAa5+D,MAAMgG,KAAS,MAC5B44D,EAAa5+D,MAAMC,IAAS,MAC5B2+D,EAAa5+D,MAAM0qD,WAAa,IAAOuU,EAAch5C,MAAQ,EAAM,KACnE24C,EAAa5+D,MAAMs/D,UAAa,IAAOL,EAAc1+D,OAAS,EAAK,KAE/D,MAAM,IACRu+D,EAAkB9+D,MAAMgG,KAAO,KAAQi5D,EAAch5C,MAAQ,EAAK,IAAM,KACxE64C,EAAkB9+D,MAAMC,IAAO,KAAQg/D,EAAc1+D,OAAS,EAAK,IAAM,MAG3E,MACF,IAAK,uBACHs+D,EAAWjsB,UAAiB,0BAG5BgtB,EAAWV,EADXS,EAAyB,EACwBV,EAAeL,GAChEA,EAAa5+D,MAAMC,IAAUi/D,EAAa3+D,OAAU,GAAM,KAC1D,MAEF,IAAK,wBACHs+D,EAAWjsB,UAAiB,2BAE5BitB,EAA6BX,EAAaj5C,MAAQ,EAAIg5C,EAAch5C,MAAQ,EAGxE84C,IACFc,GAA8B,GAG5BD,EAAWV,EAAcW,EAA4BZ,EAAeL,KACtEA,EAAa5+D,MAAMukD,MAAQ,KAC3Bub,EAAYZ,EAAcW,EAA4BZ,EAAeE,EAAYP,IAEnFA,EAAa5+D,MAAMC,IAAOi/D,EAAa3+D,OAAS,GAAM,KACtD,MAMF,QACEs+D,EAAWjsB,UAAY,oBAGvBktB,EAAYZ,EADY,EACyBD,EAAeE,EAAYP,GAC5EA,EAAa5+D,MAAMC,IAAUi/D,EAAa3+D,OAAU,GAAM,MAShE,SAASu/D,EAAYZ,EAAca,EAAuBd,EAAeE,EAAYP,GACnF,OAAIM,EAAal5D,KAAO+5D,EAAwBd,EAAch5C,MAAQk5C,EAAWl5C,OAE/E24C,EAAa5+D,MAAMgG,KAAQm5D,EAAWl5C,MAAQg5C,EAAch5C,MAAQi5C,EAAal5D,KAAQ,MAClF,IAET44D,EAAa5+D,MAAMgG,KAAO+5D,EAAwB,MAC3C,GAQT,SAASH,EAAWV,EAAcS,EAAwBV,EAAeL,GACvE,OAAIM,EAAal5D,KAAOk5D,EAAaj5C,MAAQ05C,EAAyBV,EAAch5C,MAAQ,GAE1F24C,EAAa5+D,MAAMgG,MAASk5D,EAAal5D,KAAQ,MAC1C,IAET44D,EAAa5+D,MAAMukD,MAAQob,EAAyB,MAC7C,GAYT,SAASJ,EAAuBzB,EAAec,EAAcoB,GAG3D,IAAIC,EAAoBppE,KAAK4iE,SAASoB,mBAAmBlpE,QAErDwtE,EAAaM,IACbS,EAAgBV,EAAWZ,GAAcr+D,OAAS,GAClD4/D,EAAeX,EAAWZ,GAAc34C,MAAQ,GAChDm6C,EAAoBtC,EAAc/3D,wBAIlCs6D,EAAqB,WAOrBD,EAAkB7uC,OAAS2uC,EAAgBA,EAAgBf,EAAW5+D,QACxE+/D,EAAaL,EAAmB,UAI9BG,EAAkBngE,IAAMigE,EAAgB,GAC1CI,EAAaL,EAAmB,OAI9BG,EAAkB7b,MAAQ4b,EAAehB,EAAWl5C,OACtDq6C,EAAaL,EAAmB,SAI9BG,EAAkBp6D,KAAOm6D,EAAe,GAC1CG,EAAaL,EAAmB,QAIlC,IAAkC7iE,EAC5BmjE,EADFC,GAEmB,KADjBD,GAD4BnjE,EAO/B4iE,GAA0B,IANLtrE,QAAQ,MAGrB0I,EAAIlF,OAAOqoE,GAEb,GA0BT,OAtBIP,IAGFA,EAAyBA,EAAuBhtE,MAAM,KAAK,IAGzDitE,EAAkB9sE,SAIlBktE,EAH6B,SAA3BL,GACAC,EAAkBvrE,QAAQsrE,IAA2B,EAElCA,EAGAC,EAAkB,KAKY,IAAnD,CAAC,MAAO,UAAUvrE,QAAQ2rE,KAC5BA,GAcJ,SAAkC/b,EAAY6b,EAAchB,EAAYqB,GACtE,IAAIC,EAAmBN,EAAe,EACpCO,EAAW92C,KAAKsF,IAAIiwC,EAAWl5C,MAAOxvB,OAAOiJ,OAAOumB,OACpD06C,EAAqB,CAAC,gBAAiB,kBAAmB,kBAC1DC,EAAsB,GAIpBF,EAAWpc,EAAa6b,GAC1BG,EAAaK,EAAoB,kBAK/Brc,EAAamc,GACfC,EAAWpc,EAAamc,IACxBH,EAAaK,EAAoB,mBAK/Brc,EAAa6b,GACfG,EAAaK,EAAoB,kBAM/BC,EAHAD,EAAmBxtE,QACiC,IAAlDwtE,EAAmBjsE,QAAQ8rE,GAEPA,EAGAG,EAAmB,GAMrB,kBAGxB,OAAOC,EAtDiBC,CAAwBT,EAAkBp6D,KAAMm6D,EAAchB,EAAYqB,IAG3FH,EA4DT,SAASC,EAAaQ,EAAaC,GAC7BD,EAAYpsE,QAAQqsE,IAAmB,GACzCD,EAAYrtE,OAAOqtE,EAAYpsE,QAAQqsE,GAAiB,GAW5D,SAASvD,EAAwBa,GAC/B,GAAIA,EAAa,CAEf,IAAKxnE,KAAK2iE,YAAY3iE,KAAK+lE,cAAe,OAE1C,IAAIf,EAAkBhlE,KAAK2iE,YAAY3iE,KAAK+lE,cACxCoE,EAAkBxB,EAAW3D,EAAejgE,SAC5CqlE,EAAqBpqE,KAAK4iE,SAASsB,qBAKnCmG,EAASrF,EAAejgE,SAC1B8jE,EAAUrB,EAAa,wBAEvBK,EAAaL,EAAa,wBAGI,aAA5BxC,EAAe/4D,WACjBm+D,EAAqB,GAIvB5C,EAAYr+D,MAAMmhE,QAAU,WAAaH,EAAgB/6C,MAASg7C,GAAtC,eACmBD,EAAgBzgE,OAAS0gE,GAD5C,YAEmBD,EAAgB/gE,IAASghE,EAAqB,GAFjE,aAGmBD,EAAgBh7D,KAASi7D,EAAqB,GAAO,OAWxG,SAASG,IACP,IAAI7C,EAA0BtlE,SAASmwD,cAAc,+BAErB,OAA5BmV,KACFA,EAA0BtlE,SAASC,cAAc,QACzB05C,UAAY,6BACpC/7C,KAAK0iE,eAAevgE,YAAYulE,IAGlCf,EAAwBxrE,KAAK6E,KAAM0nE,GASrC,SAAS8C,EAAmBrd,GAC1BA,EAAOvjD,aAAa,OAAQ,UAC5BujD,EAAOsd,SAAW,EAUpB,SAAShE,EAAaQ,QACuB,IAA/BjnE,KAAyB,sBACnCA,KAAK0qE,qBAAqBvvE,KAAK6E,KAAMinE,EAAcliE,SAGrD,IAII4lE,EACAC,EACAC,EACAC,EAPA/+C,EAAO/rB,KACP+qE,EAAiB3oE,SAASmwD,cAAc,wBACxCyY,EAAoB5oE,SAASmwD,cAAc,kCAC3C8Q,EAAiB,sBAerB,GAR8C,iBAAlC4D,EAA4B,iBACtC5D,GAAmB,IAAM4D,EAAc5D,gBAGK,iBAAlCrjE,KAAK4iE,SAAuB,iBACtCS,GAAmB,IAAMrjE,KAAK4iE,SAASS,gBAGlB,OAAnB0H,EAAyB,CAC3B,IAAInE,EAAuBoE,EAAkBzY,cAAc,8BACvD0Y,EAAuBD,EAAkBzY,cAAc,wBACvDsU,EAAuBmE,EAAkBzY,cAAc,kBACvDuU,EAAuBkE,EAAkBzY,cAAc,oBAY3D,GAVAsY,EAAuBG,EAAkBzY,cAAc,uBACvDqY,EAAuBI,EAAkBzY,cAAc,uBACvDoY,EAAuBK,EAAkBzY,cAAc,uBAGvDwY,EAAehvB,UAAYsnB,EAE3ByD,EAAoB39D,MAAMo+D,QAAU,EACpCT,EAAoB39D,MAAMK,QAAU,OAEP,OAAzBo9D,EAA+B,CACjC,IAAIsE,EAAgBlrE,KAAK2iE,YAAasE,EAAcxhB,KAAO,GAAK,EAAIwhB,EAAcxhB,KAAO,EAAI,IAEvE,OAAlBylB,GAA+C,YAApBlrE,KAAKsmE,YAAuD,aAA3B4E,EAAcj/D,UAAiD,aAApBjM,KAAKsmE,YAAwD,aAA3BW,EAAch7D,YACzJ26D,EAAqBz9D,MAAMo+D,QAAU,IAKzCuD,EAAeK,EAAkBlE,EAAcliE,YAE1B3C,SAASsuD,MAE5B0a,EAAuBN,EAAc7D,EAAcliE,SAIrD4hE,EAAwBxrE,KAAK4wB,EAAMg/C,GACnCpE,EAAwBxrE,KAAK4wB,EAAMi/C,GAInCpG,EADiBxiE,SAAS40D,iBAAiB,uBACtB,SAAU1mD,GAC7Bu3D,EAAav3D,EAAQ,yBAIvBs3D,IAGI77C,EAAKs/C,uBACPzrE,OAAO85C,aAAa3tB,EAAKs/C,uBAG3Bt/C,EAAKs/C,sBAAwBzrE,OAAOL,YAAW,WAEhB,OAAzBqnE,IACFA,EAAqBr/D,UAAY0/D,EAAcxhB,MAGjDwlB,EAAgB1jE,UAAY0/D,EAAchC,MAE1C6B,EAAoB39D,MAAMK,QAAU,QACpCu9D,EAAc5rE,KAAK4wB,EAAMk7C,EAAcliE,QAAS+hE,EAAqBD,EAAeD,GAGhF76C,EAAK62C,SAASe,cACdqH,EAAkBzY,cAAc,kCAAkCxW,UAAY,GAC9EivB,EAAkBzY,cAAc,4CAA8C0U,EAAcxhB,KAAO,MAAM1J,UAAY,UAEzHivB,EAAkBzY,cAAc,0CAA0CppD,MAAMmhE,QAAU,SAAWgB,EAAanwE,KAAK4wB,GAAQ,KAC/Hi/C,EAAkBzY,cAAc,0CAA0C3oD,aAAa,gBAAiB0hE,EAAanwE,KAAK4wB,IAG1H+6C,EAAoB39D,MAAMo+D,QAAU,EAChCX,IAAsBA,EAAqBz9D,MAAMo+D,QAAU,GAG3D,MAAOsD,GAAmE,uBAAuBruE,KAAKquE,EAAkB9uB,WAE1H8uB,EAAkBngE,QACT,MAAOigE,GAEhBA,EAAkBjgE,QAIpB6gE,EAAUpwE,KAAK4wB,EAAMk7C,EAAczgD,SAAUygD,EAAegE,KAC3D,SAGE,CACL,IAAIzD,EAAoBplE,SAASC,cAAc,OAC3ColE,EAAoBrlE,SAASC,cAAc,OAC3C2lE,EAAoB5lE,SAASC,cAAc,OAC3C0lE,EAAoB3lE,SAASC,cAAc,OAC3CmpE,EAAoBppE,SAASC,cAAc,OAC3CopE,EAAoBrpE,SAASC,cAAc,OAC3CqpE,EAAoBtpE,SAASC,cAAc,OAC3CspE,EAAoBvpE,SAASC,cAAc,OAE/CmlE,EAAYzrB,UAAYsnB,EACxBoE,EAAe1rB,UAAY,iCAG3B+uB,EAAeK,EAAkBlE,EAAcliE,YAE1B3C,SAASsuD,MAE5B0a,EAAuBN,EAAc7D,EAAcliE,SAIrD4hE,EAAwBxrE,KAAK4wB,EAAMy7C,GACnCb,EAAwBxrE,KAAK4wB,EAAM07C,GAGnCznE,KAAK0iE,eAAevgE,YAAYqlE,GAChCxnE,KAAK0iE,eAAevgE,YAAYslE,GAEhCO,EAAWjsB,UAAY,gBAEvByvB,EAAiBzvB,UAAY,sBAC7ByvB,EAAiBjkE,UAAY0/D,EAAchC,MAE3CwG,EAAa1vB,UAAY,mBAES,IAA9B/7C,KAAK4iE,SAASe,cAChB8H,EAAatiE,MAAMK,QAAU,QAG/B,IAAIoiE,EAAcxpE,SAASC,cAAc,MACzCupE,EAAYhiE,aAAa,OAAQ,WAEjC,IAAIiiE,EAAc,WACd9/C,EAAK+/C,SAAS9rE,KAAK+nB,aAAa,qBAGpC68C,EAAS5kE,KAAK2iE,aAAa,SAAUt1D,EAAMtR,GACzC,IAAIgwE,EAAa3pE,SAASC,cAAc,MACpC2pE,EAAa5pE,SAASC,cAAc,KAExC0pE,EAAQniE,aAAa,OAAQ,gBAC7BoiE,EAAWpiE,aAAa,OAAQ,OAEhCoiE,EAAW7mE,QAAU0mE,EAEjB9vE,IAAOkrE,EAAcxhB,KAAK,IAC5BumB,EAAWjwB,UAAY,UAGzByuB,EAAmBwB,GACnBA,EAAWzkE,UAAY,SACvBykE,EAAWpiE,aAAa,kBAAmByD,EAAKo4C,MAEhDsmB,EAAQ5pE,YAAY6pE,GACpBJ,EAAYzpE,YAAY4pE,MAG1BN,EAAatpE,YAAYypE,GAEzBF,EAAc3vB,UAAY,oBAES,IAA/B/7C,KAAK4iE,SAASgB,eAChB8H,EAAcviE,MAAMK,QAAU,QAEhC,IAAIyiE,EAAc7pE,SAASC,cAAc,OACzC4pE,EAAYlwB,UAAY,sBACxBkwB,EAAYriE,aAAa,OAAQ,YACjCqiE,EAAYriE,aAAa,gBAAiB,GAC1CqiE,EAAYriE,aAAa,gBAAiB,KAC1CqiE,EAAYriE,aAAa,gBAAiB0hE,EAAanwE,KAAK6E,OAC5DisE,EAAY9iE,MAAMmhE,QAAU,SAAWgB,EAAanwE,KAAK6E,MAAQ,KAEjE0rE,EAAcvpE,YAAY8pE,GAE1BN,EAAa5vB,UAAY,0BACS,IAA9B/7C,KAAK4iE,SAASc,cAChBiI,EAAaxiE,MAAMK,QAAU,QAG/Bu+D,EAAahsB,UAAY,kBACzBgsB,EAAa5lE,YAAYqpE,GACzBzD,EAAa5lE,YAAYspE,GACzB1D,EAAa5lE,YAAYupE,GAGzB,IAAIzD,EAAoB7lE,SAASC,cAAc,SACT,IAAlCrC,KAAK4iE,SAASY,kBAChByE,EAAkBlsB,UAAY,4BAC9BksB,EAAkB1gE,UAAY0/D,EAAcxhB,KAC5CgiB,EAAetlE,YAAY8lE,IAG7BF,EAAa5lE,YAAY6lE,GACzBP,EAAetlE,YAAY4lE,IAG3B4C,EAAoBvoE,SAASC,cAAc,MAEzB8C,QAAU,WACtB4mB,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cACvCT,EAAUnqE,KAAK4wB,IAInBy+C,EAAmBG,GACnBA,EAAkBpjE,UAAYvH,KAAK4iE,SAASC,WAG5C+H,EAAoBxoE,SAASC,cAAc,MAEzB8C,QAAU,WACA,IAAtB4mB,EAAKg6C,cACPF,EAAc1qE,KAAK4wB,IAIvBy+C,EAAmBI,GACnBA,EAAkBrjE,UAAYvH,KAAK4iE,SAASE,WAG5C+H,EAAoBzoE,SAASC,cAAc,MACzB05C,UAAY/7C,KAAK4iE,SAAS0B,YAAc,uBAC1DkG,EAAmBK,GACnBA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,UAE5C8H,EAAkB1lE,QAAU,WACtB4mB,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cAAyD,mBAAjCh6C,EAA2B,wBAC1FA,EAAKi6C,uBAAuB7qE,KAAK4wB,GAG/BA,EAAK42C,YAAYrmE,OAAS,IAAMyvB,EAAKg6C,cAAqD,mBAA7Bh6C,EAAuB,oBACtFA,EAAK+7C,mBAAmB3sE,KAAK4wB,GAGS,mBAA7BA,EAAuB,oBAChCA,EAAKmgD,mBAAmB/wE,KAAK4wB,GAG/Bk6C,EAAW9qE,KAAK4wB,EAAMA,EAAK22C,iBAG7BiJ,EAAaxpE,YAAY0oE,GAGrB7qE,KAAK2iE,YAAYrmE,OAAS,IAC5BqvE,EAAaxpE,YAAYyoE,GACzBe,EAAaxpE,YAAYwoE,IAG3B5C,EAAa5lE,YAAYwpE,GAGzB5E,EAAc5rE,KAAK4wB,EAAMk7C,EAAcliE,QAASgjE,EAAcC,EAAYC,GAG1EsD,EAAUpwE,KAAK6E,KAAMinE,EAAczgD,SAAUygD,EAAec,GAM9D,IAAIL,EAA0B37C,EAAK22C,eAAenQ,cAAc,+BAC5DmV,GACFA,EAAwB7hE,WAAW/E,YAAY4mE,GAI7CT,EAAchD,oBAChBsG,EAAoBpvE,KAAK4wB,GAID,IAAtB/rB,KAAK+lE,cAAsB/lE,KAAK2iE,YAAYrmE,OAAS,GACnD,MAAOuuE,IACTA,EAAkB9uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOqG,IACTA,EAAkB5uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,wBAG7B,IAA3BtkE,KAAK4iE,SAASK,UACZ,MAAO2H,IACTA,EAAkB7uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,sCAExD,MAAOqG,GACT9B,EAAU8B,EAAmB,uBAG3B,MAAOC,IACTA,EAAkB7uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,wCAI1D,MAAOuG,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,YAErC/iE,KAAK2iE,YAAYrmE,OAAS,IAAM0D,KAAK+lE,cAA4C,IAA5B/lE,KAAK2iE,YAAYrmE,QAE3E,MAAOuuE,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASI,UAE5C6F,EAAUgC,EAAmB,uBAE3B,MAAOD,IACTA,EAAkB7uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,wBAG7B,IAA3BtkE,KAAK4iE,SAASM,UACZ,MAAOyH,IACTA,EAAkB5uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,sCAExD,MAAOsG,GACT/B,EAAU+B,EAAmB,uBAG3B,MAAOD,IACTA,EAAkB5uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,0CAK1D,MAAOuG,IACTA,EAAkB9uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOsG,IACTA,EAAkB7uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOqG,IACTA,EAAkB5uB,UAAY/7C,KAAK4iE,SAAS0B,YAAc,uBAExD,MAAOuG,IACTA,EAAkBtjE,UAAYvH,KAAK4iE,SAASG,YAIhD6H,EAAkBhhE,aAAa,OAAQ,UACvC+gE,EAAkB/gE,aAAa,OAAQ,UACvCihE,EAAkBjhE,aAAa,OAAQ,UAGnC,MAAO+gE,GACTA,EAAkBjgE,QAuEtB,SAAyBu8D,GACvB,IAAIkF,EAGJ,GAAIlF,EAAcliE,mBAAmBqnE,WAGnC,IAFAD,EAAYlF,EAAcliE,QAAQc,WAEU,OAArCohE,EAAcliE,QAAQc,YACtBsmE,EAAU3mD,SAA+C,SAApC2mD,EAAU3mD,QAAQjkB,eAEJ,QAApC4qE,EAAU3mD,QAAQjkB,eACpBsnE,EAAUsD,EAAW,gDAGvBA,EAAYA,EAAUtmE,WAI1BgjE,EAAU5B,EAAcliE,QAAS,uBAEjC,IAAIsnE,EAAyBC,EAAcrF,EAAcliE,QAAS,YACnC,aAA3BsnE,GAC2B,aAA3BA,GAC2B,UAA3BA,GAEFxD,EAAU5B,EAAcliE,QAAS,4BAGnConE,EAAYlF,EAAcliE,QAAQc,WAClC,KAAqB,OAAdsmE,GACAA,EAAU3mD,SAA+C,SAApC2mD,EAAU3mD,QAAQjkB,eADnB,CAKzB,IAAIgrE,EAASD,EAAcH,EAAW,WAClC5E,EAAUlgB,WAAWilB,EAAcH,EAAW,YAC9Cp/B,EAAYu/B,EAAcH,EAAW,cAAgBG,EAAcH,EAAW,sBAAwBG,EAAcH,EAAW,mBAAqBG,EAAcH,EAAW,kBAAoBG,EAAcH,EAAW,iBAC1N,SAAS3vE,KAAK+vE,IAAWhF,EAAU,GAAoB,SAAdx6B,QAAsC1tC,IAAd0tC,IACnE87B,EAAUsD,EAAW,qBAGvBA,EAAYA,EAAUtmE,YA7GxB2mE,CAAgBvF,QAEgC,IAApCjnE,KAA8B,2BACxCA,KAAKysE,0BAA0BtxE,KAAK6E,KAAMinE,EAAcliE,SAa5D,SAASwmE,EAAU/kD,EAAUygD,EAAec,GAE1C,IAAIv8B,EADJ,GAAiB,QAAbhlB,IAGCxmB,KAAK4iE,SAASiB,kBAGjBr4B,EADe,YAAbhlB,EACKuhD,EAAa74D,wBAEb+3D,EAAcliE,QAAQmK,yBAoVjC,SAA4BvF,GAC1B,IAAI6hC,EAAO7hC,EAAGuF,wBAEd,OACEs8B,EAAKpiC,KAAO,GACZoiC,EAAKr8B,MAAQ,GACZq8B,EAAK9Q,OAAO,IAAO96B,OAAO8sE,aAC3BlhC,EAAKkiB,OAAS9tD,OAAO+sE,WAxVlBC,CAAmB3F,EAAcliE,WAAU,CAC9C,IAAI8nE,EAAYjE,IAAcl/D,OACpB8hC,EAAK9Q,QAAU8Q,EAAK9Q,OAAS8Q,EAAKpiC,KAMlC,GAAK69D,EAAcliE,QAAQmF,aAAe2iE,EAClDjtE,OAAOktE,SAAS,EAAGthC,EAAKpiC,KAAQyjE,EAAY,EAAOrhC,EAAK9hC,OAAS,GAAM1J,KAAK4iE,SAASkB,eAIrFlkE,OAAOktE,SAAS,EAAGthC,EAAKpiC,KAAQyjE,EAAY,EAAOrhC,EAAK9hC,OAAS,GAAM1J,KAAK4iE,SAASkB,gBAW3F,SAAS8D,IAGPhD,EAFWxiE,SAAS40D,iBAAiB,yBAEtB,SAAU+V,GACvBlF,EAAakF,EAAK,yBAiEtB,SAASnI,EAAS1+C,EAAK8mD,EAAYC,GAEjC,GAAI/mD,EACF,IAAK,IAAInqB,EAAI,EAAGyK,EAAM0f,EAAI5pB,OAAQP,EAAIyK,EAAKzK,IACzCixE,EAAW9mD,EAAInqB,GAAIA,GAIK,mBAAlB,GACRkxE,IAYJ,IACMlzD,EADFmzD,GACEnzD,EAAO,GACJ,SAAgB9e,EAAK+a,GAc1B,OARA+D,EAHA/D,EAAMA,GAAO,iBAGD+D,EAAK/D,IAAQ,OAGR3W,IAAbpE,EAAI+a,KAEN/a,EAAI+a,GAAO+D,EAAK/D,MAGX/a,EAAI+a,KAYXuvD,EAuEK,IAtEP,WACE,IAAI4H,EAAa,gBAWjBntE,KAAKotE,IAAM,SAAUnyE,EAAKmI,EAAMiqE,EAAUn0B,GACxC,OAAO91C,EAAO8pE,EAAOG,IAAan0B,EAAU,IAAMg0B,EAAOh0B,GAAW,KAatEl5C,KAAKwlE,GAAK,SAAUvqE,EAAKmI,EAAMiqE,EAAUn0B,EAASo0B,GAChD,IAAI1uE,EAAKoB,KAAKotE,IAAIhwE,MAAM4C,KAAM9C,WAC1BqwE,EAAU,SAAU7uE,GAClB,OAAO2uE,EAASlyE,KAAK+9C,GAAWj+C,EAAKyD,GAAKkB,OAAOwlB,QAGnD,qBAAsBnqB,EACxBA,EAAI6O,iBAAiB1G,EAAMmqE,EAASD,GAC3B,gBAAiBryE,GAC1BA,EAAIm9D,YAAY,KAAOh1D,EAAMmqE,GAG/BtyE,EAAIkyE,GAAclyE,EAAIkyE,IAAe,GACrClyE,EAAIkyE,GAAYvuE,GAAM2uE,GAaxBvtE,KAAKuI,IAAM,SAAUtN,EAAKmI,EAAMiqE,EAAUn0B,EAASo0B,GACjD,IAAI1uE,EAAKoB,KAAKotE,IAAIhwE,MAAM4C,KAAM9C,WAC1BqwE,EAAUtyE,EAAIkyE,IAAelyE,EAAIkyE,GAAYvuE,GAE5C2uE,IAID,wBAAyBtyE,EAC3BA,EAAIsP,oBAAoBnH,EAAMmqE,EAASD,GAC9B,gBAAiBryE,GAC1BA,EAAIshE,YAAY,KAAOn5D,EAAMmqE,GAG/BtyE,EAAIkyE,GAAYvuE,GAAM,QAgB5B,SAASiqE,EAAU9jE,EAASg3C,GAC1B,GAAIh3C,aAAmBqnE,WAAY,CAEjC,IAAIoB,EAAMzoE,EAAQgjB,aAAa,UAAY,GAE3ChjB,EAAQ6E,aAAa,QAAS4jE,EAAM,IAAMzxB,OACrC,CACL,QAA0B18C,IAAtB0F,EAAQlD,UAGV+iE,EADc7oB,EAAU5/C,MAAM,MACZ,SAAUoV,GAC1BxM,EAAQlD,UAAUE,IAAKwP,WAEfxM,EAAQg3C,UAAU1kC,MAAO0kC,KAEnCh3C,EAAQg3C,WAAa,IAAMA,IAcjC,SAAS8rB,EAAa9iE,EAAS0oE,GAC7B,GAAI1oE,aAAmBqnE,WAAY,CACjC,IAAIoB,EAAMzoE,EAAQgjB,aAAa,UAAY,GAE3ChjB,EAAQ6E,aAAa,QAAS4jE,EAAI/wE,QAAQgxE,EAAgB,IAAIhxE,QAAQ,aAAc,UAEpFsI,EAAQg3C,UAAYh3C,EAAQg3C,UAAUt/C,QAAQgxE,EAAgB,IAAIhxE,QAAQ,aAAc,IAc5F,SAAS6vE,EAAevnE,EAAS2oE,GAC/B,IAAIC,EAAY,GAQhB,OAPI5oE,EAAQ6oE,aACVD,EAAY5oE,EAAQ6oE,aAAaF,GACxBtrE,SAASyrE,aAAezrE,SAASyrE,YAAY9jB,mBACtD4jB,EAAYvrE,SAASyrE,YAAY9jB,iBAAiBhlD,EAAS,MAAM4uD,iBAAiB+Z,IAIhFC,GAAaA,EAAUpsE,YAClBosE,EAAUpsE,cAEVosE,EAYX,SAAStD,EAAUtlE,GACjB,IAAIvG,EAAIuG,EAAQc,WAEhB,SAAKrH,GAAoB,SAAfA,EAAEg5D,YAI+B,UAAvC8U,EAAcvnE,EAAS,aAIpBslE,EAAS7rE,IAWlB,SAASoqE,IACP,QAA0BvpE,IAAtBO,OAAO+sE,WACT,MAAO,CAAEv9C,MAAOxvB,OAAO+sE,WAAYjjE,OAAQ9J,OAAO8sE,aAElD,IAAIoB,EAAI1rE,SAAS2rE,gBACjB,MAAO,CAAE3+C,MAAO0+C,EAAEE,YAAatkE,OAAQokE,EAAE5jE,cA8B7C,SAASm7D,EAAiBb,GACxB,IAAI8C,EAAellE,SAASC,cAAc,OACtC4rE,EAAY,GACZliD,EAAO/rB,KAMX,GAHAsnE,EAAavrB,UAAY,kBAGpByoB,EAAUh/C,SAA+C,SAApCg/C,EAAUh/C,QAAQjkB,cAGrC,CAEL,IAAI4oE,EAAkBxB,EAAWnE,GAC7B2F,IACF8D,GAAa,UAAY9D,EAAgB/6C,MAAQ,cAAgB+6C,EAAgBzgE,OAAS,WAAaygE,EAAgB/gE,IAAM,YAAc+gE,EAAgBh7D,KAAO,MAClKm4D,EAAan+D,MAAMmhE,QAAU2D,QAP/BA,GAAa,sDACb3G,EAAan+D,MAAMmhE,QAAU2D,EAuB/B,OAbAzJ,EAAUriE,YAAYmlE,GAEtBA,EAAaniE,QAAU,YACoB,IAArC4mB,EAAK62C,SAASW,oBAChB0C,EAAW9qE,KAAK4wB,EAAMy4C,IAI1B5kE,OAAOL,YAAW,WAChB0uE,GAAa,YAAcliD,EAAK62C,SAASmB,eAAe3iE,WAAa,IACrEkmE,EAAan+D,MAAMmhE,QAAU2D,IAC5B,KAEI,EAST,SAASC,IACP,IAAIC,EAAU/rE,SAASmwD,cAAc,0BAErC,GAAI4b,EAAS,CACX,IAAI1oB,EAAO0oB,EAAQpmD,aAAa,aAEhC,OADAomD,EAAQtoE,WAAW/E,YAAYqtE,GACxB1oB,GAWX,SAAS2oB,EAAe5J,GAItB,GAFAxkE,KAAK2iE,YAAc,GAEf3iE,KAAK4iE,SAASyL,MAChBzJ,EAAS5kE,KAAK4iE,SAASyL,MAAO,SAAUla,GACtC,IAAI0Q,EAAcC,EAAa3Q,GAEK,iBAAzB0Q,EAAmB,UAE5BA,EAAY9/D,QAAU3C,SAASmwD,cAAcsS,EAAY9/D,UAG3D8/D,EAAYV,aAAeU,EAAYV,cAAgBnkE,KAAK4iE,SAASuB,aACrEU,EAAYR,cAAgBQ,EAAYR,eAAiBrkE,KAAK4iE,SAASyB,cAE3C,OAAxBQ,EAAY9/D,SACd/E,KAAK2iE,YAAYxlE,KAAK0nE,IAExBz/D,KAAKpF,WACF,CACL,IAAIquE,EAAQ7J,EAAUxN,iBAAiB,gBAEvC,IAAKqX,IAAUA,EAAM/xE,OACnB,OAAO,EAITsoE,EAASyJ,EAAO,SAAUrJ,GAExB,IAAIX,EAAgBW,EAAej9C,aAAa,sBAG9Cs8C,EADEA,EACiC,SAAlBA,EAEDrkE,KAAK4iE,SAASyB,cAGhCrkE,KAAK2iE,YAAYxlE,KAAK,CACpB4H,QAASigE,EACT7Q,KAAM6Q,EAAej9C,aAAa,aAClCo8C,aAAca,EAAej9C,aAAa,sBAAwB/nB,KAAK4iE,SAASuB,aAChFE,cAAeA,EACfjB,aAAc4B,EAAej9C,aAAa,qBAC1C9b,SAAU+4D,EAAej9C,aAAa,kBAAoB/nB,KAAK4iE,SAASO,mBAE1E/9D,KAAKpF,OAGTsuE,EAAUnzE,KAAK6E,MAMfulE,EAASC,GAAGpjE,SAAU,QAAS8rE,EAAoBluE,MAAM,GACzDulE,EAASC,GAAG5lE,OAAQ,SAAUonE,EAAehnE,MAAM,GASrD,SAASgnE,IACPpC,EAAS5kE,KAAK2iE,YAAa,SAAUt1D,QACA,IAAxBA,EAAkB,eAI7BkhE,EAAmBpzE,KAAK6E,KAAMqN,EAAK82D,aAAc92D,EAAKtI,QAASsI,EAAK45D,gBACpE7hE,KAAKpF,OAST,SAASwuE,EAAsBC,GAC7B,IAAIC,EAAetsE,SAASmwD,cAAc,kBAC1C,OAAO,EAAiBmc,EAAa1X,iBAAiByX,GAAY,GASpE,SAASE,EAAUC,GACjB,IAAIza,EAAOqa,EAAsB,4BAA8BI,EAAS,MAAM,GAE9EV,EAAmB/yE,KAAK6E,MAEpBm0D,GACF0U,EAAU1U,EAAM,yBAIuB,IAA7Bn0D,KAAuB,oBACjCA,KAAK6uE,mBAAmB1zE,KAAK6E,KAAM4uE,GAUvC,SAASE,IAGPlK,EAFY4J,EAAsB,iBAElB,SAAUra,GACxBwa,EAAUxzE,KAAK6E,KAAMm0D,EAAKpsC,aAAa,eACvC3iB,KAAKpF,OAST,SAAS+uE,IACP,IAAIV,EAAQG,EAAsB,iBAE9BH,GAASA,EAAM/xE,OACjBsoE,EAASyJ,EAAO,SAAUla,GACxB6a,EAAU7zE,KAAK6E,KAAMm0D,EAAKpsC,aAAa,eACvC3iB,KAAKpF,OAEPouE,EAAejzE,KAAK6E,KAAMA,KAAK0iE,gBAUnC,SAASsM,EAAUJ,GACjB,IAAIza,EAAOqa,EAAsB,4BAA8BI,EAAS,MAAM,GAE1Eza,GACF0T,EAAa1T,EAAM,qBAWvB,SAAS8a,IAGPrK,EAFY4J,EAAsB,iBAElB,SAAUra,GACxB+a,EAAY/zE,KAAK6E,KAAMm0D,EAAKpsC,aAAa,eACzC3iB,KAAKpF,OAWT,SAASkvE,EAAYN,GACnB,IAAIza,EAAOqa,EAAsB,4BAA8BI,EAAS,MAAM,GAE1Eza,GACFA,EAAKtuD,WAAW/E,YAAYqzD,GAUhC,SAASma,IACP,IAAIviD,EAAO/rB,KAEP0uE,EAAetsE,SAASmwD,cAAc,kBAErB,OAAjBmc,KACFA,EAAetsE,SAASC,cAAc,QACzB05C,UAAY,iBAyB3B6oB,EAAS5kE,KAAK2iE,YAAa,SAASt1D,EAAMtR,GAExC,IAAIqG,SAASmwD,cAAc,4BAA8Bx2D,EAAI,MAA7D,CAIA,IAAIo4D,EAAO/xD,SAASC,cAAc,KAClCmoE,EAAmBrW,GAEnBA,EAAKhvD,QAzBY,SAAUpJ,GAC3B,OAAO,SAAS2C,GACd,IAAIywE,EAAMzwE,GAAQkB,OAAOwlB,MAErB+pD,EAAIlvE,iBACNkvE,EAAIlvE,kBAGmB,OAArBkvE,EAAIC,eACND,EAAIC,cAAe,GAGrBC,EAAgBl0E,KAAK4wB,EAAMhwB,IAaduzE,CAAavzE,GAE5Bo4D,EAAKpY,UAAY,eAEZ1uC,EAAKg3D,eACRwE,EAAU1U,EAAM,wBAIdkW,EAASh9D,EAAKtI,UAChB8jE,EAAU1U,EAAM,qBAGlB,IAAIob,EAAUntE,SAASC,cAAc,OACrCktE,EAAQxzB,UAAY,mBACpB,IAAIyzB,EAAYptE,SAASC,cAAc,OACvCmtE,EAAUzzB,UAAY,qBAEtBoY,EAAKhyD,YAAYotE,GACjBpb,EAAKhyD,YAAYqtE,GACjBrb,EAAKvqD,aAAa,YAAa7N,GAI/BsR,EAAK45D,cAAgB55D,EAAKtI,QAC1BsI,EAAKtI,QAAUovD,EAGfoa,EAAmBpzE,KAAK6E,KAAMqN,EAAK82D,aAAchQ,EAAM9mD,EAAK45D,eAE5DyH,EAAavsE,YAAYgyD,KACzB/uD,KAAKpF,OAGPoC,SAASsuD,KAAKvuD,YAAYusE,QAGgB,IAA9B1uE,KAAwB,qBAClCA,KAAKyvE,oBAAoBt0E,KAAK6E,MAalC,SAASuuE,EAAmBtiE,EAAUkoD,EAAMpvD,GAE1C,IAAIyD,EAASmgE,EAAWxtE,KAAK6E,KAAM+E,GAKnC,OAAQkH,GACN,QACA,IAAK,WACHkoD,EAAKhrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCglD,EAAKhrD,MAAMC,IAAMZ,EAAOY,IAAM,KAC9B,MACF,IAAK,YACH+qD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MAX5B,GAWiD,KAC7D+kC,EAAKhrD,MAAMC,IAAMZ,EAAOY,IAAM,KAC9B,MACF,IAAK,cACH+qD,EAAKhrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCglD,EAAKhrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAfzB,GAegD,KAC7D,MACF,IAAK,eACHyqD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MAnB5B,GAmBiD,KAC7D+kC,EAAKhrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAnBzB,GAmBgD,KAC7D,MACF,IAAK,cACHyqD,EAAKhrD,MAAMgG,KAAO3G,EAAO2G,KAAO,KAChCglD,EAAKhrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OAvB1B,IAuBiD,EAAK,KACnE,MACF,IAAK,eACHyqD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,KAAO3G,EAAO4mB,MA3B5B,GA2BiD,KAC7D+kC,EAAKhrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OA3B1B,IA2BiD,EAAK,KACnE,MACF,IAAK,gBACHyqD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MA/B7B,IA+BkD,EAAK,KACnE+kC,EAAKhrD,MAAMC,IAAOZ,EAAOY,KAAOZ,EAAOkB,OA/B1B,IA+BiD,EAAK,KACnE,MACF,IAAK,gBACHyqD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MAnC7B,IAmCkD,EAAK,KACnE+kC,EAAKhrD,MAAMC,IAAOZ,EAAOY,IAAMZ,EAAOkB,OAnCzB,GAmCgD,KAC7D,MACF,IAAK,aACHyqD,EAAKhrD,MAAMgG,KAAQ3G,EAAO2G,MAAQ3G,EAAO4mB,MAvC7B,IAuCkD,EAAK,KACnE+kC,EAAKhrD,MAAMC,IAAMZ,EAAOY,IAAM,MAYpC,SAASimE,EAAgBT,GACvB,IAAIc,EAActtE,SAASmwD,cAAc,4BAA8Bqc,EAAS,MAC5EvhE,EAAOrN,KAAK2iE,YAAYiM,QAGa,IAA7B5uE,KAAuB,oBACjCA,KAAK2vE,mBAAmBx0E,KAAK6E,KAAM0vE,EAAariE,EAAMuhE,GAIxD,IAAIgB,EAAc1B,EAAmB/yE,KAAK6E,MAG1C,GAAIyI,SAASmnE,EAAa,MAAQhB,EAAlC,CAIA,IAAI7G,EAAe3lE,SAASC,cAAc,OACtCmpE,EAAmBppE,SAASC,cAAc,OAC1C2lE,EAAa5lE,SAASC,cAAc,OACpColE,EAAiBrlE,SAASC,cAAc,OAE5C0lE,EAAahsB,UAAY,kBAEzBgsB,EAAa5iE,QAAU,SAAUzG,GAE3BA,EAAEuB,gBACJvB,EAAEuB,kBAIFvB,EAAE0wE,cAAe,GAIrB5D,EAAiBzvB,UAAY,sBAE7B,IAAI8zB,EAAiBztE,SAASC,cAAc,KAC5CwtE,EAAetoE,UAAY8F,EAAK8mD,KAEhC,IAAI2b,EAAc1tE,SAASC,cAAc,KACzCytE,EAAY/zB,UAAY/7C,KAAK4iE,SAAS0B,YACtCwL,EAAYlmE,aAAa,OAAQ,UACjCkmE,EAAYvoE,UAAYvH,KAAK4iE,SAASwB,gBACtC0L,EAAY3qE,QAAUwpE,EAAUvpE,KAAKpF,KAAM4uE,GAE3CpD,EAAiBrpE,YAAY0tE,GAC7BrE,EAAiBrpE,YAAY2tE,GAE7B9H,EAAWjsB,UAAY,gBACvBgsB,EAAa5lE,YAAY6lE,GAEzBD,EAAa5lE,YAAYqpE,GAGzBxrE,KAAK+lE,aAAe2J,EAAY3nD,aAAa,aAG7C0/C,EAAe1rB,UAAY,sDAC3B0rB,EAAe79D,aAAa,YAAa8lE,EAAY3nD,aAAa,cAClE4+C,EAAwBxrE,KAAK6E,KAAMynE,GAEnCA,EAAetlE,YAAY4lE,GAC3B3lE,SAASsuD,KAAKvuD,YAAYslE,GAG1BV,EAAc5rE,KAAK6E,KAAM0vE,EAAa3H,EAAcC,EAAY,MAAM,IAYxE,SAASW,EAAW5jE,GAClB,IAAI2rD,EAAOtuD,SAASsuD,KAChBqf,EAAQ3tE,SAAS2rE,gBACjB5R,EAAYv8D,OAAOowE,aAAeD,EAAM5T,WAAazL,EAAKyL,UAC1DlS,EAAarqD,OAAOqwE,aAAeF,EAAM9lB,YAAcyG,EAAKzG,WAC5D75B,EAAIrrB,EAAQmK,wBAChB,MAAO,CACL9F,IAAKgnB,EAAEhnB,IAAM+yD,EACb/sC,MAAOgB,EAAEhB,MACT1lB,OAAQ0mB,EAAE1mB,OACVyF,KAAMihB,EAAEjhB,KAAO86C,GAWnB,SAASkhB,EAAiBpmE,GACxB,IAAIoE,EAAQvJ,OAAOmqD,iBAAiBhlD,GAChCmrE,EAA0C,aAAnB/mE,EAAM8C,SAC7BkkE,EAAgB,gBAEpB,GAAuB,UAAnBhnE,EAAM8C,SAAsB,OAAO7J,SAASsuD,KAEhD,IAAK,IAAIpgD,EAASvL,EAAUuL,EAASA,EAAO8/D,eAE1C,GADAjnE,EAAQvJ,OAAOmqD,iBAAiBz5C,KAC5B4/D,GAA0C,WAAnB/mE,EAAM8C,WAG7BkkE,EAAc3zE,KAAK2M,EAAMknE,SAAWlnE,EAAMmnE,UAAYnnE,EAAMonE,WAAY,OAAOjgE,EAGrF,OAAOlO,SAASsuD,KAUlB,SAAS0a,EAAwB96D,EAAQvL,GACvCuL,EAAO6rD,UAAYp3D,EAAQyrE,UAAYlgE,EAAOkgE,UAUhD,SAASlF,IAGP,OADkB7iE,SAAUzI,KAAK+lE,aAAe,EAAI,IAC7B/lE,KAAK2iE,YAAYrmE,OAAU,IAmBpD,IAAIimE,EAAU,SAAUiC,GACtB,IAAIiM,EAEJ,GAA2B,iBAAhB,EAETA,EAAW,IAAIhO,EAAQ+B,QAElB,GAA2B,iBAAhB,EAA0B,CAE1C,IAAIyC,EAAgB7kE,SAASmwD,cAAciS,GAE3C,IAAIyC,EAGF,MAAM,IAAIxpE,MAAM,4CAFhBgzE,EAAW,IAAIhO,EAAQwE,QAKzBwJ,EAAW,IAAIhO,EAAQrgE,SAASsuD,MAOlC,OAFA6R,EAAQmO,UAAWxD,EAAOuD,EAAU,qBAAwBA,EAErDA,GAiMT,OAxLAlO,EAAQ51C,QAvwEM,QA+wEd41C,EAAQmO,UAAY,GAGpBnO,EAAQ12B,GAAK42B,EAAQ9nE,UAAY,CAC/Bq5C,MAAO,WACL,OAAO,IAAIyuB,EAAQziE,OAErB2wE,UAAW,SAASC,EAAQrzE,GAE1B,OADAyC,KAAK4iE,SAASgO,GAAUrzE,EACjByC,MAET6wE,WAAY,SAAStqD,GAEnB,OADAvmB,KAAK4iE,SA7DT,SAAuBkO,EAAKC,GAC1B,IACEC,EADEC,EAAO,GAEX,IAAKD,KAAYF,EAAQG,EAAKD,GAAYF,EAAKE,GAC/C,IAAKA,KAAYD,EAAQE,EAAKD,GAAYD,EAAKC,GAC/C,OAAOC,EAwDWC,CAAclxE,KAAK4iE,SAAUr8C,GACtCvmB,MAETsqB,MAAO,SAAUtY,GAEf,OADAuyD,EAAiBppE,KAAK6E,KAAMA,KAAK0iE,eAAgB1wD,GAC1ChS,MAET8rE,SAAU,SAASrmB,GAEjB,OADA0gB,EAAUhrE,KAAK6E,KAAMylD,GACdzlD,MAETmxE,QAAS,SAAS5qD,GAOhB,OANKvmB,KAAK4iE,SAAS+B,QACjB3kE,KAAK4iE,SAAS+B,MAAQ,IAGxB3kE,KAAK4iE,SAAS+B,MAAMxnE,KAAKopB,GAElBvmB,MAEToxE,SAAU,SAASzM,GACjB,GAAKA,EAAMroE,OAAX,CAEA,IAAI,IAAIsB,EAAQ,EAAGA,EAAQ+mE,EAAMroE,OAAQsB,IACvCoC,KAAKmxE,QAAQxM,EAAM/mE,IAGrB,OAAOoC,OAETqxE,eAAgB,SAAS5rB,GAGvB,OAFA2gB,EAAgBjrE,KAAK6E,KAAMylD,GAEpBzlD,MAETklE,SAAU,WAER,OADAI,EAAUnqE,KAAK6E,MACRA,MAETsxE,aAAc,WAEZ,OADAzL,EAAc1qE,KAAK6E,MACZA,MAETuxE,KAAM,SAASrK,GAEb,OADAjB,EAAW9qE,KAAK6E,KAAMA,KAAK0iE,eAAgBwE,GACpClnE,MAET2lE,QAAS,WAEP,OADAe,EAASvrE,KAAK6E,MACPA,MAETwxE,eAAgB,SAASC,GACvB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,2DAElB,OAJEuC,KAAKwmE,2BAA6BiL,EAI7BzxE,MAET0xE,SAAU,SAASD,GACjB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,sDAElB,OAJEuC,KAAK0qE,qBAAuB+G,EAIvBzxE,MAET2xE,cAAe,SAASF,GACtB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKysE,0BAA4BgF,EAI5BzxE,MAET4xE,WAAY,SAASH,GACnB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,wDAElB,OAJEuC,KAAKgmE,uBAAyByL,EAIzBzxE,MAET6xE,aAAc,SAASJ,GACrB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKyvE,oBAAsBgC,EAItBzxE,MAET8xE,YAAa,SAASL,GACpB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,yDAElB,OAJEuC,KAAK2vE,mBAAqB8B,EAIrBzxE,MAET+xE,YAAa,SAASN,GACpB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,yDAElB,OAJEuC,KAAK6uE,mBAAqB4C,EAIrBzxE,MAETgyE,OAAQ,SAASP,GACf,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,oDAElB,OAJEuC,KAAK8nE,mBAAqB2J,EAIrBzxE,MAETiyE,OAAQ,SAASR,GACf,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,oDAElB,OAJEuC,KAAKksE,mBAAqBuF,EAIrBzxE,MAETkyE,aAAc,SAAST,GACrB,GAAkC,mBAAvB,EAGT,MAAM,IAAIh0E,MAAM,0DAElB,OAJEuC,KAAKonE,yBAA2BqK,EAI3BzxE,MAETmyE,SAAU,WAER,OADA/D,EAAejzE,KAAK6E,KAAMA,KAAK0iE,gBACxB1iE,MAEToyE,SAAU,SAAUxD,GAElB,OADAD,EAAUxzE,KAAK6E,KAAM4uE,GACd5uE,MAETqyE,UAAW,WAET,OADAvD,EAAW3zE,KAAK6E,MACTA,MAETsyE,SAAU,SAAU1D,GAElB,OADAI,EAAU7zE,KAAK6E,KAAM4uE,GACd5uE,MAETuyE,UAAW,WAET,OADAxD,EAAW5zE,KAAK6E,MACTA,MAETwyE,YAAa,WAEX,OADAvD,EAAa9zE,KAAK6E,MACXA,MAETyyE,WAAY,SAAU7D,GAEpB,OADAM,EAAY/zE,KAAK6E,KAAM4uE,GAChB5uE,MAET0yE,eAAgB,SAAU9D,GAExB,OADAS,EAAgBl0E,KAAK6E,KAAM4uE,GACpB5uE,OAIJuiE,KAUTxoE,EAAO,aAAa,CAAC,YAAa,KAAM,OAAQ,OAAQ,SAAU,gBAC3D,SAAS44E,EAAYtxD,EAASuxD,EAAWrkE,EAAWwJ,EAAUW,GAGnE,MAAM/V,EAAQ9C,MAAM6C,OAGpBC,EAAIuf,WAAavf,EAAIuf,YAAc,QACnCvf,EAAIwf,WAAaxf,EAAIwf,YAAc,OACnCxf,EAAIyf,WAAazf,EAAIyf,YAAc,OACnCzf,EAAI0f,WAAa1f,EAAI0f,YAAc,OACnC1f,EAAI2f,iBAAmB3f,EAAI2f,kBAAoB,SAG/C3f,EAAI4f,UAAY5f,EAAI4f,WAAa,+LAGjC5f,EAAI6f,WAAa7f,EAAI6f,YAAc,0DAA6D7f,EAAI2e,cAAgB,KACpH3e,EAAI8f,eAAiB9f,EAAI8f,gBAAkB,oBAC3C9f,EAAI+f,cAAiB/f,EAAI+f,eAAiB,iGAC1C/f,EAAIggB,YAAchgB,EAAIggB,aAAe,gBACrChgB,EAAIigB,YAAcjgB,EAAIigB,aAAe,2BACrCjgB,EAAIkgB,aAAelgB,EAAIkgB,cAAgB,0CACvClgB,EAAImgB,aAAengB,EAAImgB,cAAgB,mBACvCngB,EAAIogB,aAAepgB,EAAIogB,cAAe,qFACtCpgB,EAAIsgB,UAAYtgB,EAAIsgB,WAAa,oCACjCtgB,EAAIqgB,aAAergB,EAAIqgB,cAAgB,8DACvCrgB,EAAIugB,YAAcvgB,EAAIugB,aAAe,mBAGrCvgB,EAAIwgB,UAAYxgB,EAAIwgB,WAAa,mCACjCxgB,EAAIygB,aAAezgB,EAAIygB,cAAiB,6CACxCzgB,EAAI0gB,cAAgB1gB,EAAI0gB,eAAiB,UACzC1gB,EAAI2gB,eAAkB3gB,EAAI2gB,gBAAkB,sBAC5C3gB,EAAI4gB,cAAgB5gB,EAAI4gB,eAAiB,WACzC5gB,EAAI6gB,YAAc7gB,EAAI6gB,aAAe,+BACrC7gB,EAAI8gB,WAAa9gB,EAAI8gB,YAAc,uCACnC9gB,EAAI+gB,WAAa/gB,EAAI+gB,YAAc,8BACnC/gB,EAAIghB,UAAYhhB,EAAIghB,WAAa,+DACjChhB,EAAIihB,cAAgBjhB,EAAIihB,eAAiB,uBAGzC,IAAIivD,EAAW,CACX9P,UAAapgE,EAAIuf,WACjB4gD,UAAangE,EAAIwf,WACjB0gD,UAAalgE,EAAIyf,WACjB4gD,UAAargE,EAAI0f,WACjBmhD,iBAAmB,GAInBsP,EAAe,CACfnP,aAAe,EACfI,eAAkB,GAClBR,oBAAsB,EACtBU,oBAAsB,EACtBf,UAAY,EACZD,UAAY,GAGhB,IAAI8P,EAAM3wE,SAEV,MAAM,CAKJ4wE,cAAc,SAASC,GACrB,IAAIhO,EAAQ0N,IACZ1N,EAAM4L,WAAWgC,GACjB5N,EAAM0L,UAAU,eAAgB,iBAMhC1L,EAAM0L,UAAU,YAAahuE,EAAI2f,kBACjC2iD,EAAM4L,WAAWiC,GAGdG,IACDF,EAAME,GAGIF,EAAIxgB,cAAc,YACxBh1D,MAAM,GAIZ,IAAI21E,EAAO,CACT,CACEjO,MAAOtiE,EAAI4f,WAEb,CACExd,QAAS,WACTkgE,MAAOtiE,EAAI6f,WACXvW,SAAU,UAEZ,CACElH,QAAS,QACTkgE,MAAOtiE,EAAI8f,eACXxW,SAAU,UAEZ,CACElH,QAASguE,EAAIxgB,cAAc,sBAC3B0S,MAAOtiE,EAAI+f,cACXzW,SAAU,UAEZ,CACElH,QAAQ,aACRkgE,MAAOtiE,EAAIggB,YACX1W,SAAU,UAEZ,CACElH,QAAQ,WACRkgE,MAAOtiE,EAAIigB,YACX3W,SAAU,UAEZ,CACElH,QAASguE,EAAIxgB,cAAc,cAC3B0S,MAAOtiE,EAAIkgB,aACX5W,SAAU,QAEZ,CACElH,QAASguE,EAAIxgB,cAAc,cAC3B0S,MAAOtiE,EAAImgB,aACX7W,SAAU,UAEZ,CACElH,QAASguE,EAAIxgB,cAAc,aAAa1sD,WACxCo/D,MAAOtiE,EAAIogB,aACX9W,SAAU,UAEZ,CACElH,QAAQ,WACRkgE,MAAOtiE,EAAIqgB,aACX/W,SAAU,UAEZ,CACElH,QAAQ,iBACRkgE,MAAOtiE,EAAIsgB,UACXhX,SAAU,UAEZ,CACElH,QAAS,WACTkgE,MAAOtiE,EAAIugB,YACXjX,SAAU,WA8Ed,OAzEAg5D,EAAM4L,WAAW,CAAClM,MAAOuO,IACzBlzE,KAAKmzE,YAAYD,EAAOjO,GAGxBA,EAAMuM,gBAAe,SAAS4B,GAC5B,OAAOA,EAAgBx0E,IACvB,IAAK,UAMDw0E,EAAgB71E,MAAQoF,EAAI2e,cAC9B,MACF,IAAK,UACH,IAAI+xD,EAAQN,EAAIxgB,cAAc,cAC1B+gB,EAAMP,EAAIxgB,cAAc,YAC5B1yD,MAAMkR,QAAQ3T,MAAMyC,MAAMqV,GAAGhD,QAE7BrS,MAAMqV,GAAGtC,SAASjQ,EAAI4e,cACjB+xD,EAAI/gB,cAAc,aACrB8gB,EAAM12D,QAINsoD,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,cACjD0S,EAAMtC,YAAY,GAAG12D,SAAW,QAMpC,GAAwB,GAArBjM,KAAK+lE,aAAkB,CACVgN,EAAIxgB,cAAc,cACxB51C,QACRsoD,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,cACjD0S,EAAMtC,YAAY,GAAG12D,SAAW,aAIpCg5D,EAAMiN,cAAa,WACZryE,MAAM0zE,KAAK1uE,UAAYhF,MAAM0zE,KAAK1uE,SAAS+G,UAC5C/L,MAAM0zE,KAAK9d,YAIjBwP,EAAMyM,UAAS,SAASzK,GAEtB,OAAOjnE,KAAK+lE,cAEZ,KAAK,EACAlmE,MAAM0zE,KAAK1uE,UACdhF,MAAM0zE,KAAK9d,SAEX,MACF,KAAK,EACH51D,MAAM0zE,KAAKhmE,MAAK,GAChB1N,MAAM0zE,KAAK1uE,SAAS+G,UAAW,EAC/Bq5D,EAAMtC,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,mBACjD0S,EAAMtC,YAAY,GAAG12D,SAAW8mE,EAAIxgB,cAAc,UAClD,MACF,KAAK,EACH1yD,MAAM0zE,KAAK9d,aAMfwP,EAAM2M,YAAW,WACf/xE,MAAMm2D,QAAQn7C,IAAI,QAAQ,GAC1Bk4D,EAAI7tD,eAAe,WAAWvI,WAGzBsoD,GAKTuO,cAAe,SAASP,GAEtB,IAAIQ,EAAQd,IACZc,EAAM5C,WAAWiC,GAGdG,IACDF,EAAME,GAER,IAAIS,EAAU,CAEZ,CACE3uE,QAAS,UACTkgE,MAAOtiE,EAAIwgB,UACXlX,SAAU,QAGZ,CACElH,QAASguE,EAAIxgB,cAAc,qBAC3B0S,MAAOtiE,EAAIygB,aACXnX,SAAU,UAGZ,CACElH,QAASguE,EAAIxgB,cAAc,qBAC3B0S,MAAOtiE,EAAI0gB,cACXpX,SAAU,UAGZ,CACElH,QAASguE,EAAIxgB,cAAc,wBAC3B0S,MAAOtiE,EAAI2gB,eACXrX,SAAU,UAGZ,CACElH,QAASguE,EAAIxgB,cAAc,mBAC3B0S,MAAOtiE,EAAI4gB,cACXtX,SAAU,QAGZ,CACElH,QAASguE,EAAIxgB,cAAc,mBAC3B0S,MAAOtiE,EAAI6gB,YACXvX,SAAU,UAGZ,CACElH,QAASguE,EAAIxgB,cAAc,oBAC3B0S,MAAOtiE,EAAI8gB,WACXxX,SAAU,QAGZ,CACElH,QAASguE,EAAIxgB,cAAc,SAC3B0S,MAAOtiE,EAAI+gB,WACXzX,SAAU,UAGZ,CACElH,QAASguE,EAAIxgB,cAAc,mBAC3B0S,MAAOtiE,EAAIghB,UACX1X,SAAU,UAGZ,CACEg5D,MAAOtiE,EAAIihB,gBAuDf,OAnDE6vD,EAAM5C,WAAW,CAAClM,MAAM+O,IACxBD,EAAM5C,WAAWgC,GAEjBY,EAAMvB,cAAa,WACjBryE,MAAMm2D,QAAQn7C,IAAI,QAAQ,MAG5B44D,EAAM9C,UAAU,mBAAmB,GACnC8C,EAAM9C,UAAU,WAAW,WAC3B3wE,KAAKmzE,YAAYO,EAASD,GAG1BA,EAAMjC,gBAAe,SAAS4B,GA0B9B,GAxBwB,GAArBpzE,KAAK+lE,cACNlmE,MAAMm2D,QAAQn7C,IAAI,QAAQ,GAGJ,GAArB7a,KAAK+lE,eACNgN,EAAIxgB,cAAc,qBAAqB51C,QACvC82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,wBACjDkhB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGV,GAArBjM,KAAK+lE,eACNgN,EAAIxgB,cAAc,cAAc51C,QAChC82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,mBACjDkhB,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,mBACjDkhB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGV,GAArBjM,KAAK+lE,eACJgN,EAAIxgB,cAAc,SAAS51C,QAC3B82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,oBACjDkhB,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,SACjDkhB,EAAM9Q,YAAY,GAAG12D,SAAW,UAGZ,GAArBjM,KAAK+lE,aAAkB,CACxBgN,EAAIxgB,cAAc,SAAS51C,QAC3B,IAAIypC,EAAWhkD,SAAS40D,iBAAiB,sBAAsB,GAAGA,iBAAiB,MACnF,IAAI,IAAIj7D,EAAI,EAAIA,EAAIqqD,EAAQ9pD,OAAQP,IAClC,GAAIqqD,EAAQrqD,GAAG0oB,WAAa9hB,EAAI6e,eAAgB,CAC9C4kC,EAAQrqD,GAAG4gB,QACX,MAGJ82D,EAAM9Q,YAAY,GAAG59D,QAAUguE,EAAIxgB,cAAc,uBAI9CkhB,GAKTN,YAAa,SAASxO,EAAOgP,GAE3B,IAAIC,EAASjP,EACTkP,EAAQF,EACZE,EAAMC,UAAYF,EAAOt3E,OAGzBu3E,EAAME,WAAa,GAEnB,IAAI,IAAIh4E,EAAI,EAAGA,EAAG63E,EAAOt3E,OAAQP,IACjC83E,EAAME,WAAW52E,KAAKy2E,EAAO73E,GAAGkpE,YAStClrE,EAAO,iBAAiB,IAAG,WAIzB,IAAIi6E,EAAU,CACZC,QAAY,EACZC,aAAiB,EACjBC,MAAS,EACTC,oCAAsC,EACtCC,UAAc,GAGhB,MAAO,CACLnwE,OAAS,SAAUqL,GACjB,OAAO7U,OAAOwJ,OAAOlE,MAAMoE,MAAMmL,IAInCnL,MAAQ,SAAUmL,GAChB,KAAKA,GAASA,EAAW,MAAMA,EAAU,KAAMA,EAAS,IACtD,MAAM9R,MAAM,4BAEduC,KAAK3E,KAAOkU,EAAW,KACvBvP,KAAKsD,IAAMiM,EAAU,IACrBvP,KAAKpB,GAAK2Q,EAAS,GACnBvP,KAAKq0D,KAAO9kD,EAAW,KACvB,IAAI+kE,EAAQ,IAAIC,IACZC,EAAOjlE,EAAkB,YAqB7B,OApBIilE,GAAQ9oE,MAAM+gC,QAAQ+nC,IACxBA,EAAK/tE,SAAQ,SAAUjI,GACjBA,KAAKw1E,EACPM,EAAMvyE,IAAIvD,GAGVqB,MAAMsD,IAAI,EAAG,uCAKnBnD,KAAKs0E,MAAQA,EAGRt0E,KAAK+d,QACR/d,KAAK+d,MAAQ,WACX/d,KAAKy0E,iBAIFz0E,MAMTZ,KAAO,WACL,GAAIY,KAAK00E,MACP,OAAO10E,KAAK00E,MAEd,GAAgC,UAA5B90E,OAAOy3D,SAASsd,UAC4B,GAA5C30E,KAAKsD,IAAI/B,cAAc1D,QAAQ,UAEjC,YADAgC,MAAMsD,IAAI,EAAG,gCAKf,IAAIzE,EAAI0D,SAASC,cAAc,UAU/B,OATA3D,EAAEkL,aAAa,oBAAoB,QACnClL,EAAEkL,aAAa,cAAe,GAE9BlL,EAAEkL,aAAa,UAAW8B,MAAMma,KAAK7lB,KAAKs0E,OAAO9vD,OAAOpoB,KAAI,SAASL,GAAI,MAAO,SAASA,KAAKc,KAAK,MACnG6B,EAAEyK,MAAMO,OAAS,MACjBhL,EAAEkL,aAAa,OAAQ5J,KAAKpB,IAC5BF,EAAEkL,aAAa,MAAO5J,KAAKsD,KAE3BtD,KAAK00E,MAAQh2E,EACNA,GAMTk2E,QAAU,SAAUx6D,GACLpa,KAAKZ,OACXy1E,cAAcC,YACnB16D,EACA,MASJq6D,aAAe,WACb,IAAI/1E,EAAIsB,KAAK00E,MACTh2E,GAAKA,EAAEmH,YACTnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAK00E,MAAQ,UAgBnB36E,EAAO,gBAAgB,CAAC,OAAO,iBAAiB,SAAS,SAAUmkB,EAAW62D,GAE5E,MAAO,CAKL7wE,OAAS,SAAUqL,GACjB,OAAO7U,OAAOwJ,OAAOga,GAAW9Z,MAAM,CAAC,WAAWC,UAAU0wE,GAAc3wE,MAAMmL,GAAMlL,UAAUrE,MAAMoE,SAIxGA,MAAQ,WAEN,OADApE,KAAKg1E,UAAW,EACTh1E,MAMTuN,KAAO,WAEL,GAAIvN,KAAK00E,MAGP,OAFI10E,KAAKiF,KACPjF,KAAKiF,IAAIpD,UAAUE,IAAI,QAClB/B,KAAK00E,MAGd,IAAIz5E,EAAM+E,KAAKZ,OAoBf,OAnBAY,KAAK00E,MAAM7yE,UAAUE,IAAI,SAAU,QACnC9G,EAAI2O,aAAa,UAAW,QAO5B5J,KAAKqd,QAAQtb,IACX/B,KAAK3E,KAAM,CAACkW,IAAM,CAAC,cAAe,WAAY,SAAU7S,GAGtD,IAAIwU,EAAMlT,KAAK3E,UACGgE,IAAdW,KAAKq0D,OACPnhD,GAAO,OAASlT,KAAKq0D,MAEvBz0D,OAAOs1D,MAAMhiD,IACf9N,KAAKpF,OAEA/E,GAITg6E,OAAS,SAAU1lE,GACjBvP,KAAKuN,OAAOpE,MAAMO,OAAS6F,EAAK7F,OAAS,MAK3CuU,QAAU,WACJje,KAAKk1E,OACPl1E,KAAKk1E,KAAKC,cAAcn1E,KAAKpB,IAC7BoB,KAAKk1E,UAAO71E,QAsBpBtF,EAAO,QAAQ,IAAG,WAChB,MAAO,CAKLmK,OAAS,SAAU3G,GACjB,OAAO7C,OAAOwJ,OAAOlE,MAAMoE,MAAM7G,IAKnC6G,MAAQ,SAAU+iC,GAChB,MAAMrgC,EAAI9G,KAYV,OAXA8G,EAAEsuE,OAAS,GACG/1E,MAAV8nC,EACFrgC,EAAEqgC,OAAS,EAAC,GAAM,GAEXz7B,MAAM+gC,QAAQtF,GACrBrgC,EAAEqgC,OAASA,EAGXrgC,EAAEqgC,OAAS,CAACA,GAEdrgC,EAAEvJ,MAAQuJ,EAAEqgC,OAAO,GACZrgC,GAOTmJ,UAAY,SAAUhV,GAGhBA,EAAIL,eAAe,aACrBoF,KAAKo1E,OAAOj4E,KAAKlC,GACjBA,EAAI+U,SAAShQ,KAAKzC,QAElBgG,QAAQJ,IAAI,UAAYlI,EAAM,8BASlC4f,IAAM,SAAUtd,GACVA,GAASyC,KAAKzC,QAChByC,KAAKzC,MAAQA,EACbyC,KAAKo1E,OAAO3uE,QAAQ1K,GAAKA,EAAEiU,SAASzS,MAQxCo4D,IAAM,WACJ,OAAO31D,KAAKzC,OAOd83E,WAAa,WACX,OAAOr1E,KAAKo1E,OAAO94E,QAOrBoL,MAAQ,WACN,OAAO1H,KAAKo1E,OAAS,IAQvBllE,KAAO,WACL,IAAIvD,EAAO,EACX,IAAK,IAAI5Q,EAAI,EAAGA,EAAIiE,KAAKmnC,OAAO7qC,OAAS,EAAGP,IAC1C,GAAIiE,KAAKzC,OAASyC,KAAKmnC,OAAOprC,GAAI,CAChC4Q,EAAO5Q,EAAE,EACT,MAGJiE,KAAK6a,IAAI7a,KAAKmnC,OAAOx6B,SAgB3B5S,EAAO,gBAAgB,CAAC,gBAAiB,iBAAkB,QAAS,SAAS,SAAUu7E,EAAaP,EAAcQ,GAEhH11E,MAAM21E,MAAQ31E,MAAM21E,OAAS,GAI7B,IAAIC,EAAW,GACXC,EAAW,GAQX7b,EAAU,CACZxiD,MAAQ,IAKNs+D,EAAgB,CAClBC,MAAQ,GACRz5C,OAAS,IAUP05C,EAAS,GAQb,MAAO,CAKL3xE,OAAS,WACP,OAAOxJ,OAAOwJ,OAAOlE,MAAMoE,SAM7BA,MAAQ,WACN,OAAOpE,MAqCT81E,SAAW,SAAU76E,GAInB,IAAII,EAAOJ,EAAU,KAErB,IAAKI,EACH,MAAM,IAAIoC,MAAM,0BAElB,IAAI42D,EAAOp5D,EAAU,KAGjBiD,EAASw3E,EAAQr6E,GAAQ,CAC3BA,KAAOA,EACPg5D,KAAOA,EACP0hB,MAAQ96E,EAAW,MACnB+6E,QAAU,GACVP,SAAW,IAGb,GAA4B,iBAAjBx6E,EAAW,MACpB,MAAM,IAAIwC,MAAM,kCAGlB,IAAIiS,EAAO1P,KACX/E,EAAW,MAAEwL,SAAQ,SAASwvE,GAE5B,GAAqB,iBAAVA,EACT,MAAM,IAAIx4E,MAAM,oCAGlB,IAAI6R,EAAQ2mE,EAAa,MACrBznE,EAAQynE,EAAa,MACrBC,EAAUD,EAAe,QACzBE,EAAOF,EAAY,KAEvB,IAAKznE,IAAWqrD,EAAQrrD,KAAUmnE,EAAcnnE,GAC9C,MAAM,IAAI/Q,MAAM,+BAGlB,GAAKy4E,EAAgB,QACI,aAArBA,EAAgB,QACK,aAArBA,EAAgB,QAkFf,GAAyB,UAArBA,EAAgB,OAAe,CAOtC,IAAIpmE,EAAQylE,EAAWrxE,OAAO,EAAC,GAAM,IAIrCrE,MAAM21E,MAAMhnE,GAAO6O,QAAQxN,UAAUP,EAAO,CAACiC,IAAM,CAAC,UAAWzB,GAG/D,IAAIlR,EAAKoB,KAAKo2E,WAAW,CACvB/6E,KAASA,EAGTiI,IAAQ4yE,EAAkB,SAC1BG,YAAgBH,EAAqB,cAKnCI,EAAUb,EAAS72E,GACV03E,EAAQl3E,OAIdm3E,OAAS,WACd,IAAIC,EAAa,CACfxmE,SAAW,SAAUkE,GACnBoiE,EAAQ1B,QAAQ,CACdnwE,OAAQ,QACRuR,IAAMkgE,EAAe,MACrB34E,MAAQ2W,MAMdpE,EAAMG,UAAUumE,IAGlBt4E,EAAiB,SAAEf,KAAKyB,QA9HY,CAEpC,IAAI4Q,EAAK,SAAU9Q,GAQjB,GAAI,UAAWsB,KAAK2O,QAAU3O,KAAK2O,OAAOmB,MAAMulE,aAAe,EAAG,CAEhE,IAAI9rE,EAAIvJ,KAAK2O,OAAOmB,MAGpB,GAAI2lE,EAASz1E,KAAK2O,OAAiB,UAEjC,YADApF,EAAE2G,OAQF3G,EAAE7B,QACF6B,EAAEsR,KAAI,GAKV,IAAIjc,EAAK8Q,EAAK+mE,UAAUz2E,KAAM,CAC5B3E,KAAQA,EACRiI,IAAO4yE,EAAkB,SACzBG,YAAeH,EAAqB,YACpC7hB,KAAOA,IAETn2D,EAAgB,QAAEf,KAAKyB,GAGnB,UAAWoB,KAAK2O,SAClB3O,KAAK2O,OAAiB,SAAI/P,EAC1BoB,KAAK2O,OAAOmB,MAAMG,UAAU,CAC1BD,SAAW,SAAUzS,GAEN,GAATA,EACFk4E,EAAS72E,GAAIof,WAGby3D,EAAS72E,GAAI2O,YASnBtS,EAAM,CAACsW,IAAM0kE,EAAe,QAAGE,KAAQA,GAEvCD,EAAgB,QAA0B,aAArBA,EAAgB,SAGvCj7E,EAAW,MAAIs6E,EAAWrxE,OAAO,EAAC,GAAM,KAItC21D,EAAQrrD,GACVqrD,EAAQrrD,GAAOrR,KAAK,CAACmS,EAAOrU,EAAKuU,IAI1B3P,MAAM21E,MAAMhnE,GACnB3O,MAAM21E,MAAMhnE,GAAO6O,QAAQtb,IAAIuN,EAAOrU,EAAKuU,GAK3CmmE,EAAcnnE,GAAOrR,KAAK,CAACmS,EAAOrU,EAAKuU,OAmD1CxP,OAML02E,gBAAkB,SAAU73E,EAAK5D,KAQjCmjB,YAAc,SAAU/iB,GACtB,OAAqBgE,MAAjBw6D,EAAQx+D,GACHw+D,EAAQx+D,GACiBgE,MAAvBs2E,EAAct6E,GAChBs6E,EAAct6E,GAEhB,IAMT2mE,iBAAmB,SAAU3mE,GACNgE,MAAjBw6D,EAAQx+D,GACVw+D,EAAQx+D,GAAQ,GACgBgE,MAAvBs2E,EAAct6E,KACvBs6E,EAAct6E,GAAQ,KAK1Bs7E,cAAgB,WAsBd,OAnBK32E,KAAK42E,YAKR52E,KAAK42E,UAAY52E,KAAK62E,YAAYzxE,KAAKpF,MACvCJ,OAAOkK,iBAAiB,UAAW9J,KAAK42E,WAGxC52E,KAAK82E,OAASl3E,OAAO44D,aAAY,WAC/B,IAAK,IAAIz8D,EAAI,EAAGA,EAAI85E,EAAOv5E,OAAQP,IAC7B85E,EAAO95E,MAtRH,MAuRN85E,EAAO95E,GAvRD,OA0RT,MAIE,MAAQiE,KAAK+2E,aAMtBX,WAAa,SAAU7mE,GACrB,IAAKA,EAAU,IACb,OAEF,IAAI3Q,EAAKoB,KAAK22E,gBAEdpnE,EAAS,GAAI3Q,EAGb,IAAI03E,EAAUvB,EAAa7wE,OAAOqL,GAUlC,OARAkmE,EAAS72E,GAAM03E,EACfT,EAAOj3E,GAhTO,IAmTdoB,KAAK+E,UAAU5C,YACbm0E,EAAQl3E,QAGHR,GAQT63E,UAAY,SAAUjoE,EAAOe,GAG3B,IAAI3Q,EAAKoB,KAAK22E,gBAEdpnE,EAAS,GAAI3Q,EAGb,IAAIo4E,EAAS1B,EAAYpxE,OAAOqL,GAWhC,OARAkmE,EAAS72E,GAAMo4E,EACfnB,EAAOj3E,GA3UO,IA6Udo4E,EAAO9B,KAAOl1E,KAGdwO,EAAMzM,IAAIi1E,GAEHp4E,GAOT03E,QAAU,SAAU13E,GAClB,OAAO62E,EAAS72E,IAOlBi4E,YAAc,SAAUn4E,GAEtB,IAAI0b,EAAI1b,EAAE6Q,KAIV,IAAK6K,EACH,OAKF,IAAIxb,EAAKwb,EAAY,SAGrB,IAAKxb,EACH,OAGF,IAAI03E,EAAUb,EAAS72E,GAGvB,GAAK03E,EAAL,CAIA,GAAIT,EAAOj3E,KAAQ,EAcjB,OAXAiB,MAAMsD,IAAI,EAAG,+BAAgCmzE,EAAQhzE,KAMrDtD,KAAKm1E,cAAcmB,EAAQ13E,SAG3B03E,EAAQv4D,QAMV,OAAQ3D,EAAE3V,QACV,IAAK,SACC6xE,EAAQtB,UACVsB,EAAQrB,OAAO76D,GACjB,MAGF,IAAK,MACHva,MAAMsD,IAAIiX,EAAE+R,KAAM/R,EAAE/W,IAAMizE,EAAQhzE,KAClC,MAGF,IAAK,OACejE,MAAdQ,MAAMo3E,OACK,OAAT78D,EAAE88D,IACJr3E,MAAMo3E,KAAKj1E,OAAOoY,EAAEk8D,SAEpBz2E,MAAMo3E,KAAKhlE,OAAOmI,EAAEk8D,UAGxB,MAGF,IAAK,MAGH,GAAa,MAATl8D,EAAEpE,SACqB3W,IAArBQ,MAAM8hE,aACRvnD,EAAS,MAAIva,MAAM8hE,iBAKlB,GAAa,aAATvnD,EAAEpE,IAAoB,CAC7B,IAAIoB,EAAMhV,SACN2B,EAAIqW,EAAS,MAAI,GAErB,IAAIzQ,GACAA,EAAKyN,EAAI8N,eAAe,cAC1BnhB,EAAK,EAAI4F,EAAGpM,QAEVoM,EAAKyN,EAAI8N,eAAe,eAC1BnhB,EAAM,GAAI4F,EAAGpM,QAEXoM,EAAK9J,MAAMqV,MACbnR,EAAM,GAAI4F,EAAG6I,gBAKZ,GAAa,cAAT4H,EAAEpE,IAAqB,CAG9B,IAAIxX,EAAI,IAAI24E,gBAAgBv3E,OAAOy3D,SAASE,QAC5C,IAAIxzD,EAAIqW,EAAS,MAAI,GACrBrW,EAAK,EAAIvF,EAAEm3D,IAAI,KACf5xD,EAAM,GAAIvF,EAAEm3D,IAAI,MAChB5xD,EAAM,GAAIvF,EAAEm3D,IAAI,OAKhBv7C,EAAEgzD,KACJkJ,EAAQ1B,QAAQx6D,KAQpB+6D,cAAgB,SAAUv2E,UACjBi3E,EAAOj3E,GAGV62E,EAAS72E,IAAO62E,EAAS72E,GAAI61E,eAC/BgB,EAAS72E,GAAI61E,sBAGNgB,EAAS72E,IAMgB,GAA9BlE,OAAOqf,KAAK87D,GAAQv5E,QACtB0D,KAAKo3E,mBAITL,UAAY,WACV,OA1p0BN,SAAmBvwE,GACjB,MAAM0f,EAAM,IAAImxD,YAAY7wE,GAAO,IAAM,GAEzC,OADA5G,OAAO03E,OAAOC,gBAAgBrxD,GACvBxa,MAAMma,KAAKK,EAAKhlB,GAAUrE,KAAK,IAup0B3B26E,CAAS,KAIlBJ,gBAAkB,WAChBx3E,OAAOu4D,cAAcn4D,KAAK82E,QAC1B92E,KAAK82E,YAASz3E,EACdO,OAAO2K,oBAAoB,UAAWvK,KAAK42E,WAC3C52E,KAAK42E,eAAYv3E,GAMnB0F,QAAU,WAKR,OAJK/E,KAAKiF,MACRjF,KAAKiF,IAAM7C,SAASC,cAAc,OAClCrC,KAAKiF,IAAI2E,aAAa,KAAM,aAEvB5J,KAAKiF,KAIduH,QAAU,WAaR,GAZAqpE,EAAS,GACTn7E,OAAOqf,KAAK07D,GAAUhvE,QACpB8C,GAAKksE,EAASlsE,GAAGwU,SAEnB03D,EAAW,GACX/6E,OAAOqf,KAAK8/C,GAASpzD,QACnBgJ,GAAKoqD,EAAQpqD,GAAK,IAEpB/U,OAAOqf,KAAK47D,GAAelvE,QACzBgJ,GAAKkmE,EAAclmE,GAAK,IAGtBzP,KAAKiF,IAAK,CACZ,IAAIvG,EAAIsB,KAAKiF,IACTvG,EAAEmH,YACJnH,EAAEmH,WAAW/E,YAAYpC,GAE3BsB,KAAKiF,IAAM,KAGbjF,KAAKo3E,uBAaXr9E,EAAO,OAAO,IAAG,WACf,MAAM09E,EAAY,IAAIr3E,OAAO,eAG7B,SAASs3E,EAAUpB,GAEjB,OADAA,EAAUA,EAAQjwE,QACNgR,MAAMogE,GACTnB,EAEF,KAGT,MAAO,CAKLpyE,OAAS,WACP,MAAMjJ,EAAMP,OAAOwJ,OAAOlE,MAE1B,OADA/E,EAAI08E,MAAQ,GACL18E,GAOTgX,OAAS,SAAUqkE,IACjBA,EAAUoB,EAASpB,MAEjBt2E,KAAK23E,MAAMx6E,KAAKm5E,GAChBt2E,KAAKsH,YAQTgW,QAAU,SAAUg5D,IAClBA,EAAUoB,EAASpB,MAEjBt2E,KAAK23E,MAAMl3D,QAAQ61D,GACnBt2E,KAAKsH,YAQTtF,OAAS,SAAUs0E,GACjB,MAAMv6E,EAAIiE,KAAK23E,MAAM95E,QAAQy4E,IACnB,GAANv6E,IACFiE,KAAK23E,MAAM/6E,OAAOb,EAAG,GACrBiE,KAAKsH,YAQT8gC,KAAO,WACL,OAAOpoC,KAAK23E,MAAMr7E,QAOpB8E,SAAW,WACT,OAAOpB,KAAK23E,MAAM96E,KAAK,MAOzByK,QAAU,WACM,MAAVtH,KAAKtB,GACPsB,KAAKtB,EAAEkL,aAAa,QAAS5J,KAAKoB,aAQtC2D,QAAU,WACR,IAAIrG,EAAIsB,KAAKtB,EAOb,OANS,MAALA,IACFA,EAAIsB,KAAKtB,EAAI0D,SAASC,cAAc,SACpC3D,EAAEkL,aAAa,OAAO,QACtBlL,EAAEkL,aAAa,OAAO,QACtBlL,EAAEmD,UAAUE,IAAI,SAEXrD,OAOb3E,EAAO,MAAM,CAAC,SAAS,WAYrB8F,MAAM+3E,SAAoBv4E,IAAdQ,MAAM+3E,IAAoB/3E,MAAM+3E,IAAM,GAClD/3E,MAAM4C,IAAM5C,MAAM4C,KAAO,GAEzB,MAAMo1E,EAAc,IAAIz3E,OAAO,+BAkH/B,SAAS03E,EAAaC,EAAa5tD,EAAK7a,EAAO0oE,EAAOC,EAAeC,GACnE,MAAMh+E,EAAM,IAAIi+E,eAChBj+E,EAAI8mB,KAAK+2D,EAAa5tD,GAAK,GAE3B,MAAMiuD,EAAO,IAAIhjE,YAAY,eAAgB,CAC3CijE,SAAU,EACVhjE,OAAQ,CACN8U,IAAQA,EACR7a,MAAUA,KAGd1P,OAAOuV,cAAcijE,GAErBl+E,EAAIo+E,iBAAiB,SAAU,oBAC/Bp+E,EAAIo+E,iBAAiB,eAAgB,oBACrCp+E,EAAIo+E,iBAAiB,mBAAoB,kBACzCp+E,EAAIq+E,mBAAqB,WASvB,GAAuB,GAAnBv4E,KAAKy4D,WAAiB,CAExB,GAAoB,QAAhBsf,EAAuB,CACzB,IAAIS,EACJ,IACEA,EAAWlnD,KAAKwkC,MAAM91D,KAAKy4E,cAE7B,MAAO/5E,GAIL,OAHAmB,MAAMsD,IAAI,EAAGzE,GACb6E,QAAQJ,IAAIzE,QACZu5E,OAAc54E,QAICA,IAAbm5E,QAAiDn5E,IAAvBm5E,EAAiB,OAC7CA,EAAiB,OAAE/xE,QACjB/H,GAAKmB,MAAMsD,IAAIzE,EAAE,GAAIA,EAAE,IAAM,YAIR,MAAhBsB,KAAK04E,QACZ74E,MAAMsD,IAAInD,KAAK04E,OAAQ14E,KAAK24E,WAAY,oDAAsDxuD,GAG5E,MAAhBnqB,KAAK04E,OACPT,EAAcO,GAIdP,OAAc54E,QAIZW,KAAK04E,QAAU,KAAO14E,KAAK04E,OAAS,MACtC74E,MAAMsD,IAAInD,KAAK04E,OAAQ14E,KAAK24E,WAAY,oDAAsDxuD,GAI1E,mBAAd,GACR+tD,EAAQ,CACNQ,OAAW14E,KAAK04E,OAChBC,WAAe34E,KAAK24E,eAUR,SAAhBZ,GAA0C,QAAhBA,EAC5B79E,EAAI0+E,KAAKtnD,KAAKC,UAAUymD,IAExB99E,EAAI0+E,OA5LR/4E,MAAM4C,IAAIumB,aAAe,SAAU3R,EAAOzP,EAAO4H,GAG/C,IAAI2a,EAAMtqB,MAAM+3E,IAAM,UAQtB,MAAMiB,EAAShB,EAAY/vD,KAAKzQ,EAAM46C,WACtC,IAAI6mB,EAAc,GAEhBA,EADa,OAAXD,GAAmBA,EAAO,GACdA,EAAO,GAAK,IAAMA,EAAO,GAAK,IAAMA,EAAO,GAG3CxhE,EAAM46C,UAGtB6mB,GAAe,IAAMzhE,EAAM66C,QAC3B/nC,GAAO,IAAM2uD,EAGS,GAAlBlxE,EAAa,OACfuiB,GAAO,cACP2uD,GAAe,gBACUz5E,IAArBuI,EAAe,UAClBuiB,GAAO,YAAcviB,EAAe,QACnCkxE,GAAelxE,EAAe,cAETvI,IAAnBuI,EAAa,QAChBuiB,GAAO,UAAYviB,EAAa,MAC/BkxE,GAAe,IAAIlxE,EAAa,SAOlCkxE,GAAe,UACf3uD,GAAO,gBAGTtqB,MAAM4C,IAAIs2E,QAAQ5uD,EAAK3a,EAAI,cAAgBspE,IAO7Cj5E,MAAM4C,IAAImpB,YAAc,SAAUxU,EAAKxP,EAAO4H,GAG5C,IAAI2a,EAAMtqB,MAAM+3E,IAAN/3E,WAA8BuX,EAAI66C,eAEpB5yD,IAApBuI,EAAc,OAChBuiB,GAAO,WAGPA,GAAO,eAGTtqB,MAAM4C,IAAIs2E,QAAQ5uD,EAAK3a,EAAI,aAAe4H,EAAI66C,YAOhDpyD,MAAM4C,IAAIu2E,eAAiB,SAAUxpE,GACnC3P,MAAM4C,IAAIs2E,QAAQl5E,MAAM+3E,IAAM,cAAepoE,EAAI,eAcnD3P,MAAM4C,IAAI+b,YAAc,SAAUy6D,EAAIzpE,GACrC,IAAI2a,EAAQtqB,MAAM+3E,IAAM,cAAgBrtB,mBAAmB0uB,GAC3Dp5E,MAAM4C,IAAIs2E,QAAQ5uD,EAAK3a,EAAI,eAAiBypE,IAQ7Cp5E,MAAM4C,IAAIy2E,cAAgB,SAAU/uD,EAAK3a,GACvC3P,MAAM4C,IAAIs2E,QAAQ5uD,EAAK3a,EAAI,gBAwG7B3P,MAAM4C,IAAIs2E,QAAU,SAAU5uD,EAAK8tD,EAAe3oE,EAAO4oE,GACvDJ,EAAY,MAAO3tD,EAAK7a,OAAOjQ,EAAW44E,EAAeC,IAW3Dr4E,MAAM4C,IAAI02E,QAAU,SAAUhvD,EAAK6tD,EAAO1oE,EAAO4oE,GAC/CJ,EAAY,MAAO3tD,EAAK7a,EAAO0oE,OAAO34E,EAAW64E,IAWnDr4E,MAAM4C,IAAI22E,SAAW,SAAUjvD,EAAK6tD,EAAO1oE,EAAO4oE,GAChDJ,EAAY,OAAQ3tD,EAAK7a,EAAO0oE,OAAO34E,EAAW64E,IAUpDr4E,MAAM4C,IAAI42E,WAAa,SAAUlvD,EAAK7a,EAAO4oE,GAC3CJ,EAAY,SAAU3tD,EAAK7a,OAAOjQ,OAAWA,EAAW64E,IAY1Dr4E,MAAM4C,IAAI62E,aAAe,SAAUrB,EAAeC,GAChDr4E,MAAM4C,IAAIs2E,QAAQl5E,MAAM+3E,IAAM,UAAWK,EAAe,oBAAqBC,IAU/Er4E,MAAM4C,IAAI82E,SAAW,SAAUC,EAAIvB,EAAeC,GAChDr4E,MAAM4C,IAAIs2E,QAAQl5E,MAAM+3E,IAAM,UAAY4B,EAAIvB,EAAe,yBAA0BuB,EAAItB,IAU7Fr4E,MAAM4C,IAAIg3E,SAAW,SAAUD,EAAIxB,EAAOE,GACxCr4E,MAAM4C,IAAI02E,QAAQt5E,MAAM+3E,IAAM,UAAY4B,EAAIxB,EAAO,oBAAqBwB,EAAItB,IAUhFr4E,MAAM4C,IAAIi3E,UAAY,SAAUF,EAAIxB,EAAOE,GACzCr4E,MAAM4C,IAAI22E,SAASv5E,MAAM+3E,IAAM,UAAY4B,EAAIxB,EAAO,qBAAsBwB,EAAItB,IASlFr4E,MAAM4C,IAAIk3E,YAAc,SAAUH,EAAItB,GACpCr4E,MAAM4C,IAAI42E,WAAWx5E,MAAM+3E,IAAM,UAAY4B,EAAI,uBAAwBA,EAAItB,OAKjFn+E,EAAO,gBAAgB,IAAG,WACxB6F,OAAOg6E,MAAM,SAAS3jE,EAAEmH,GAAMA,KAAGnH,EAAE7T,SAASC,cAAc,MAAOw3E,KAAKz8D,GAAE,IAA0D6O,EAAtDsqC,EAAEtgD,EAAEshD,OAAO9nD,EAAErP,OAAO/B,EAAEgC,OAAOmN,aAAoB4iB,EAAE,GAAO2C,KAAK+mD,IAAic,IAA7b1/D,EAAEnE,EAAEqhD,SAASjgD,MAAM,uBAAuB7Y,EAAE,SAAS0tB,GAAoB,IAAjB,IAAQxtB,EAAOuI,EAAX0M,EAAE,EAAI0Z,EAAE,GAAW1Z,EAAEuY,EAAE5vB,QAAwB,IAAhB2K,EAAEilB,EAAExvB,OAAOiX,MAAU0D,MAAM,YAAagW,GAAGhvB,GAAG4I,GAAG,IAAI,GAAG,OAAOA,EAAEA,EAAE+wC,WAAW,GAAG,IAAI/wC,EAAEA,EAAE,QAAS,CAAA,GAAM,KAAHA,EAAkG,OAArE,IAArBvI,EAAE,GAAGuI,EAAEilB,EAAExvB,OAAOiX,KAAW1M,EAAEoQ,MAAM,OAAO3Y,GAAGuI,EAAEA,EAAEilB,EAAExvB,OAAOiX,KAAKA,IAAI0Z,GAAGhvB,EAAEoK,SAAS/J,IAAgF,IAAhE8hB,EAAE6M,EAAE/wB,OAAOgY,EAAEye,KAAKwE,IAAI,IAAI/W,EAAEA,GAAG6M,EAAEA,EAAEhsB,OAAOiT,GAAG+Y,EAAEhsB,OAAO,EAAEiT,GAAG2X,EAAE,GAAOlwB,EAAE,EAAEA,EAAEykB,EAAEzkB,IAAKkwB,GAAG5tB,EAAEgvB,EAAE2qB,WAAWj8C,GAAGqe,EAAE,GAAG49B,WAAW59B,EAAE,GAAG9d,QAAQP,EAAE,KAAK,OAAOkwB,GAASsqC,GAAGA,EAAEA,EAAE95D,QAAQ,kBAAkB,KAAIwvB,EAAExc,EAAEwY,IAAQ5Q,MAAM,wBAAkC,OAAN5H,EAAEwY,GAAUmI,EAAEjzB,KAAK,MAAMqB,EAAEiR,EAAEuY,IAAI,IAAIxpB,EAAE4b,EAAE,KAAUgW,EAAEjzB,KAAKsS,EAAEwY,GAAG,IAAIzpB,EAAEiR,EAAEuY,KAAWoI,EAAEjzB,KAAK8uB,EAAExvB,QAAQ,MAAM,MAA8C,OAAxC46D,SAASwiB,KAAK,WAAczpD,EAAEvzB,KAAK,MAAY,GAAOuF,SAAS40D,iBAAiB,UAAUvwD,QAAQ1K,GAAGA,EAAE+N,iBAAiB,SAAQ,SAASpL,GAAGA,EAAEwB,iBAAiBN,OAAOg6E,OAAM,EAAiB,KAAX55E,KAAK65E,KAAU75E,KAAK+nB,aAAa,aAAa/nB,KAAK65E,aAqB3/B9/E,EAAO,OAAO,CACZ,QACA,OACA,KACA,WACA,eACA,WACA,eACA,UACA,aACA,eACA,cACA,aACA,gBACA,OACA,MACA,gBACA,OACA,UACC,SAAUggF,EACAnH,EACAvxD,EACA24D,EACAthB,EACAuhB,EACAC,EACAnkB,EACAokB,EACAC,EACAC,EACAC,EACAC,EACAC,GAEX,MAAMpgE,EAAIhY,SAGVvC,MAAM+3E,IAAMx9D,EAAEs2C,KAAK3oC,aAAa,mBAAqB,GAGrD,MAAM0yD,EAAMrgE,EAAE8K,eAAe,cA6B7B,IAAIw1D,EA5BQ,OAARD,IACF56E,MAAM8hE,WAAarwC,KAAKwkC,MAAM2kB,EAAI1yD,aAAa,oBAAsB,KAIvEloB,MAAMm2D,QAAUD,EAAa7xD,OAC3BrE,MAAM+3E,IAAIt7E,OAAS,EAAI,aAAeuD,MAAM+3E,IAAIt2E,UAAY,aAI9D1B,OAAO88D,SAAWwd,EAClBr6E,MAAMsD,IAAM,SAAUgpB,EAAM9oB,EAAKC,GAE3BA,IACFD,GAAO,qBAAqBC,EAAI,WAIlC42E,EAAc/2E,KACF,IAATgpB,EAAa,GAAKA,EAAO,MACxB9oB,EACF,QACA,MAIJxD,MAAMqV,GAAKmM,EAAQnd,OAAO+1E,IAGtBS,EAAKt4E,SAAS8iB,eAAe,uBAC/Bw1D,EAAG9wE,aAAa,OAAQ,KACxB8wE,EAAG5wE,iBAAiB,SAAS,WAC3BwwE,EAAUtH,gBAAgB1oD,WAG5BzqB,MAAM86E,UAAY,WAChBL,EAAU9G,gBAAgBlpD,UAI9BouC,GAAS,SAAUtzC,GAEjB,IA2BIw1D,EAAQC,EA3BR5/E,EAAM,GAGNsS,EAAO1N,MAAMm2D,QAAQL,IAAI,SAAW,GAExC91D,MAAM21E,MAAQ31E,MAAM21E,OAAS,GAK7Bp7D,EAAE48C,iBAAiB,6BAA6BvwD,SAC9C,SAAS/H,GACP,IAAI2E,EAAM3E,EAAEsI,YAER1D,EAAM5E,EAAEqpB,aAAa,YACrBzkB,IACFD,GAAO,qBAAqBC,EAAI,WAGlC,IAAIF,EAAO1E,EAAEqpB,aAAa,cAAgB,QAC1CmyD,EAAc/2E,IAAIE,EAAKD,EAAM,QAQjC,IAAI0U,EAAQsC,EAAE8K,eAAe,MAEzBhQ,EAAKrV,MAAMqV,GAGf,GAAI4C,EAAO,CAQT,GAPAA,EAAM3O,MAAMK,QAAU,QACtBoxE,EAASxgE,EAAE/X,cAAc,SAClBuH,aAAa,KAAM,aAC1BgxE,EAAO/4E,UAAUE,IAAI,eAII1C,IAArBQ,MAAM8hE,aAA6B9hE,MAAM8hE,WAAuB,YAAK9hE,MAAM8hE,WAAmB,QAChG,IACEzsD,EAAGtC,SAAS/S,MAAM8hE,WAAuB,YAAK9hE,MAAM8hE,WAAmB,QAEzE,MAAOjjE,GACLmB,MAAMsD,IAAI,EAAEzE,IAIhBm8E,EAAWD,EAAO34E,KAAK,SACdK,KAAK4S,EAAGiM,WAEbjM,EAAGyL,gBACLk6D,EAASh5E,UAAUE,IAAI,aAGzB+V,EAAMjS,WAAWa,aAAak0E,EAAQ9iE,GAMxC,IAAIgjE,EAAgB1gE,EAAE48C,iBACpB,qBAGF8jB,EAAcr0E,SAAQ,SAAS/H,GAGzBA,EAAEmD,UAAUC,SAAS,eACHzC,IAAhBW,KAAK2oB,QAEPoxD,EAAW71E,OAAOxF,GAAG2L,QAMvB3L,EAAEoL,iBAAiB,SAAS,SAAUpL,QAChBW,IAAhBW,KAAK2oB,OACP3oB,KAAK2oB,OAAO3H,OAGZ+4D,EAAW71E,OAAOlE,MAAMghB,UAK5BtiB,EAAEoL,iBAAiB,WAAW,SAAUpL,GAGtC,OAFWqC,EAAerC,IAG1B,KAAK,QACiBW,IAAhBW,KAAK2oB,OACP3oB,KAAK2oB,OAAO6pC,SAGZunB,EAAW71E,OAAOlE,MAAMghB,OAE1BtiB,EAAEqB,cAKPC,MAGH,IAAI+6E,EAAQ3gE,EAAExU,qBAAqB,SAAS,GAE5C,GAAIm1E,GAA+C,GAAtCA,EAAMl5E,UAAUC,SAAS,UAAoB,CAGxD,IAAIk5E,GAAe,EAGnBD,EAAMjxE,iBAAiB,SAAS,SAASpL,GACvCsB,KAAK6B,UAAUE,IAAI,aAIrB,IAAI2uD,EAAOt2C,EAAExU,qBAAqB,QAAQ,GAC7B,OAAT8qD,GACFA,EAAK5mD,iBAAiB,SAAS,WACxBkxE,EAIHA,GAAe,EAHfD,EAAMl5E,UAAUG,OAAO,aAW7B+4E,EAAMjxE,iBAAiB,SAAS,SAASpL,GACvCs8E,GAAe,KAOH,OADF5gE,EAAE8K,eAAe,cAE7BrlB,MAAM82D,OAASwjB,EAAgBj2E,OAC7BkW,EAAE8K,eAAe,YAAYrf,YAC7BkC,MAAM,IAGV,IAAIkzE,EAAa7gE,EAAE8K,eAAe,cAK9Bg2D,EAAcd,EAAiBl2E,OAAOqJ,GAE1C,GAAkB,MAAd0tE,EAAoB,CAGtBA,EAAW94E,YAAY+4E,EAAY79D,QAAQtY,WAG3C,IAAIo2E,EAAK/gE,EAAE8K,eAAe,UAC1Bi2D,EAAGz0E,aAAaw0E,EAAYn2E,UAAWo2E,EAAGt6E,YA0C5C,QArCyBxB,IAArBQ,MAAM8hE,aAGW,OAAfsZ,GACFC,EAAYjZ,cAGVpiE,MAAM8hE,WAAmB,QAC3B9hE,MAAM8hE,WAAmB,OAAEl7D,SAAQ,SAAS/H,GAG7B,MAATA,EAAE,SAAuBW,IAATX,EAAE,IACpBzD,EAAIk5D,KAAOye,EAAU1uE,SACrBjJ,EAAIk5D,KAAKe,MAAMx2D,EAAE,GAAIA,EAAE,KAIP,MAATA,EAAE,KACTzD,EAAIk5D,KAAOye,EAAU1uE,SACrBjJ,EAAIk5D,KAAKe,MAAM,EAAGx2D,EAAE,SAWxBo8E,EAAcx+E,OAAS,GACzB4+E,EAAY9Y,iBAEdviE,MAAM21E,MAAc,OAAI0F,EAIpBN,EAAQ,CACV1lE,EAAGgM,WAAa,WACd05D,EAAO/4E,UAAUG,OAAO,iBACjBuL,EAAS,IAGlB2H,EAAG+L,OAAS,WACV25D,EAAO/4E,UAAUE,IAAI,UAErB,IAAI2b,EAAOtD,EAAE8K,eAAe,WACvBxH,EAAK7c,YACR6c,EAAKvb,YAAYnC,KAAK+E,WAExBwI,EAAS,IAAI,GAGf,IAAI6tE,EAAU,WACRlmE,EAAG6L,SACL7L,EAAG8I,WAGH9I,EAAG8L,QAIP45D,EAAOz1E,QAAUi2E,EAGb7tE,EAAS,IACX6tE,EAAQh+E,QAQRgd,EAAE8K,eAAe,kBACnBtlB,OAAOy7E,SAAWrB,EAAS91E,OACzBkW,EAAE8K,eAAe,iBACjBrlB,MAAMm2D,SAER/6D,EAAIogF,SAAWz7E,OAAOy7E,UAIfz7E,OAAO0Q,SACdrV,EAAIogF,SAAWz7E,OAAO0Q,OAAO+qE,UAI3BpgF,EAAIogF,WACNpgF,EAAIogF,SAASvkB,YAAY18C,GAGzBnf,EAAIogF,SAASpkB,aAAa78C,IAO5B,IAAIkhE,EAAOlhE,EAAE8K,eAAe,cACf,OAATo2D,GACFA,EAAKxxE,iBAAiB,UAAU,SAAUpL,GACxC,IAAI68E,EAAKnhE,EAAE8K,eAAe,WAG1B,QAAiB7lB,IAAbk8E,EAAGh+E,OAAoC,KAAbg+E,EAAGh+E,MAI/B,OAHAg+E,EAAG7wE,QACHhM,EAAEqB,YACFF,MAAMsD,IAAI,IAAK,kBAKjBtD,MAAMm2D,QAAQn7C,IAAI,OAAQtN,QAEflO,IAAP6V,GACF4C,EAAMva,MAAQ2X,EAAG1C,UACE,IAAfsF,EAAMva,OACRua,EAAMo+C,gBAAgB,UAGxBp+C,EAAMo+C,gBAAgB,SACtBp+C,EAAMo+C,gBAAgB,SAQxBqlB,EAAG15E,UAAUE,IAAI,WACjBqY,EAAE8K,eAAe,WAAWrjB,UAAUE,IAAI,cAM3ClC,MAAMm2D,QAAQL,IAAI,SACnB2kB,EAAU9G,gBAAgBlpD,aAUXjrB,IAAbpE,EAAIk5D,OACNl5D,EAAIk5D,KAAOye,EAAU1uE,UAGvBrE,MAAM0zE,KAAOt4E,EAAIk5D,KAMjB,IAAIqnB,EAAanB,EAAgBn2E,SAG7Bu3E,EAAQrhE,EAAE8K,eAAe,cACzBw2D,EAASthE,EAAE8K,eAAe,WAU9B,IAAIy2D,EACJ,GAVIF,GAASC,IAEXD,EAAM/0E,aAAa80E,EAAWz2E,UAAW22E,GACzC77E,MAAM21E,MAAa,MAAIgG,GAOrBG,EAAKvhE,EAAE8K,eAAe,mBAAoB,CAC5C,IAAIiF,EAAMwxD,EAAG5zD,aAAa,qBACd1oB,IAAR8qB,GACFtqB,MAAM4C,IAAIy2E,cAAc/uD,GAAK,SAAUxX,GACrC,GAAIA,GAAQA,EAAKrW,OAAS,EAAG,CAE3BuD,MAAMwxD,OAASkpB,EAAYr2E,SAG3BkW,EAAEnX,KAAKd,YAAYtC,MAAMwxD,OAAOtsD,WAGhClF,MAAMo3E,KAAOuD,EAAUt2E,SACvBkW,EAAE8K,eAAe,cAAc/iB,YAAYtC,MAAMo3E,KAAKlyE,WAEtD,IAGE4N,EAAKlM,QAAQ1K,GAAK8D,MAAMwxD,OAAOykB,SAAS/5E,IAE1C,MAAO2C,GACLmB,MAAMsD,IAAI,EAAGzE,QAOvB,OAAOzD,QAKX2E,OAAOC,MAAQD,OAAOC,OAAS,GAC/BA,MAAM6C,OAAS7C,MAAM6C,QAAU,GAC/B5I,EAAQ,CAAC,aAAc,SAAU,SAEjCC,EAAO,UAAU,eAnm3BjB","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.3-en.js b/public/js/kalamar-0.41.3-en.js
new file mode 100644
index 0000000..48a25ff
--- /dev/null
+++ b/public/js/kalamar-0.41.3-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,v=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||v)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.childNodes;for(let e=t.length-1;e>=3;e--)this._el.removeChild(t[e])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+v.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)v(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},P={configurable:!1,enumerable:!1,value:null,writable:!1},L={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=L[typeof window]&&window||this,O=L[typeof n]&&n&&!n.nodeType&&n,R=L[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=L[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function G(t){t.length=0,i.length<40&&i.push(t)}function z(t){var e=t.cache;e&&z(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Q(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Y=function t(e){var n=(e=e?Y.defaults(S.Object(),e,Y.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,W=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Dt(gt=I.keys)&&gt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!Gt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=N,wt[A]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Q(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Gt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Q(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(G(i),G(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Pt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Lt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Q(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Q(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Lt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Nt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&z(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Gt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&L[typeof t]||e&&L[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var v=m,_=e[g];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[g],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(G(r),G(o)),s}function Rt(t,e,n,i,r){(Gt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Gt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Gt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(G(c.array),z(c)):n&&G(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new W;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Q(u))[2]&&(u[2]=Q(u[2])),u[3]&&(u[3]=Q(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Lt)([t,e,n,i,r,o])}function qt(t){return Qt[t]}function Bt(){var t=(t=Et.indexOf)===Pe?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){P.value=e,ht(t,"__bindData__",P)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var Gt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},zt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!L[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Qt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Qt),Wt=j("("+zt(Yt).join("|")+")","g"),$t=j("["+zt(Qt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Pt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&L[typeof r])for(var u=-1,h=L[typeof r]&&zt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&L[typeof r])for(var l=-1,u=L[typeof r]&&zt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;for(i in e=e&&void 0===n?e:Pt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;e=e&&void 0===n?e:Pt(e,n,3);for(var s=-1,a=L[typeof r]&&zt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=zt(t),r=i.length;for(e=Pt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=zt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!L[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,Gt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=zt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Q(t,0,_t(vt(0,i),r))}function Pe(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Le(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return Q(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Gt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,Q(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new W;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),v=g<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new W;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Q(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new W;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Pt(t,e,n);if("object"!=i)return Fe(t);var r=zt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new W;var e=Q(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new W;var n=Q(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Pt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Q(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(Gt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&z(d);return G(i),G(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Q(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=zt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new W;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Pt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Q(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return G(s),G(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new W;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Q(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Q(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Le,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=Gt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||G(c.criteria),z(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new W;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Pt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Q(t):le(t)},Et.transform=function(t,e,n,i){var r=Gt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,Q(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Gt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Le,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Le,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Pt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Pt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Pe,Et.isArguments=Vt,Et.isArray=Gt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Pt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:zt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=zt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",_=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(v,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=N(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Wt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Q(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Y)._=Y:O._=Y:S._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const v=n;g.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,v=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=v(),0;var i=s(n,E);if(i)return A+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=v();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",C=0;try{for(var T,P,L=0;E.t.lastIndex=L,T=E.t.exec(n);)P=y(n.substr(L,T.index-L),T[0]),L=T.index+P;for(y(n.substr(L)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=G(t),s=G(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=G(e).height+10,s=G(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=G(e.element),i=this._options.helperElementPadding;L(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=z(t.element))!==document.body&&Q(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),L=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=z(t.element))!==document.body&&Q(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),L.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(O),N.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(L),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,L,q),b.call(this,t.scrollTo,t,N)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=P(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=P(e,"z-index"),r=parseFloat(P(e,"opacity")),o=P(e,"transform")||P(e,"-webkit-transform")||P(e,"-moz-transform")||P(e,"-ms-transform")||P(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function P(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function L(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===P(t,"position")||L(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=G(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),L(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=G.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function G(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function z(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function Q(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var W=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return W.instances[A(n,"introjs-instance")]=n,n};return W.version="2.9.3",W.instances={},W.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},W})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const g=m.getElementById("koralQuery");let v;null!==g&&(KorAP.koralQuery=JSON.parse(g.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(v=document.getElementById("link-guided-tour"))&&(v.setAttribute("href","#"),v.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=m.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){_.onMinimize=function(){r.classList.remove("active"),delete g.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,g.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var P=u.create(),L=m.getElementById("searchform"),N=m.getElementById("vc-view");let S;if(L&&N&&(L.insertBefore(P.element(),N),KorAP.Panel.query=P),S=m.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.3-en.js.map b/public/js/kalamar-0.41.3-en.js.map
new file mode 100644
index 0000000..e31751c
--- /dev/null
+++ b/public/js/kalamar-0.41.3-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.3-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.5-de.js b/public/js/kalamar-0.41.5-de.js
new file mode 100644
index 0000000..dca91fd
--- /dev/null
+++ b/public/js/kalamar-0.41.5-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function g(t,e){return d.call(t,e)}function m(t,e){var n,i,r,o,s,a,c,l,h,d,f,g=e&&e.split("/"),m=u.map,v=m&&m["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&g&&(t=g.slice(0,g.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((g||v)&&m){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),g)for(d=g.length;d>0;d-=1)if((r=m[g.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(g(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!g(c,t)&&!g(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=m(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return m(t,i)})):m(t,s):(o=(r=b(t=m(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,m,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),m=!0;else if("module"===o)r=b[f]=a.module(t);else if(g(c,o)||g(l,o)||g(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&m||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),g(c,t)||g(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(;t.length>0;)this._el.removeChild(t[0])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),g=t("./util"),m=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new m({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},A,x(r,E),i.pick(r,k)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(g.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};g.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(g.intersectRect(o,n)),r.points.push(g.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],A={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},k=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,g=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:g,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:g,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,g=0;g<4;++p,++g){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var m=o(t,a);m<l&&(g=0,c=i.cloneDeep(a),l=m)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var g=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(g,f);var m=s(g,c);if(h&&(m.vs=i.flatten([h,m.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(m,"barycenter")||(m.barycenter=0,m.weight=0),m.barycenter=(m.barycenter*m.weight+v.order+_.order)/(m.weight+2),m.weight+=2}return m}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-g(t,n)/2}));return i.max(e,(function(e,n){return e+g(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function g(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=g(n);)v(n,t,e,m(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function g(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function m(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=g,u.enterEdge=m,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),g=/($^)/,m=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",A="[object Date]",k="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[A]=C["[object Number]"]=C[k]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},P={configurable:!1,enumerable:!1,value:null,writable:!1},L={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=L[typeof window]&&window||this,O=L[typeof n]&&n&&!n.nodeType&&n,R=L[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=L[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function B(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Q=function t(e){var n=(e=e?Q.defaults(S.Object(),e,Q.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Y=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,gt=e.isNaN,mt=Dt(mt=I.keys)&&mt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new At(t)}function At(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[A]=r,wt["[object Function]"]=N,wt[k]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,At.prototype=Et.prototype;var kt=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Bt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case A:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?ge:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Pt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(kt.funcNames&&(i=!t.name),!(i=i||!kt.funcDecomp))){var r=rt.call(t);kt.funcNames||(i=!d.test(r)),i||(i=m.test(r),Bt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Lt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Lt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Bt(d,t),d}function Nt(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=B(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&L[typeof t]||e&&L[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=k),c==b&&(c=k),a!=c)return!1;switch(a){case E:case A:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=k)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var g=r.length;g--;)if(r[g]==t)return o[g]==e;var m=0;if(s=!0,r.push(t),o.push(e),l){if(g=t.length,m=e.length,(s=m==g)||i)for(;m--;){var v=g,_=e[m];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[m],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return m++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--m>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?ge:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=B(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Y;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Lt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Pe?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}kt.funcDecomp=!Dt(e.WinRTError)&&m.test(t),kt.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Bt=ht?function(t,e){P.value=e,ht(t,"__bindData__",P)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=k||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Qt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=mt?function(t){return oe(t)?mt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!L[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qt=ie(Wt),Yt=j("("+Gt(Qt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Pt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&L[typeof r])for(var u=-1,h=L[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&L[typeof r])for(var l=-1,u=L[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;for(i in e=e&&void 0===n?e:Pt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;e=e&&void 0===n?e:Pt(e,n,3);for(var s=-1,a=L[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Pt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!L[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=k)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function ge(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function me(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function Ae(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),me(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function ke(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return ge(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,_t(vt(0,i),r))}function Pe(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Le(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return W(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Y;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},g=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var m=h-(s-u),v=m<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(g,m))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=At,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);ge(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Be=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Y;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new At(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Y;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Pt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Y;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Y;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=ge,Et.forEachRight=me,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Pt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&B(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return ge(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Y;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Pt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ge(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Y;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Le,Et.shuffle=ke,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),ge(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Y;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Pt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?ge:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Le,Et.each=ge,Et.eachRight=me,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Le,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Pt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Pt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),me(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Pe,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==A||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==k&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Pt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!gt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Be,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=Ae,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||g,m="__p += '",_=j((n.escape||g).source+"|"+p.source+"|"+(p===f?u:g).source+"|"+(n.evaluate||g).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),m+=t.slice(d,a).replace(v,F),n&&(m+="' +\n__e("+n+") +\n'"),s&&(r=!0,m+="';\n"+s+";\n__p += '"),i&&(m+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),m+="';\n";var b=n.variable,w=b;w||(m="with ("+(b="obj")+") {\n"+m+"\n}\n"),m=(r?m.replace(a,""):m).replace(c,"$1").replace(l,"$1;"),m="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+m+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var A=N(s,"return "+m+E).apply(void 0,h)}catch(t){throw t.source=m,t}return e?A(e):(A.source=m,A)},Et.unescape=function(t){return null==t?"":q(t).replace(Yt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=Ae,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=ke(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new At(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,ge(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new At(n,t):n}})),ge(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),ge(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new At(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Q)._=Q:O._=Q:S._=Q}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let g=((o+f)/2+f)/2;const m=this._c("g");m.setAttribute("class","label"),n._labelsElement.appendChild(m),m.arcRef=c;const v=n;m.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=m.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",g+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,A=m.insertBefore(n._c("rect"),_),k=w+2*n.xPadding;A.setAttribute("x",d+u-k/2),A.setAttribute("ry",5),A.setAttribute("y",b.y-n.yPadding),A.setAttribute("width",k),A.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},g={},m=!1,v=13,_=27,y=32,b=[];return g={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,g="",m=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(g=d.value),"function"==typeof t&&(void 0!==d?t(!0,g):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){m.hide(),m.unbind(r.body,"keyup",l),m.unbind(o,"focus",u),h&&m.unbind(i,"click",e),f&&m.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||m.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=g.message.replace("{{message}}",i),"prompt"===n&&(e+=g.input),e+=g.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(g.buttons.cancel,g.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",g.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),m||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(m=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(m=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;m=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function m(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!g[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,A[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(A[E.sL]=t.top),m(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=m(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?m(t.cN,"",!0):"";t.rB?(k+=i,x=""):t.eB?(k+=e(n)+i,x=""):(k+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return k+=v(),0;var i=s(n,E);if(i)return k+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),k+=v();do{E.cN&&(k+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(k+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,A={},k="";for(w=E;w!=b;w=w.parent)w.cN&&(k=m(w.cN,"",!0)+k);var x="",C=0;try{for(var T,P,L=0;E.t.lastIndex=L,T=E.t.exec(n);)P=y(n.substr(L,T.index-L),T[0]),L=T.index+P;for(y(n.substr(L)),w=E;w.parent;w=w.parent)w.cN&&(k+="</span>");return{r:C,value:k,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(g);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?m[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return g[t]||g[m[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},g={},m={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=g[e]=n(t);i.aliases&&i.aliases.forEach((function(t){m[t]=e}))},t.listLanguages=function(){return Object.keys(g)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(m.call(this,document.querySelector(".introjs-helperLayer")),m.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),m.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var g=a.width/2-s.width/2;r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",g=a.width/2-s.width/2,r&&(g+=5),f(a,g,s,e)&&(e.style.right=null,d(a,g,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&g(i,"bottom"),a.top-o<0&&g(i,"top"),a.right+s>r.width&&g(i,"right"),a.left-s<0&&g(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&g(s,"-left-aligned");(t<r||o-t<r)&&g(s,"-middle-aligned");t<e&&g(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function g(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function m(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;L(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),m.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),g=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var A=this._introItems[t.step-2>=0?t.step-2:0];(null!==A&&"forward"===this._direction&&"floating"===A.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,s),m.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,g,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Q.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Q.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var k=document.createElement("div"),x=document.createElement("div"),L=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");k.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),m.call(o,k),m.call(o,x),this._targetElement.appendChild(k),this._targetElement.appendChild(x),L.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Q.call(this)),M.style.cssText="width:"+Q.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(O),N.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(L),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,L,q),b.call(this,t.scrollTo,t,N)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=P(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=P(e,"z-index"),r=parseFloat(P(e,"opacity")),o=P(e,"transform")||P(e,"-webkit-transform")||P(e,"-moz-transform")||P(e,"-ms-transform")||P(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var A,k=(A={},function(t,e){return A[e=e||"introjs-stamp"]=A[e]||0,void 0===t[e]&&(t[e]=A[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+k(n)+(i?"_"+k(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function P(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function L(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===P(t,"position")||L(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){B.call(this,t.getAttribute("data-step"))}.bind(this))}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),L(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),m.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Q(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Y=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Y.instances[k(n,"introjs-instance")]=n,n};return Y.version="2.9.3",Y.instances={},Y.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return B.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Y})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const g=document;KorAP.URL=g.body.getAttribute("data-korap-url")||"";const m=g.getElementById("koralQuery");let v;null!==m&&(KorAP.koralQuery=JSON.parse(m.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(v=document.getElementById("link-guided-tour"))&&(v.setAttribute("href","#"),v.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},m=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},g.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=g.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=g.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=g.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=g.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=g.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==g.getElementById("ql-field")&&(KorAP.QLmenu=c.create(g.getElementById("ql-field").parentNode).limit(5));var A=g.getElementById("resultinfo"),k=l.create(m);if(null!=A){A.appendChild(k.actions.element());var x=g.getElementById("search");x.insertBefore(k.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==A&&k.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&k.addAlignAction(),KorAP.Panel.result=k,r){_.onMinimize=function(){r.classList.remove("active"),delete m.vc},_.onOpen=function(){r.classList.add("active");var t=g.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),m.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,m.vc&&C.apply()}g.getElementById("view-tutorial")?(window.tutorial=i.create(g.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(g),a.tutorial.initDocLinks(g));var T=g.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=g.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",m),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),g.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var P=u.create(),L=g.getElementById("searchform"),N=g.getElementById("vc-view");let S;if(L&&N&&(L.insertBefore(P.element(),N),KorAP.Panel.query=P),S=g.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),g.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),g.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.5-de.js.map b/public/js/kalamar-0.41.5-de.js.map
new file mode 100644
index 0000000..2d563d7
--- /dev/null
+++ b/public/js/kalamar-0.41.5-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.5-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n     removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      while (liElements.length>0){\r\n        this._el.removeChild(liElements[0]);\r\n      };\r\n     },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.5-en.js b/public/js/kalamar-0.41.5-en.js
new file mode 100644
index 0000000..40cafab
--- /dev/null
+++ b/public/js/kalamar-0.41.5-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),g=u.map,v=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||v)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=g[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&v&&v[i]&&(c=v[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function v(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return v(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,v(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(;t.length>0;)this._el.removeChild(t[0])},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[3]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[3])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),i},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect();this._el.style.left=e.left+"px",this._el.style.top=e.top+e.height-this._el.clientHeight+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&n.add.apply(n,t),n.add("button-group"),this._el=e,this},element:function(){return this._el},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},add:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._el.addE("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n.actions=t.create(i).bind(this),n.prepend=!1,n.actions.panel=n,n},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions.element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this.actions=t.create(i).bind(this),this.actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this.actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions.element()),this._el=t},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions.add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,x(n,v),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var v=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(m=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var g=s(m,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var v=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+v.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)v(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function v(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=g,u.exchangeEdges=v},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,g=/\bthis\b/,v=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=P[typeof window]&&window||this,O=P[typeof n]&&n&&!n.nodeType&&n,R=P[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function G(t){t.length=0,i.length<40&&i.push(t)}function z(t){var e=t.cache;e&&z(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Q(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Y=function t(e){var n=(e=e?Y.defaults(S.Object(),e,Y.pick(S,_)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,W=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=N.prototype.toString,ot=Dt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=I.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,gt=Dt(gt=I.keys)&&gt,vt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!Gt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=N,wt[A]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Q(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Gt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Q(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(G(i),G(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Q(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Q(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Nt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&z(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Gt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,g=e.length,(s=g==m)||i)for(;g--;){var v=m,_=e[g];if(i)for(;v--&&!(s=Ot(t[v],_,n,i,r,o)););else if(!(s=Ot(t[g],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(G(r),G(o)),s}function Rt(t,e,n,i,r){(Gt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Gt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Gt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(G(c.array),z(c)):n&&G(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new W;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Q(u))[2]&&(u[2]=Q(u[2])),u[3]&&(u[3]=Q(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Pt)([t,e,n,i,r,o])}function qt(t){return Qt[t]}function Bt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var Gt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},zt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Qt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Qt),Wt=j("("+zt(Yt).join("|")+")","g"),$t=j("["+zt(Qt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&zt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&zt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=P[typeof r]&&zt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=zt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=zt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?vt(0,o+n):n)||0,Gt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=zt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var ve=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Q(t,0,_t(vt(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?vt(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:vt(0,e);return Q(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Gt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,Q(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new W;if(e=vt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(vt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),v=g<=0;v?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,g))}return v&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(v=!0,o=t.apply(a,i)),!v||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new W;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Q(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new W;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=zt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new W;var e=Q(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new W;var n=Q(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=ve,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Q(t,0,_t(vt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(Gt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&z(d);return G(i),G(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Q(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=zt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new W;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Q(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return G(s),G(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new W;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Q(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Q(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=vt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=Gt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||G(c.criteria),z(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new W;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Q(t):le(t)},Et.transform=function(t,e,n,i){var r=Gt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,Q(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Gt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Pe,Et.each=me,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Pe,Et.unique=Se,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=Gt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?vt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:zt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=zt(o),h=le(o),d=0,p=n.interpolate||m,g="__p += '",_=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(v,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=N(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?k(e):(k.source=g,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Wt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Q(t,vt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(vt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Y)._=Y:O._=Y:S._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const v=n;g.addEventListener("mouseenter",(function(){v.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",m+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,k=g.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions.add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions,i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions.element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["menu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=Object.create(t).upgradeTo(this)._init(s,{itemClass:e,prefixClass:n,lengthFieldClass:i});return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menu={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menu[t]){if(void 0===KorAP.annotationHelper[t])return;this._menu[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menu[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},g=!1,v=13,_=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===v)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function v(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=v(),0;var i=s(n,E);if(i)return A+=v(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=v();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,P=0;E.t.lastIndex=P,T=E.t.exec(n);)L=y(n.substr(P,T.index-P),T[0]),P=T.index+L;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions.add.apply(this.actions,t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions.add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions.add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions;return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(g.call(this,document.querySelector(".introjs-helperLayer")),g.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),g.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=G(t),s=G(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=G(e).height+10,s=G(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function g(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=G(e.element),i=this._options.helperElementPadding;P(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function v(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),g.call(this,t)}function _(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=z(t.element))!==document.body&&Q(r,t.element),g.call(o,s),g.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),P=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=z(t.element))!==document.body&&Q(r,t.element),g.call(o,A),g.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),P.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),_(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(O),N.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(P),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},_(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},_(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",_(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),N.appendChild(I),h.call(o,t.element,N,P,q),b.call(this,t.scrollTo,t,N)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&v.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function P(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||P(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=G(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");_(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),P(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=G.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),g.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function G(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function z(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function Q(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var W=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return W.instances[A(n,"introjs-instance")]=n,n};return W.version="2.9.3",W.instances={},W.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},W})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions.add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","util"],(function(t,e,n){KorAP.Panel=KorAP.Panel||{};var i={},r={},o={match:[]},s={query:[],result:[]},a={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var a=t.desc,c=r[e]={name:e,desc:a,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let r=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!o[u]&&!s[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions.addToggle(r,{cls:["title"]},t);let o=this.addService({name:e,src:h.template,permissions:h.permissions}),s=i[o];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(o)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(i[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:a});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?i[n].minimize():i[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),o[u]?o[u].push([r,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions.add(r,p,f):s[u].push([r,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=o[t]?o[t]:null!=s[t]?s[t]:[]},clearButtonGroup:function(t){null!=o[t]?o[t]=[]:null!=s[t]&&(s[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<a.length;t++)a[t]++>=100&&(a[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let r=e.create(t);return i[n]=r,a[n]=100,this.element().appendChild(r.load()),n},addWidget:function(e,n){let r=this._getServiceID();n.id=r;var o=t.create(n);return i[r]=o,a[r]=100,o._mgr=this,e.add(o),r},service:function(t){return i[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let r=i[n];if(r){if(a[n]--<0)return KorAP.log(0,"Suspicious action by service",r.src),this._closeService(r.id),void r.close();switch(e.action){case"resize":r.isWidget&&r.resize(e);break;case"log":KorAP.log(e.code,e.msg,r.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var o;(o=t.getElementById("q-field"))&&(n.q=o.value),(o=t.getElementById("ql-field"))&&(n.ql=o.value),(o=KorAP.vc)&&(n.cq=o.toQuery())}else if("QueryParam"==e.key){var s=new URLSearchParams(window.location.search);let t=e.value={};t.q=s.get("q"),t.ql=s.get("ql"),t.cq=s.get("cq")}}e._id&&r.sendMsg(e)}},_closeService:function(t){delete a[t],i[t]&&i[t]._closeIframe&&(i[t]._closeIframe(),delete i[t]),0==Object.keys(a).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(a={},Object.keys(i).forEach(t=>i[t].close()),i={},Object.keys(o).forEach(t=>o[t]=[]),Object.keys(s).forEach(t=>s[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const g=m.getElementById("koralQuery");let v;null!==g&&(KorAP.koralQuery=JSON.parse(g.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(v=document.getElementById("link-guided-tour"))&&(v.setAttribute("href","#"),v.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},g=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var v=m.getElementById("cq"),_=KorAP.vc;if(v){if(v.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{_.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(_.getName()),_.wasRewritten()&&o.classList.add("rewritten"),v.parentNode.insertBefore(r,v)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===this._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}),this);var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(g);if(null!=k){k.appendChild(A.actions.element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){_.onMinimize=function(){r.classList.remove("active"),delete g.vc},_.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),g.vc=!0};var C=function(){_.isOpen()?_.minimize():_.open()};r.onclick=C,g.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",g),void 0!==_?(v.value=_.toQuery(),""==v.value&&v.removeAttribute("name")):(v.removeAttribute("value"),v.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),P=m.getElementById("searchform"),N=m.getElementById("vc-view");let S;if(P&&N&&(P.insertBefore(L.element(),N),KorAP.Panel.query=L),S=m.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.41.5-en.js.map b/public/js/kalamar-0.41.5-en.js.map
new file mode 100644
index 0000000..0f8bf66
--- /dev/null
+++ b/public/js/kalamar-0.41.5-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.41.5-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n     removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      while (liElements.length>0){\r\n        this._el.removeChild(liElements[0]);\r\n      };\r\n     },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.0-de.js b/public/js/kalamar-0.43.0-de.js
new file mode 100644
index 0000000..0d236ed
--- /dev/null
+++ b/public/js/kalamar-0.43.0-de.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function v(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),v=u.map,_=v&&v["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||_)&&v){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=v[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&_&&_[i]&&(c=_[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function _(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function g(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=v(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return v(t,i)})):v(t,s):(o=(r=b(t=v(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return _(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,v,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),v=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,_(i,!0),g(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&v||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),window.KorAP=window.KorAP||{},KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._notItemElements=3,s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},append:function(t){const e=this;t._menu=e,e._list=void 0,e.removeItems(),e._items.push(t),e._lengthField.add([t.content().data]),e._slider.length(e.liveLength()).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(var e=0;t.length>e;)t[e].parentNode===this._el?this._el.removeChild(t[e]):e++},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[this._notItemElements]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[this._notItemElements])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),this._left=!1,this._below=!1,this._outside=!1,i},openAt:function(t,e,n){this._left=!!t,this._below=!!e,this._outside=!!n},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},add:function(t,e,n){let i=this;const r=this.itemClass().create([t,t,function(t){let e=i._bind||this;e.button=r,n.apply(e)}]);return this.append(r),r},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect(),n=this._el.style;let i=window.pageXOffset,r=0;n.right="auto",n.bottom="auto",i+=e.left,this._left&&(i+=e.width-this._el.clientWidth),this._below?(r+=e.bottom,this._outside||(r-=e.height)):(r-=this._el.clientHeight,this._outside?r+=e.top:r+=e.bottom),n.left=i+"px",n.top=r+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},adopt:function(t){const e=Object.create(this);return e._el=t,e},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&(n.add.apply(n,t),t.forEach(t=>{switch(t){case"open-menu-below":this._omBelow=!0;break;case"open-menu-outside":this._omOutside=!0;break;case"open-menu-left":this._omLeft=!0}})),n.add("button-group"),this._el=e,this},element:function(){return this._el},anchor:function(t){return t.parentNode==this._el&&(this._anchor=t,!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},_insert:function(t="span"){const e=document.createElement(t);return this._anchor?(this._el.insertBefore(e,this._anchor),e):this._el.appendChild(e)},add:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return o.openAt(!!this._omLeft,!!this._omBelow,!!this._omOutside),this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n._actions=t.create(i).bind(this),n.prepend=!1,n._actions.panel=n,n},actions:function(){return this._actions},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions().element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this._actions=t.create(i).bind(this),this._actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this._actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions().element()),this._el=t},actions:function(){return this._actions},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions().add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lskip="Abbrechen",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welc="<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> <p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>",t.TOUR_sear1="Eingabe der Suchanfrage, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnot="Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1="Öffnen des Korpusassistenten",t.TOUR_vccho2="Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.",t.TOUR_vcStat1="Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.",t.TOUR_vcStat2="Korpusstatistik",t.TOUR_qlfield="Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.",t.TOUR_glimpse="Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.",t.TOUR_help="Hilfe zu KorAP",t.TOUR_seargo="Suchanfrage starten",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),v=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new v({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},g,x(n,_),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var _=["nodesep","edgesep","ranksep","marginx","marginy"],g={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var v=o(t,a);v<l&&(m=0,c=i.cloneDeep(a),l=v)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var v=s(m,c);if(h&&(v.vs=i.flatten([h,v.vs,d],!0),e.predecessors(h).length)){var _=e.node(e.predecessors(h)[0]),g=e.node(e.predecessors(d)[0]);i.has(v,"barycenter")||(v.barycenter=0,v.weight=0),v.barycenter=(v.barycenter*v.weight+_.order+g.order)/(v.weight+2),v.weight+=2}return v}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)_(n,t,e,v(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function v(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===g(t,t.node(e.v),l)&&u!==g(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function _(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function g(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=v,u.exchangeEdges=_},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,v=/\bthis\b/,_=/['\n\r\t\u2028\u2029\\]/g,g=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},S={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},N=P[typeof window]&&window||this,O=P[typeof n]&&n&&!n.nodeType&&n,R=P[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===O&&O,j=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function B(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function D(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+S[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function z(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(N=j);var Q=function t(e){var n=(e=e?Q.defaults(N.Object(),e,Q.pick(N,g)):N).Array,i=e.Boolean,r=e.Date,S=e.Function,O=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Y=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=S.prototype.toString,ot=Bt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Bt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Bt(dt=I.create)&&dt,ft=Bt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,vt=Bt(vt=I.keys)&&vt,_t=O.max,gt=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!zt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=S,wt[A]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Dt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=zt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(z(i),z(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=v.test(r),Dt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Dt(d,t),d}function St(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=D(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function Nt(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(zt(a)||Vt(a))){e||(a=Nt(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var v=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,v=e.length,(s=v==m)||i)for(;v--;){var _=m,g=e[v];if(i)for(;_--&&!(s=Ot(t[_],g,n,i,r,o)););else if(!(s=Ot(t[v],g,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return v++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--v>-1}));return r.pop(),o.pop(),p&&(z(r),z(o)),s}function Rt(t,e,n,i,r){(zt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=zt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?zt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=D(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(z(c.array),G(c)):n&&z(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Y;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Pt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Le?K:t;return t}function Bt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Bt(e.WinRTError)&&v.test(t),At.funcNames="string"==typeof S.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Dt=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Qt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var zt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=vt?function(t){return oe(t)?vt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Qt=ie(Wt),Yt=j("("+Gt(Qt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=P[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Bt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?_t(0,o+n):n)||0,zt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ve(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var _e=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),ge=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ve(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,gt(_t(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?_t(0,i+n):n||0}else if(n){var r=Se(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:_t(0,e);return W(t,i)}function Se(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Ne(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||zt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Y;if(e=_t(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(_t(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(Be()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=Be(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=Be(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=Be(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var v=h-(s-u),_=v<=0;_?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,v))}return _&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(_=!0,o=t.apply(a,i)),!_||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,Be=Bt(Be=r.now)&&Be||function(){return(new r).getTime()},De=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Y;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=Nt(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?Nt(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Y;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Y;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Y;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return St(t,Nt(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),Nt(t,e)},Et.forEach=me,Et.forEachRight=ve,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=_e,Et.indexBy=ge,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,gt(_t(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(zt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&D(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return z(i),z(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Y;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return z(s),z(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&zt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=St(r,Nt(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Y;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=Nt(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=_t(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=zt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(B);s--;){var c=a[s];a[s]=c.value,o||z(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Y;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=zt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(Nt(arguments,!0,!0))},Et.uniq=Ne,Et.values=le,Et.where=Ce,Et.without=function(t){return St(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(zt(n)||Vt(n))var i=i?jt(St(i,n).concat(St(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Re,Et.collect=ye,Et.drop=Pe,Et.each=me,Et.eachRight=ve,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Pe,Et.unique=Ne,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ve(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=zt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?_t(0,i+n):gt(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=Be,Et.parseInt=De,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return gt(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=xe,Et.sortedIndex=Se,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||m,v="__p += '",g=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(g,(function(e,n,i,o,s,a){return i||(i=o),v+=t.slice(d,a).replace(_,F),n&&(v+="' +\n__e("+n+") +\n'"),s&&(r=!0,v+="';\n"+s+";\n__p += '"),i&&(v+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),v+="';\n";var b=n.variable,w=b;w||(v="with ("+(b="obj")+") {\n"+v+"\n}\n"),v=(r?v.replace(a,""):v).replace(c,"$1").replace(l,"$1;"),v="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+v+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=S(s,"return "+v+E).apply(void 0,h)}catch(t){throw t.source=v,t}return e?k(e):(k.source=v,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Yt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,_t(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=Ae(t);return i.length=gt(_t(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&R?I?(R.exports=Q)._=Q:O._=Q:N._=Q}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const v=this._c("g");v.setAttribute("class","label"),n._labelsElement.appendChild(v),v.arcRef=c;const _=n;v.addEventListener("mouseenter",(function(){_.inFocus(this)}));const g=v.appendChild(n._c("text"));g.setAttribute("x",d+u),g.setAttribute("y",m+3),g.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);g.appendChild(y);const b=g.getBBox(),w=b.width,E=b.height,k=v.insertBefore(n._c("rect"),g),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions().add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions(),i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions().element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("container/containeritem",{create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),this._el=t},content:function(t){var e;return 1===arguments.length?e=t:(void 0===this.defaultTextValue&&(this.defaultTextValue=""),e=this.defaultTextValue),void 0===this._content?(this._content=document.createTextNode(e),this.element().appendChild(this._content)):this._content.nodeValue=e,this._content},isSelectable:function(){return!0},add:function(t){},clear:function(){},onclick:function(t){},chop:function(){},further:function(t){},menu:function(){return this._menu}}),n("container/container",["container/containeritem"],(function(t){return{create:function(t,e){var n=Object.create(this);return n._init(t,e),n},_init:function(e,n){void 0!==n&&void 0!==n.containerItemClass?this._containerItemClass=n.containerItemClass:this._containerItemClass=t;var i=document.createElement("ul");if(i.style.outline=0,i.setAttribute("tabindex",0),i.classList.add("menu","container"),this._el=i,this._cItemPrefix=void 0,this.items=new Array,void 0!==e)for(let t of e)this.addItem(t);this.position=void 0},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},addItem:function(t){var e=this._containerItemClass.create().upgradeTo(t);return e._menu=this._menu,this.items.push(e),void 0!==this._cItemPrefix&&(this.items.splice(this.items.indexOf(this._cItemPrefix),1),this.items.push(this._cItemPrefix)),this._el.appendChild(e.element()),e.content(),e},addMenu:function(t){this._menu=t,void 0!==this._cItemPrefix&&(this._menu._prefix=this._cItemPrefix);for(let e of this.items)e._menu=t},addPrefix:function(t){t.isSelectable=function(){return this.isSet()},t.content=function(t){};var e=this.addItem(t);this._cItemPrefix=e,e._el.onclick=e.onclick.bind(e),void 0!==this._menu&&(this._menu._prefix=e)},exit:function(){void 0!==this.position&&(this.item().active(!1),this.position=void 0)},element:function(){return this._el},destroy:function(){for(let t of this.items)delete t._menu},active:function(){return void 0!==this.position},item:function(t){return void 0===t?this.items[this.position]:this.items[t]},next:function(){if(void 0!==this.position?(this.item().active(!1),this.position++):this.position=0,this.position>=this.length())return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position++,this.position>=this.length())return this.position=void 0,!0;return this.item().active(!0),!1},prev:function(){if(void 0!==this.position?(this.item().active(!1),this.position=this.position-1):this.position=this.items.length-1,this.position<0)return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position--,this.position<0)return this.position=void 0,!0;return this.item().active(!0),!1},further:function(){const t=this.item();void 0!==t.further&&t.further.bind(t).apply()},enter:function(t){this.item().onclick(t)},chop:function(){for(let t of this.items)t.chop()},add:function(t){for(let e of this.items)e.add(t)},length:function(){return this.items.length},liveLength:function(){var t=0;for(let e of this.items)e.isSelectable()&&t++;return t}}})),n("containermenu",["menu","container/container","util"],(function(t,e){return{create:function(n,i,r){const o=t.create(n,i).upgradeTo(this)._init(n,i);return o._el.classList.add("containermenu"),void 0!==i&&void 0!==i.containerClass?o._container=i.containerClass.create(r,i):o._container=e.create(r,i),o.container().addMenu(o),o._el.appendChild(o.container().element()),o._el.removeChild(o._prefix.element()),o.container().addPrefix(o._prefix),o},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu,t.container().destroy(),delete t.container()._menu},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e.container().active()){e.container().further(),t.halt();break}const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e.container().active()?e.container().enter(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e.container().chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this.container().add(String.fromCharCode(h(t))),this.show())},show:function(t){const e=this;if(e._unmark(),e.removeItems(),e.container().exit(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"),this.container()._el.classList.remove("visible"))},next:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.next()&&e.next())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position++;let i=t.liveItem(t.position);void 0===i?(t.position=-1,0!==n?t.container().next()&&(t.position=0,t._showItems(0),i=t.liveItem(0)):(t.position=0,t._showItems(0),i=t.liveItem(0))):t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position),void 0!==i&&i.active(!0)},prev:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.prev()&&e.prev())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position--;let i=t.liveItem(t.position);if(void 0===i){t.position=-1;let e=t.liveLength()-t.limit();e=e<0?0:e,0!==n?t.container().prev()?(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e)):t.offset=e:(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e))}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);void 0!==i&&i.active(!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},container:function(){return this._container}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["containermenu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=t.create(s,{itemClass:e,prefixClass:n,lengthFieldClass:i}).upgradeTo(this);return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menuCollection={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menuCollection[t]){if(void 0===KorAP.annotationHelper[t])return;this._menuCollection[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menuCollection[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},v=!1,_=13,g=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",v=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){v.hide(),v.unbind(r.body,"keyup",l),v.unbind(o,"focus",u),h&&v.unbind(i,"click",e),f&&v.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===_)&&e(t),n===g&&f&&a(t)},u=function(t){p?d.focus():!f||v.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),v||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(v=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(v=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;v=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function v(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function _(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),v(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=v(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function g(t,n){var i=t.cN?v(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=_(),0;var i=s(n,E);if(i)return A+=_(),g(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=_();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&g(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=v(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,P=0;E.t.lastIndex=P,T=E.t.exec(n);)L=y(n.substr(P,T.index-P),T[0]),P=T.index+L;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?v[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[v[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},v={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){v[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions().add.apply(this.actions(),t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions().add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions().add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions();return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,N.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(v.call(this,document.querySelector(".introjs-helperLayer")),v.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),v.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return I.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=z(t),s=z(e),c=S(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=S(),o=z(e).height+10,s=z(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function v(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=z(e.element),i=this._options.helperElementPadding;P(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function _(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),v.call(this,t)}function g(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=G(t.element))!==document.body&&W(r,t.element),v.call(o,s),v.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Q.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Q.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),P=document.createElement("div"),S=document.createElement("div"),N=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div"),I=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=G(t.element))!==document.body&&W(r,t.element),v.call(o,A),v.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),P.className="introjs-arrow",N.className="introjs-tooltiptext",N.innerHTML=t.intro,O.className="introjs-bullets",!1===this._options.showBullets&&(O.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),g(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),O.appendChild(j),R.className="introjs-progress",!1===this._options.showProgress&&(R.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Q.call(this)),M.style.cssText="width:"+Q.call(this)+"%;",R.appendChild(M),I.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(I.style.display="none"),S.className="introjs-tooltip",S.appendChild(N),S.appendChild(O),S.appendChild(R);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),S.appendChild(P),x.appendChild(S),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},g(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},g(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",g(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},I.appendChild(i),this._introItems.length>1&&(I.appendChild(n),I.appendChild(e)),S.appendChild(I),h.call(o,t.element,S,P,q),b.call(this,t.scrollTo,t,S)}var U=o._targetElement.querySelector(".introjs-disableInteraction");U&&U.parentNode.removeChild(U),t.disableInteraction&&_.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=S().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function P(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||P(e))}function S(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function N(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=z(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function O(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function R(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",O,this,!1),x.on(window,"resize",I,this,!0)}function I(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];O.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){U.call(this,t.getAttribute("data-step"))}.bind(this)):R.call(this,this._targetElement)}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function B(){E(j(".introjs-hint"),function(t){D.call(this,t.getAttribute("data-step"))}.bind(this))}function D(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");g(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),P(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=z.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=O.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),v.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function z(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function G(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function W(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Q(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var Y=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return Y.instances[A(n,"introjs-instance")]=n,n};return Y.version="2.9.3",Y.instances={},Y.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return R.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return U.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return B.call(this),this},removeHint:function(t){return D.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},Y})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions().add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("pageInfo",[],(function(){return{create:function(){const t=Object.create(this),e=document.getElementById("pagination");return t.ds=e?e.dataset:{},t},page:function(){return parseInt(this.ds.page||0)},total:function(){return parseInt(this.ds.total||0)},count:function(){return parseInt(this.ds.count||0)}}})),n("plugin/server",["plugin/widget","plugin/service","state","pageInfo","util"],(function(t,e,n,i){KorAP.Panel=KorAP.Panel||{};var r={},o={},s={match:[]},a={query:[],result:[]},c={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var i=t.desc,c=o[e]={name:e,desc:i,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let o=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!s[u]&&!a[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions().addToggle(o,{cls:["title"]},t);let i=this.addService({name:e,src:h.template,permissions:h.permissions}),s=r[i];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(i)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(r[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:i});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?r[n].minimize():r[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),s[u]?s[u].push([o,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions().add(o,p,f):a[u].push([o,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=s[t]?s[t]:null!=a[t]?a[t]:[]},clearButtonGroup:function(t){null!=s[t]?s[t]=[]:null!=a[t]&&(a[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<c.length;t++)c[t]++>=100&&(c[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let i=e.create(t);return r[n]=i,c[n]=100,this.element().appendChild(i.load()),n},addWidget:function(e,n){let i=this._getServiceID();n.id=i;var o=t.create(n);return r[i]=o,c[i]=100,o._mgr=this,e.add(o),i},service:function(t){return r[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let o=r[n];if(o){if(c[n]--<0)return KorAP.log(0,"Suspicious action by service",o.src),this._closeService(o.id),void o.close();switch(e.action){case"resize":o.isWidget&&o.resize(e);break;case"log":KorAP.log(e.code,e.msg,o.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var s;(s=t.getElementById("q-field"))&&(n.q=s.value),(s=t.getElementById("ql-field"))&&(n.ql=s.value),(s=KorAP.vc)&&(n.cq=s.toQuery())}else if("QueryParam"==e.key){var a=new URLSearchParams(window.location.search);let t=e.value={};t.param=a,t.q=a.get("q"),t.ql=a.get("ql"),t.cq=a.get("cq")}else if("Pagination"==e.key){const t=i.create();let n=e.value={};n.page=t.page(),n.total=t.total(),n.count=t.count()}e._id&&o.sendMsg(e);break;case"redirect":const t=new URL(window.location);e.queryParam&&(t.search=new URLSearchParams(e.queryParam)),window.location=t.toString()}}},_closeService:function(t){delete c[t],r[t]&&r[t]._closeIframe&&(r[t]._closeIframe(),delete r[t]),0==Object.keys(c).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(c={},Object.keys(r).forEach(t=>r[t].close()),r={},Object.keys(s).forEach(t=>s[t]=[]),Object.keys(a).forEach(t=>a[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const v=m.getElementById("koralQuery");let _;null!==v&&(KorAP.koralQuery=JSON.parse(v.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(_=document.getElementById("link-guided-tour"))&&(_.setAttribute("href","#"),_.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},v=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var _=m.getElementById("cq"),g=KorAP.vc;if(_){if(_.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{g.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(g.getName()),g.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===e._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}));var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(v);if(null!=k){k.appendChild(A.actions().element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){g.onMinimize=function(){r.classList.remove("active"),delete v.vc},g.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),v.vc=!0};var C=function(){g.isOpen()?g.minimize():g.open()};r.onclick=C,v.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",v),void 0!==g?(_.value=g.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),P=m.getElementById("searchform"),S=m.getElementById("vc-view");let N;if(P&&S&&(P.insertBefore(L.element(),S),KorAP.Panel.query=L),function(t){const e=t.querySelectorAll("input.copy-to-clipboard");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("copy-to-clipboard"),i.addEventListener("click",(function(){let t=!1;"password"===n.getAttribute("type")&&(n.setAttribute("type","text"),t=!0),n.select(),n.setSelectionRange(0,99999),document.execCommand("copy"),t&&n.setAttribute("type","password")})),n.parentNode.insertBefore(i,n.nextSibling)}}(m),function(t){const e=t.querySelectorAll("input[type=password].show-pwd");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("show-pwd"),i.addEventListener("click",(function(){if("password"===n.getAttribute("type"))return n.setAttribute("type","text"),void i.classList.add("hide");n.setAttribute("type","password"),i.classList.remove("hide")})),n.parentNode.insertBefore(i,n.nextSibling)}}(m),N=m.getElementById("kalamar-plugins")){let t=N.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.0-de.js.map b/public/js/kalamar-0.43.0-de.js.map
new file mode 100644
index 0000000..6bf3a73
--- /dev/null
+++ b/public/js/kalamar-0.43.0-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.43.0-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","cItem","addMenu","addPrefix","prefItem","exit","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","ds","dataset","total","count","widgetClass","stateClass","pageInfoClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","pi","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\nwindow.KorAP = window.KorAP || {};\r\n\r\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined) {\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    }\r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array(); //all childNodes, i.e. ItemClass, prefixClass\r\n\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined; //filtered List containing all itemClass items\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n\r\n    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      //Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n    removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      //Upon Change please update alwaysmenu.js prev\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[this._notItemElements]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\n// TODO:\r\n//   Add addToggle() method\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the list of items and the itemClass.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\tthis.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\r\n     */\r\n    panel : function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n\r\n      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\r\n    },\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\r\n    },\r\n\r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\r\n    },\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\r\n    },\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t._actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions().element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this._actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this._actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions().element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \r\n  \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n     * \r\n     * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n     * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n     * @returns The container object\r\n     */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container, 0 to length-1 = in container\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\r\n\r\n\r\n    },\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n    * @param {Object} An object with properties.\r\n    */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Exit the container unconditionally. Required so that active returns the\r\n     * correct result. Called when the prefix or similar resets the currently visual\r\n     * field.\r\n     */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n     * @returns whether an item within the container is active (by checking this.position)\r\n     */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n     * Getter for items\r\n     * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n     * @returns item at location index\r\n     */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n     * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n     * \r\n     * @returns The number of items that are selectable. Is the actual length of the list.\r\n     */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //there are only two new lines, marked with NEW\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n      t.container().exit(); //NEW\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._el.classList.add('visible');\r\n\r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n      t.container()._el.classList.add('visible'); //NEW\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () { //only one new line\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\r\n        };\r\n      }// The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        }\r\n      }\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n    \r\n    /**\r\n    * Upgrade this object to another object,\r\n    * while private data stays intact.\r\n    *\r\n    * @param {Object} An object with properties.\r\n    */\r\n   upgradeTo : function (props) {\r\n     for (var prop in props) {\r\n       this[prop] = props[prop];\r\n     };\r\n     return this;\r\n   },\r\n\r\n    /**\r\n     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\r\n\r\n\r\n  };\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menuCollection   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menuCollection[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menuCollection[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menuCollection[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions().add.apply(this.actions(), i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions().add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions().add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions();\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions().add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions().add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to a plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions().addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\r\n      \r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from form\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"param\"] = p; // readonly\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        }\r\n\r\n        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\r\n        };\r\n\r\n        // data needs to be mirrored\r\n        if (d._id) {\r\n          service.sendMsg(d);\r\n        };\r\n\r\n        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (e._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    });\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions().element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n\r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.0-en.js b/public/js/kalamar-0.43.0-en.js
new file mode 100644
index 0000000..db06a62
--- /dev/null
+++ b/public/js/kalamar-0.43.0-en.js
@@ -0,0 +1,12 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function m(t,e){return d.call(t,e)}function v(t,e){var n,i,r,o,s,a,c,l,h,d,f,m=e&&e.split("/"),v=u.map,_=v&&v["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&m&&(t=m.slice(0,m.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((m||_)&&v){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),m)for(d=m.length;d>0;d-=1)if((r=v[m.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&_&&_[i]&&(c=_[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function _(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function g(t){return function(e){c[t]=e}}function y(t){if(m(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!m(c,t)&&!m(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=v(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return v(t,i)})):v(t,s):(o=(r=b(t=v(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return _(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,v,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),v=!0;else if("module"===o)r=b[f]=a.module(t);else if(m(c,o)||m(l,o)||m(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,_(i,!0),g(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&v||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),m(c,t)||m(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),window.KorAP=window.KorAP||{},KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._notItemElements=3,s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},append:function(t){const e=this;t._menu=e,e._list=void 0,e.removeItems(),e._items.push(t),e._lengthField.add([t.content().data]),e._slider.length(e.liveLength()).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(var e=0;t.length>e;)t[e].parentNode===this._el?this._el.removeChild(t[e]):e++},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[this._notItemElements]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[this._notItemElements])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),this._left=!1,this._below=!1,this._outside=!1,i},openAt:function(t,e,n){this._left=!!t,this._below=!!e,this._outside=!!n},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},add:function(t,e,n){let i=this;const r=this.itemClass().create([t,t,function(t){let e=i._bind||this;e.button=r,n.apply(e)}]);return this.append(r),r},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect(),n=this._el.style;let i=window.pageXOffset,r=0;n.right="auto",n.bottom="auto",i+=e.left,this._left&&(i+=e.width-this._el.clientWidth),this._below?(r+=e.bottom,this._outside||(r-=e.height)):(r-=this._el.clientHeight,this._outside?r+=e.top:r+=e.bottom),n.left=i+"px",n.top=r+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},adopt:function(t){const e=Object.create(this);return e._el=t,e},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&(n.add.apply(n,t),t.forEach(t=>{switch(t){case"open-menu-below":this._omBelow=!0;break;case"open-menu-outside":this._omOutside=!0;break;case"open-menu-left":this._omLeft=!0}})),n.add("button-group"),this._el=e,this},element:function(){return this._el},anchor:function(t){return t.parentNode==this._el&&(this._anchor=t,!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},_insert:function(t="span"){const e=document.createElement(t);return this._anchor?(this._el.insertBefore(e,this._anchor),e):this._el.appendChild(e)},add:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);return o.openAt(!!this._omLeft,!!this._omBelow,!!this._omOutside),this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()})),o},addToggle:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n._actions=t.create(i).bind(this),n.prepend=!1,n._actions.panel=n,n},actions:function(){return this._actions},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions().element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this._actions=t.create(i).bind(this),this._actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this._actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions().element()),this._el=t},actions:function(){return this._actions},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions().add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("[ .'\\\\|&]");function n(t){return null!=t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),m=t("./util"),v=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?m.time:m.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new v({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},g,x(n,_),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(x(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},k,x(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(m.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};m.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=m.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){m.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(m.intersectRect(o,n)),r.points.push(m.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var _=["nodesep","edgesep","ranksep","marginx","marginy"],g={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function x(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,m=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:m,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,m=0;m<4;++p,++m){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var v=o(t,a);v<l&&(m=0,c=i.cloneDeep(a),l=v)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var m=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(m,f);var v=s(m,c);if(h&&(v.vs=i.flatten([h,v.vs,d],!0),e.predecessors(h).length)){var _=e.node(e.predecessors(h)[0]),g=e.node(e.predecessors(d)[0]);i.has(v,"barycenter")||(v.barycenter=0,v.weight=0),v.barycenter=(v.barycenter*v.weight+_.order+g.order)/(v.weight+2),v.weight+=2}return v}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-m(t,n)/2}));return i.max(e,(function(e,n){return e+m(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function m(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=m(n);)_(n,t,e,v(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function m(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function v(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===g(t,t.node(e.v),l)&&u!==g(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function _(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function g(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=m,u.enterEdge=v,u.exchangeEdges=_},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),m=/($^)/,v=/\bthis\b/,_=/['\n\r\t\u2028\u2029\\]/g,g=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",k="[object Date]",A="[object Object]",x="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[k]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[x]=!0;var T={leading:!1,maxWait:0,trailing:!1},L={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},N={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},S=P[typeof window]&&window||this,I=P[typeof n]&&n&&!n.nodeType&&n,O=P[typeof e]&&e&&!e.nodeType&&e,R=O&&O.exports===I&&I,j=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function D(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function U(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+N[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function G(t){t.length=0,i.length<40&&i.push(t)}function z(t){var e=t.cache;e&&z(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Q(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(S=j);var Y=function t(e){var n=(e=e?Y.defaults(S.Object(),e,Y.pick(S,g)):S).Array,i=e.Boolean,r=e.Date,N=e.Function,I=e.Math,O=e.Number,R=e.Object,j=e.RegExp,q=e.String,W=e.TypeError,$=[],J=R.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=I.ceil,nt=e.clearTimeout,it=I.floor,rt=N.prototype.toString,ot=Dt(ot=R.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Dt(e=R.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Dt(dt=R.create)&&dt,ft=Dt(ft=n.isArray)&&ft,pt=e.isFinite,mt=e.isNaN,vt=Dt(vt=R.keys)&&vt,_t=I.max,gt=I.min,yt=e.parseInt,bt=I.random,wt={};function Et(t){return t&&"object"==typeof t&&!Gt(t)&&st.call(t,"__wrapped__")?t:new kt(t)}function kt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[k]=r,wt["[object Function]"]=N,wt[A]=R,wt["[object Number]"]=O,wt["[object RegExp]"]=j,wt[x]=q,kt.prototype=Et.prototype;var At=Et.support={};function xt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Q(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Ut(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case k:return new a(+t);case"[object Number]":case x:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Gt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Q(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?me:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(G(i),G(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Lt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=v.test(r),Ut(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Re(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Q(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Q(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Ut(d,t),d}function Nt(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=U(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&z(e),s}function St(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Gt(a)||Vt(a))){e||(a=St(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function It(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case k:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case x:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return It(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var m=r.length;m--;)if(r[m]==t)return o[m]==e;var v=0;if(s=!0,r.push(t),o.push(e),l){if(m=t.length,v=e.length,(s=v==m)||i)for(;v--;){var _=m,g=e[v];if(i)for(;_--&&!(s=It(t[_],g,n,i,r,o)););else if(!(s=It(t[v],g,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return v++,s=st.call(t,a)&&It(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--v>-1}));return r.pop(),o.pop(),p&&(G(r),G(o)),s}function Ot(t,e,n,i,r){(Gt(e)?me:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Gt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Gt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Ot(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function Rt(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=U(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(G(c.array),z(c)):n&&G(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new W;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Q(u))[2]&&(u[2]=Q(u[2])),u[3]&&(u[3]=Q(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?xt:Pt)([t,e,n,i,r,o])}function qt(t){return Qt[t]}function Bt(){var t=(t=Et.indexOf)===Le?K:t;return t}function Dt(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Dt(e.WinRTError)&&v.test(t),At.funcNames="string"==typeof N.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Ut=ht?function(t,e){L.value=e,ht(t,"__bindData__",L)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var Gt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},zt=vt?function(t){return oe(t)?vt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Qt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Qt),Wt=j("("+zt(Yt).join("|")+")","g"),$t=j("["+zt(Qt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Lt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&zt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&zt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:Lt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:Lt(e,n,3);for(var s=-1,a=P[typeof r]&&zt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=zt(t),r=i.length;for(e=Lt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=zt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=A)return!1;var e=t.valueOf,n=Dt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==x||!1}function le(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?_t(0,o+n):n)||0,Gt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function me(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ve(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Lt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=zt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var _e=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),ge=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function ke(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ve(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return me(t,(function(t){var n=Rt(0,++e);r[e]=r[n],r[n]=t})),r}function xe(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Q(t,0,gt(_t(0,i),r))}function Le(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?_t(0,i+n):n||0}else if(n){var r=Ne(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:_t(0,e);return Q(t,i)}function Ne(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Se(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Ie(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Oe(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Gt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Re(t,e){return arguments.length>2?Mt(t,17,Q(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new W;if(e=_t(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(_t(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(De()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},m=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=De(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=De(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var v=h-(s-u),_=v<=0;_?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(m,v))}return _&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(_=!0,o=t.apply(a,i)),!_||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=kt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);me(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,De=Dt(De=r.now)&&De||function(){return(new r).getTime()},Ue=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new W;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=St(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Re,Et.bindAll=function(t){for(var e=arguments.length>1?St(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Q(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new kt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new W;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Lt(t,e,n);if("object"!=i)return Fe(t);var r=zt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=It(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new W;var e=Q(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new W;var n=Q(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Nt(t,St(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),St(t,e)},Et.forEach=me,Et.forEachRight=ve,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Lt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=_e,Et.indexBy=ge,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Q(t,0,gt(_t(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(Gt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&U(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&z(d);return G(i),G(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Q(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return me(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=zt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new W;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Lt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Q(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Ot(t,r[o],i,s,a);return G(s),G(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),me(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Nt(r,St(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new W;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Q(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Q(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=St(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=_t(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=Gt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),me(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(D);s--;){var c=a[s];a[s]=c.value,o||G(c.criteria),z(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new W;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Lt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Q(t):le(t)},Et.transform=function(t,e,n,i){var r=Gt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?me:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(St(arguments,!0,!0))},Et.uniq=Se,Et.values=le,Et.where=Ce,Et.without=function(t){return Nt(t,Q(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Gt(n)||Vt(n))var i=i?jt(Nt(i,n).concat(Nt(n,i))):n}return i||[]},Et.zip=Ie,Et.zipObject=Oe,Et.collect=ye,Et.drop=Pe,Et.each=me,Et.eachRight=ve,Et.extend=Jt,Et.methods=ne,Et.object=Oe,Et.select=fe,Et.tail=Pe,Et.unique=Se,Et.unzip=Ie,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Lt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Lt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ve(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Le,Et.isArguments=Vt,Et.isArray=Gt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==k||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==x||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return It(t,e,"function"==typeof n&&Lt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!mt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?_t(0,i+n):gt(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=De,Et.parseInt=Ue,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return gt(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return Rt(t,e)},Et.reduce=Ee,Et.reduceRight=ke,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:zt(t).length},Et.some=xe,Et.sortedIndex=Ne,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=zt(o),h=le(o),d=0,p=n.interpolate||m,v="__p += '",g=j((n.escape||m).source+"|"+p.source+"|"+(p===f?u:m).source+"|"+(n.evaluate||m).source+"|$","g");t.replace(g,(function(e,n,i,o,s,a){return i||(i=o),v+=t.slice(d,a).replace(_,F),n&&(v+="' +\n__e("+n+") +\n'"),s&&(r=!0,v+="';\n"+s+";\n__p += '"),i&&(v+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),v+="';\n";var b=n.variable,w=b;w||(v="with ("+(b="obj")+") {\n"+v+"\n}\n"),v=(r?v.replace(a,""):v).replace(c,"$1").replace(l,"$1;"),v="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+v+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var k=N(s,"return "+v+E).apply(void 0,h)}catch(t){throw t.source=v,t}return e?k(e):(k.source=v,k)},Et.unescape=function(t){return null==t?"":q(t).replace(Wt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=xe,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=ke,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Q(t,_t(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[Rt(0,t.length-1)]:void 0;var i=Ae(t);return i.length=gt(_t(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new kt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,me(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new kt(n,t):n}})),me(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),me(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new kt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();I&&O?R?(O.exports=Y)._=Y:I._=Y:S._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let m=((o+f)/2+f)/2;const v=this._c("g");v.setAttribute("class","label"),n._labelsElement.appendChild(v),v.arcRef=c;const _=n;v.addEventListener("mouseenter",(function(){_.inFocus(this)}));const g=v.appendChild(n._c("text"));g.setAttribute("x",d+u),g.setAttribute("y",m+3),g.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);g.appendChild(y);const b=g.getBBox(),w=b.width,E=b.height,k=v.insertBefore(n._c("rect"),g),A=w+2*n.xPadding;k.setAttribute("x",d+u-A/2),k.setAttribute("ry",5),k.setAttribute("y",b.y-n.yPadding),k.setAttribute("width",A),k.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions().add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions(),i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions().element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("container/containeritem",{create:function(){return Object.create(this)},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),this._el=t},content:function(t){var e;return 1===arguments.length?e=t:(void 0===this.defaultTextValue&&(this.defaultTextValue=""),e=this.defaultTextValue),void 0===this._content?(this._content=document.createTextNode(e),this.element().appendChild(this._content)):this._content.nodeValue=e,this._content},isSelectable:function(){return!0},add:function(t){},clear:function(){},onclick:function(t){},chop:function(){},further:function(t){},menu:function(){return this._menu}}),n("container/container",["container/containeritem"],(function(t){return{create:function(t,e){var n=Object.create(this);return n._init(t,e),n},_init:function(e,n){void 0!==n&&void 0!==n.containerItemClass?this._containerItemClass=n.containerItemClass:this._containerItemClass=t;var i=document.createElement("ul");if(i.style.outline=0,i.setAttribute("tabindex",0),i.classList.add("menu","container"),this._el=i,this._cItemPrefix=void 0,this.items=new Array,void 0!==e)for(let t of e)this.addItem(t);this.position=void 0},upgradeTo:function(t){for(let e in t)this[e]=t[e];return this},addItem:function(t){var e=this._containerItemClass.create().upgradeTo(t);return e._menu=this._menu,this.items.push(e),void 0!==this._cItemPrefix&&(this.items.splice(this.items.indexOf(this._cItemPrefix),1),this.items.push(this._cItemPrefix)),this._el.appendChild(e.element()),e.content(),e},addMenu:function(t){this._menu=t,void 0!==this._cItemPrefix&&(this._menu._prefix=this._cItemPrefix);for(let e of this.items)e._menu=t},addPrefix:function(t){t.isSelectable=function(){return this.isSet()},t.content=function(t){};var e=this.addItem(t);this._cItemPrefix=e,e._el.onclick=e.onclick.bind(e),void 0!==this._menu&&(this._menu._prefix=e)},exit:function(){void 0!==this.position&&(this.item().active(!1),this.position=void 0)},element:function(){return this._el},destroy:function(){for(let t of this.items)delete t._menu},active:function(){return void 0!==this.position},item:function(t){return void 0===t?this.items[this.position]:this.items[t]},next:function(){if(void 0!==this.position?(this.item().active(!1),this.position++):this.position=0,this.position>=this.length())return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position++,this.position>=this.length())return this.position=void 0,!0;return this.item().active(!0),!1},prev:function(){if(void 0!==this.position?(this.item().active(!1),this.position=this.position-1):this.position=this.items.length-1,this.position<0)return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position--,this.position<0)return this.position=void 0,!0;return this.item().active(!0),!1},further:function(){const t=this.item();void 0!==t.further&&t.further.bind(t).apply()},enter:function(t){this.item().onclick(t)},chop:function(){for(let t of this.items)t.chop()},add:function(t){for(let e of this.items)e.add(t)},length:function(){return this.items.length},liveLength:function(){var t=0;for(let e of this.items)e.isSelectable()&&t++;return t}}})),n("containermenu",["menu","container/container","util"],(function(t,e){return{create:function(n,i,r){const o=t.create(n,i).upgradeTo(this)._init(n,i);return o._el.classList.add("containermenu"),void 0!==i&&void 0!==i.containerClass?o._container=i.containerClass.create(r,i):o._container=e.create(r,i),o.container().addMenu(o),o._el.appendChild(o.container().element()),o._el.removeChild(o._prefix.element()),o.container().addPrefix(o._prefix),o},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu,t.container().destroy(),delete t.container()._menu},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e.container().active()){e.container().further(),t.halt();break}const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e.container().active()?e.container().enter(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e.container().chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this.container().add(String.fromCharCode(h(t))),this.show())},show:function(t){const e=this;if(e._unmark(),e.removeItems(),e.container().exit(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"),this.container()._el.classList.remove("visible"))},next:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.next()&&e.next())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position++;let i=t.liveItem(t.position);void 0===i?(t.position=-1,0!==n?t.container().next()&&(t.position=0,t._showItems(0),i=t.liveItem(0)):(t.position=0,t._showItems(0),i=t.liveItem(0))):t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position),void 0!==i&&i.active(!0)},prev:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.prev()&&e.prev())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position--;let i=t.liveItem(t.position);if(void 0===i){t.position=-1;let e=t.liveLength()-t.limit();e=e<0?0:e,0!==n?t.container().prev()?(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e)):t.offset=e:(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e))}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);void 0!==i&&i.active(!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},container:function(){return this._container}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["containermenu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=t.create(s,{itemClass:e,prefixClass:n,lengthFieldClass:i}).upgradeTo(this);return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menuCollection={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menuCollection[t]){if(void 0===KorAP.annotationHelper[t])return;this._menuCollection[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menuCollection[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},m={},v=!1,_=13,g=27,y=32,b=[];return m={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,m="",v=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(m=d.value),"function"==typeof t&&(void 0!==d?t(!0,m):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){v.hide(),v.unbind(r.body,"keyup",l),v.unbind(o,"focus",u),h&&v.unbind(i,"click",e),f&&v.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===_)&&e(t),n===g&&f&&a(t)},u=function(t){p?d.focus():!f||v.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=m.message.replace("{{message}}",i),"prompt"===n&&(e+=m.input),e+=m.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(m.buttons.cancel,m.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",m.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),v||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(v=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(v=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;v=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function v(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function _(){return void 0!==E.sL?function(){if(E.sL&&!m[E.sL])return e(x);var t=E.sL?c(E.sL,x,!0,k[E.sL]):l(x);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(k[E.sL]=t.top),v(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(x);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(x);i;){t+=e(x.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=v(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(x)}return t+e(x.substr(n))}()}function g(t,n){var i=t.cN?v(t.cN,"",!0):"";t.rB?(A+=i,x=""):t.eB?(A+=e(n)+i,x=""):(A+=i,x=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(x+=t,void 0===n)return A+=_(),0;var i=s(n,E);if(i)return A+=_(),g(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(x+=n),A+=_();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),x="",r.starts&&g(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return x+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,k={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=v(w.cN,"",!0)+A);var x="",C=0;try{for(var T,L,P=0;E.t.lastIndex=P,T=E.t.exec(n);)L=y(n.substr(P,T.index-P),T[0]),P=T.index+L;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(m);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?v[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return m[t]||m[v[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},m={},v={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=m[e]=n(t);i.aliases&&i.aliases.forEach((function(t){v[t]=e}))},t.listLanguages=function(){return Object.keys(m)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions().add.apply(this.actions(),t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions().add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions().add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions();return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof n&&n.amd)n("lib/intro",[],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}((function(){function t(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,e){var o=t.querySelectorAll("*[data-intro]"),s=[];if(this._options.steps)E(this._options.steps,function(t){var e=r(t);if(e.step=s.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var n=document.querySelector(".introjsFloatingElement");null===n&&((n=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(n)),e.element=n,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&s.push(e)}.bind(this));else{var c;if(o.length<1)return!1;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n>0&&(s[n-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c})}}.bind(this));var l=0;E(o,function(t){if((!e||t.getAttribute("data-intro-group")===e)&&null===t.getAttribute("data-step")){for(;void 0!==s[l];)l++;c=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,s[l]={element:t,intro:t.getAttribute("data-intro"),step:l+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:c}}}.bind(this))}for(var u=[],h=0;h<s.length;h++)s[h]&&u.push(s[h]);return(s=u).sort((function(t,e){return t.step-e.step})),this._introItems=s,S.call(this,t)&&(a.call(this),this._options.keyboardNavigation&&x.on(window,"keydown",i,this,!0),x.on(window,"resize",n,this,!0)),!1}function n(){this.refresh.call(this)}function i(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)c.call(this);else if("ArrowRight"===e||39===e)a.call(this);else if("Enter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?c.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),u.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():a.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else u.call(this,this._targetElement)}function r(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var n in t)void 0!==window.jQuery&&t[n]instanceof window.jQuery?e[n]=t[n]:e[n]=r(t[n]);return e}function o(t){this._currentStep=t-2,void 0!==this._introItems&&a.call(this)}function s(t){this._currentStepNumber=t,void 0!==this._introItems&&a.call(this)}function a(){this._direction="forward",void 0!==this._currentStepNumber&&E(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void u.call(this,this._targetElement)):void y.call(this,t)}function c(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;y.call(this,t)}function l(){if(v.call(this,document.querySelector(".introjs-helperLayer")),v.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),v.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),n=document.querySelector(".introjs-tooltip");h.call(this,this._introItems[this._currentStep].element,n,e,t)}return R.call(this),this}function u(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&E(o,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var s=t.querySelector(".introjs-helperLayer");s&&s.parentNode.removeChild(s);var a=t.querySelector(".introjs-tooltipReferenceLayer");a&&a.parentNode.removeChild(a);var c=t.querySelector(".introjs-disableInteraction");c&&c.parentNode.removeChild(c);var l=document.querySelector(".introjsFloatingElement");l&&l.parentNode.removeChild(l),w(),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),x.off(window,"keydown",i,this,!0),x.off(window,"resize",n,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function h(t,e,n,i,r){var o,s,a,c,l,u="";if(r=r||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",null!=i&&(i.style.top=null,i.style.left=null),this._introItems[this._currentStep])switch(u="string"==typeof(o=this._introItems[this._currentStep]).tooltipClass?o.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+u).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(l=this._introItems[this._currentStep].position)&&(l=p.call(this,t,e,l)),a=G(t),s=G(e),c=N(),C(e,"introjs-"+l),l){case"top-right-aligned":n.className="introjs-arrow bottom-right";var h=0;f(a,h,s,e),e.style.bottom=a.height+20+"px";break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var m=a.width/2-s.width/2;r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.bottom=a.height+20+"px";break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",d(a,r?0:15,s,c,e),e.style.bottom=a.height+20+"px";break;case"right":e.style.left=a.width+20+"px",a.top+s.height>c.height?(n.className="introjs-arrow left-bottom",e.style.top="-"+(s.height-a.height-20)+"px"):n.className="introjs-arrow left";break;case"left":r||!0!==this._options.showStepNumbers||(e.style.top="15px"),a.top+s.height>c.height?(e.style.top="-"+(s.height-a.height-20)+"px",n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right=a.width+20+"px";break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+s.width/2+"px",e.style.marginTop="-"+s.height/2+"px",null!=i&&(i.style.left="-"+(s.width/2+18)+"px",i.style.top="-"+(s.height/2+18)+"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",f(a,h=0,s,e),e.style.top=a.height+20+"px";break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",m=a.width/2-s.width/2,r&&(m+=5),f(a,m,s,e)&&(e.style.right=null,d(a,m,s,c,e)),e.style.top=a.height+20+"px";break;default:n.className="introjs-arrow top",d(a,0,s,c,e),e.style.top=a.height+20+"px"}}function d(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left=i.width-n.width-t.left+"px",!1):(r.style.left=e+"px",!0)}function f(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left=-t.left+"px",!1):(i.style.right=e+"px",!0)}function p(t,e,n){var i=this._options.positionPrecedence.slice(),r=N(),o=G(e).height+10,s=G(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o+o>r.height&&m(i,"bottom"),a.top-o<0&&m(i,"top"),a.right+s>r.width&&m(i,"right"),a.left-s<0&&m(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c="auto"!==n&&i.indexOf(n)>-1?n:i[0]),-1!==["top","bottom"].indexOf(c)&&(c+=function(t,e,n,i){var r=e/2,o=Math.min(n.width,window.screen.width),s=["-left-aligned","-middle-aligned","-right-aligned"],a="";o-t<e&&m(s,"-left-aligned");(t<r||o-t<r)&&m(s,"-middle-aligned");t<e&&m(s,"-right-aligned");a=s.length?-1!==s.indexOf(i)?i:s[0]:"-middle-aligned";return a}(a.left,s,r,h)),c}function m(t,e){t.indexOf(e)>-1&&t.splice(t.indexOf(e),1)}function v(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=G(e.element),i=this._options.helperElementPadding;P(e.element)?C(t,"introjs-fixedTooltip"):T(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),t.style.cssText="width: "+(n.width+i)+"px; height:"+(n.height+i)+"px; top:"+(n.top-i/2)+"px;left: "+(n.left-i/2)+"px;"}}function _(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),v.call(this,t)}function g(t){t.setAttribute("role","button"),t.tabIndex=0}function y(t){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var e,n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),l=document.querySelector(".introjs-tooltipReferenceLayer"),d="introjs-helperLayer";if("string"==typeof t.highlightClass&&(d+=" "+t.highlightClass),"string"==typeof this._options.highlightClass&&(d+=" "+this._options.highlightClass),null!==s){var f=l.querySelector(".introjs-helperNumberLayer"),p=l.querySelector(".introjs-tooltiptext"),m=l.querySelector(".introjs-arrow"),y=l.querySelector(".introjs-tooltip");if(i=l.querySelector(".introjs-skipbutton"),n=l.querySelector(".introjs-prevbutton"),e=l.querySelector(".introjs-nextbutton"),s.className=d,y.style.opacity=0,y.style.display="none",null!==f){var k=this._introItems[t.step-2>=0?t.step-2:0];(null!==k&&"forward"===this._direction&&"floating"===k.position||"backward"===this._direction&&"floating"===t.position)&&(f.style.opacity=0)}(r=z(t.element))!==document.body&&Q(r,t.element),v.call(o,s),v.call(o,l),E(document.querySelectorAll(".introjs-fixParent"),(function(t){T(t,/introjs-fixParent/g)})),w(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==f&&(f.innerHTML=t.step),p.innerHTML=t.intro,y.style.display="block",h.call(o,t.element,y,m,f),o._options.showBullets&&(l.querySelector(".introjs-bullets li > a.active").className="",l.querySelector('.introjs-bullets li > a[data-stepnumber="'+t.step+'"]').className="active"),l.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+Y.call(o)+"%;",l.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",Y.call(o)),y.style.opacity=1,f&&(f.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=e&&e.focus(),b.call(o,t.scrollTo,t,p)}),350)}else{var A=document.createElement("div"),x=document.createElement("div"),P=document.createElement("div"),N=document.createElement("div"),S=document.createElement("div"),I=document.createElement("div"),O=document.createElement("div"),R=document.createElement("div");A.className=d,x.className="introjs-tooltipReferenceLayer",(r=z(t.element))!==document.body&&Q(r,t.element),v.call(o,A),v.call(o,x),this._targetElement.appendChild(A),this._targetElement.appendChild(x),P.className="introjs-arrow",S.className="introjs-tooltiptext",S.innerHTML=t.intro,I.className="introjs-bullets",!1===this._options.showBullets&&(I.style.display="none");var j=document.createElement("ul");j.setAttribute("role","tablist");var K=function(){o.goToStep(this.getAttribute("data-stepnumber"))};E(this._introItems,(function(e,n){var i=document.createElement("li"),r=document.createElement("a");i.setAttribute("role","presentation"),r.setAttribute("role","tab"),r.onclick=K,n===t.step-1&&(r.className="active"),g(r),r.innerHTML="&nbsp;",r.setAttribute("data-stepnumber",e.step),i.appendChild(r),j.appendChild(i)})),I.appendChild(j),O.className="introjs-progress",!1===this._options.showProgress&&(O.style.display="none");var M=document.createElement("div");M.className="introjs-progressbar",M.setAttribute("role","progress"),M.setAttribute("aria-valuemin",0),M.setAttribute("aria-valuemax",100),M.setAttribute("aria-valuenow",Y.call(this)),M.style.cssText="width:"+Y.call(this)+"%;",O.appendChild(M),R.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(R.style.display="none"),N.className="introjs-tooltip",N.appendChild(S),N.appendChild(I),N.appendChild(O);var q=document.createElement("span");!0===this._options.showStepNumbers&&(q.className="introjs-helperNumberLayer",q.innerHTML=t.step,x.appendChild(q)),N.appendChild(P),x.appendChild(N),(e=document.createElement("a")).onclick=function(){o._introItems.length-1!==o._currentStep&&a.call(o)},g(e),e.innerHTML=this._options.nextLabel,(n=document.createElement("a")).onclick=function(){0!==o._currentStep&&c.call(o)},g(n),n.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",g(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),o._introItems.length-1!==o._currentStep&&"function"==typeof o._introExitCallback&&o._introExitCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),u.call(o,o._targetElement)},R.appendChild(i),this._introItems.length>1&&(R.appendChild(n),R.appendChild(e)),N.appendChild(R),h.call(o,t.element,N,P,q),b.call(this,t.scrollTo,t,N)}var B=o._targetElement.querySelector(".introjs-disableInteraction");B&&B.parentNode.removeChild(B),t.disableInteraction&&_.call(o),0===this._currentStep&&this._introItems.length>1?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=e&&C(e,"introjs-fullbutton")):null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,C(i,"introjs-donebutton")),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=n&&C(n,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=n&&(n.className=this._options.buttonClass+" introjs-prevbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),n.setAttribute("role","button"),e.setAttribute("role","button"),i.setAttribute("role","button"),null!=e&&e.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&C(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;C(t.element,"introjs-showElement");var n=L(t.element,"position");"absolute"!==n&&"relative"!==n&&"fixed"!==n&&C(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var i=L(e,"z-index"),r=parseFloat(L(e,"opacity")),o=L(e,"transform")||L(e,"-webkit-transform")||L(e,"-moz-transform")||L(e,"-ms-transform")||L(e,"-o-transform");(/[0-9]+/.test(i)||r<1||"none"!==o&&void 0!==o)&&C(e,"introjs-fixParent"),e=e.parentNode}}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function b(t,e,n){var i;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():e.element.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(e.element)))){var r=N().height;i.bottom-(i.bottom-i.top)<0||e.element.clientHeight>r?window.scrollBy(0,i.top-(r/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(r/2-i.height/2)+this._options.scrollPadding)}}function w(){E(document.querySelectorAll(".introjs-showElement"),(function(t){T(t,/introjs-[a-zA-Z]+/g)}))}function E(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var k,A=(k={},function(t,e){return k[e=e||"introjs-stamp"]=k[e]||0,void 0===t[e]&&(t[e]=k[e]++),t[e]}),x=new function(){var t="introjs_event";this._id=function(t,e,n,i){return e+A(n)+(i?"_"+A(i):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on"+n,a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on"+n,a),e[t][s]=null)}};function C(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n+" "+e)}else{if(void 0!==t.classList)E(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" "+e)}}function T(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function L(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function P(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===L(t,"position")||P(e))}function N(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function S(t){var e=document.createElement("div"),n="",i=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var r=G(t);r&&(n+="width: "+r.width+"px; height:"+r.height+"px; top:"+r.top+"px;left: "+r.left+"px;",e.style.cssText=n)}else n+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=n;return t.appendChild(e),e.onclick=function(){!0===i._options.exitOnOverlayClick&&u.call(i,t)},window.setTimeout((function(){n+="opacity: "+i._options.overlayOpacity.toString()+";",e.style.cssText=n}),10),!0}function I(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function O(t){if(this._introItems=[],this._options.hints)E(this._options.hints,function(t){var e=r(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;E(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}F.call(this),x.on(document,"click",I,this,!1),x.on(window,"resize",R,this,!0)}function R(){E(this._introItems,function(t){void 0!==t.targetElement&&H.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function j(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function K(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];I.call(this),e&&C(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function M(){E(j(".introjs-hint"),function(t){K.call(this,t.getAttribute("data-step"))}.bind(this))}function q(){var t=j(".introjs-hint");t&&t.length?E(t,function(t){B.call(this,t.getAttribute("data-step"))}.bind(this)):O.call(this,this._targetElement)}function B(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&T(e,/introjs-hidehint/g)}function D(){E(j(".introjs-hint"),function(t){U.call(this,t.getAttribute("data-step"))}.bind(this))}function U(t){var e=j('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function F(){var t=this,e=document.querySelector(".introjs-hints");null===e&&((e=document.createElement("div")).className="introjs-hints");E(this._introItems,function(n,i){if(!document.querySelector('.introjs-hint[data-step="'+i+'"]')){var r=document.createElement("a");g(r),r.onclick=function(e){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),V.call(t,e)}}(i),r.className="introjs-hint",n.hintAnimation||C(r,"introjs-hint-no-anim"),P(n.element)&&C(r,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",r.appendChild(o),r.appendChild(s),r.setAttribute("data-step",i),n.targetElement=n.element,n.element=r,H.call(this,n.hintPosition,r,n.targetElement),e.appendChild(r)}}.bind(this)),document.body.appendChild(e),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function H(t,e,n){var i=G.call(this,n);switch(t){default:case"top-left":e.style.left=i.left+"px",e.style.top=i.top+"px";break;case"top-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+"px";break;case"bottom-left":e.style.left=i.left+"px",e.style.top=i.top+i.height-20+"px";break;case"bottom-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+i.height-20+"px";break;case"middle-left":e.style.left=i.left+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-right":e.style.left=i.left+i.width-20+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"middle-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+(i.height-20)/2+"px";break;case"bottom-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+i.height-20+"px";break;case"top-middle":e.style.left=i.left+(i.width-20)/2+"px",e.style.top=i.top+"px"}}function V(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=I.call(this);if(parseInt(i,10)!==t){var r=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div");r.className="introjs-tooltip",r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=document.createElement("p");c.innerHTML=n.hint;var l=document.createElement("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=K.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),v.call(this,a),a.appendChild(r),document.body.appendChild(a),h.call(this,e,r,s,null,!0)}}function G(t){var e=document.body,n=document.documentElement,i=window.pageYOffset||n.scrollTop||e.scrollTop,r=window.pageXOffset||n.scrollLeft||e.scrollLeft,o=t.getBoundingClientRect();return{top:o.top+i,width:o.width,height:o.height,left:o.left+r}}function z(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}function Q(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function Y(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var W=function(e){var n;if("object"==typeof e)n=new t(e);else if("string"==typeof e){var i=document.querySelector(e);if(!i)throw new Error("There is no element with given selector.");n=new t(i)}else n=new t(document.body);return W.instances[A(n,"introjs-instance")]=n,n};return W.version="2.9.3",W.instances={},W.fn=t.prototype={clone:function(){return new t(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return o.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return s.call(this,t),this},nextStep:function(){return a.call(this),this},previousStep:function(){return c.call(this),this},exit:function(t){return u.call(this,this._targetElement,t),this},refresh:function(){return l.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return O.call(this,this._targetElement),this},hideHint:function(t){return K.call(this,t),this},hideHints:function(){return M.call(this),this},showHint:function(t){return B.call(this,t),this},showHints:function(){return q.call(this),this},removeHints:function(){return D.call(this),this},removeHint:function(t){return U.call(this,t),this},showHintDialog:function(t){return V.call(this,t),this}},W})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lskip=s.TOUR_lskip||"Abort",s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welc=s.TOUR_welc||"<span class='tgreeting'> Welcome to our guided tour!</span><p class='pfirstStep'> This tour should give you a quick introduction to KorAP. We lead you step by step through an example. </p>",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={skipLabel:s.TOUR_lskip,prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.7,exitOnOverlayClick:!1,disableInteraction:!0,hideNext:!0,hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("tooltipClass","gTstartSearch"),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{intro:s.TOUR_welc},{element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{element:"#glimpse",intro:s.TOUR_glimpse,position:"bottom"},{element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions().add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e.value=e.values[0],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},get:function(){return this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.value==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("pageInfo",[],(function(){return{create:function(){const t=Object.create(this),e=document.getElementById("pagination");return t.ds=e?e.dataset:{},t},page:function(){return parseInt(this.ds.page||0)},total:function(){return parseInt(this.ds.total||0)},count:function(){return parseInt(this.ds.count||0)}}})),n("plugin/server",["plugin/widget","plugin/service","state","pageInfo","util"],(function(t,e,n,i){KorAP.Panel=KorAP.Panel||{};var r={},o={},s={match:[]},a={query:[],result:[]},c={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var i=t.desc,c=o[e]={name:e,desc:i,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let o=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!s[u]&&!a[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);KorAP.Panel[u].actions().addToggle(o,{cls:["title"]},t);let i=this.addService({name:e,src:h.template,permissions:h.permissions}),s=r[i];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(i)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(r[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:i});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?r[n].minimize():r[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),s[u]?s[u].push([o,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions().add(o,p,f):a[u].push([o,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=s[t]?s[t]:null!=a[t]?a[t]:[]},clearButtonGroup:function(t){null!=s[t]?s[t]=[]:null!=a[t]&&(a[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<c.length;t++)c[t]++>=100&&(c[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let i=e.create(t);return r[n]=i,c[n]=100,this.element().appendChild(i.load()),n},addWidget:function(e,n){let i=this._getServiceID();n.id=i;var o=t.create(n);return r[i]=o,c[i]=100,o._mgr=this,e.add(o),i},service:function(t){return r[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let o=r[n];if(o){if(c[n]--<0)return KorAP.log(0,"Suspicious action by service",o.src),this._closeService(o.id),void o.close();switch(e.action){case"resize":o.isWidget&&o.resize(e);break;case"log":KorAP.log(e.code,e.msg,o.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var s;(s=t.getElementById("q-field"))&&(n.q=s.value),(s=t.getElementById("ql-field"))&&(n.ql=s.value),(s=KorAP.vc)&&(n.cq=s.toQuery())}else if("QueryParam"==e.key){var a=new URLSearchParams(window.location.search);let t=e.value={};t.param=a,t.q=a.get("q"),t.ql=a.get("ql"),t.cq=a.get("cq")}else if("Pagination"==e.key){const t=i.create();let n=e.value={};n.page=t.page(),n.total=t.total(),n.count=t.count()}e._id&&o.sendMsg(e);break;case"redirect":const t=new URL(window.location);e.queryParam&&(t.search=new URLSearchParams(e.queryParam)),window.location=t.toString()}}},_closeService:function(t){delete c[t],r[t]&&r[t]._closeIframe&&(r[t]._closeIframe(),delete r[t]),0==Object.keys(c).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(c={},Object.keys(r).forEach(t=>r[t].close()),r={},Object.keys(s).forEach(t=>s[t]=[]),Object.keys(a).forEach(t=>a[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText})}},"POST"===t||"PUT"===t?s.send(JSON.stringify(i)):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p){const m=document;KorAP.URL=m.body.getAttribute("data-korap-url")||"";const v=m.getElementById("koralQuery");let _;null!==v&&(KorAP.koralQuery=JSON.parse(v.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(_=document.getElementById("link-guided-tour"))&&(_.setAttribute("href","#"),_.addEventListener("click",(function(){d.gTstartSearch().start()})),KorAP.tourshowR=function(){d.gTshowResults().start()}),r((function(n){var r,o,a={},v=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},m.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var _=m.getElementById("cq"),g=KorAP.vc;if(_){if(_.style.display="none",(r=m.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{g.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(g.getName()),g.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var y=m.querySelectorAll("#search > ol > li");y.forEach((function(e){e.classList.contains("active")?void 0===e._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}));var b=m.getElementsByTagName("aside")[0];if(b&&0==b.classList.contains("active")){var w=!1;b.addEventListener("focus",(function(t){this.classList.add("active")}));var E=m.getElementsByTagName("body")[0];null!==E&&E.addEventListener("click",(function(){w?w=!1:b.classList.remove("active")})),b.addEventListener("click",(function(t){w=!0}))}null!==m.getElementById("ql-field")&&(KorAP.QLmenu=c.create(m.getElementById("ql-field").parentNode).limit(5));var k=m.getElementById("resultinfo"),A=l.create(v);if(null!=k){k.appendChild(A.actions().element());var x=m.getElementById("search");x.insertBefore(A.element(),x.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==k&&A.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),y.length>0&&A.addAlignAction(),KorAP.Panel.result=A,r){g.onMinimize=function(){r.classList.remove("active"),delete v.vc},g.onOpen=function(){r.classList.add("active");var t=m.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),v.vc=!0};var C=function(){g.isOpen()?g.minimize():g.open()};r.onclick=C,v.vc&&C.apply()}m.getElementById("view-tutorial")?(window.tutorial=i.create(m.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(m),a.tutorial.initDocLinks(m));var T=m.getElementById("searchform");null!==T&&T.addEventListener("submit",(function(t){var e=m.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",v),void 0!==g?(_.value=g.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),m.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&d.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),P=m.getElementById("searchform"),N=m.getElementById("vc-view");let S;if(P&&N&&(P.insertBefore(L.element(),N),KorAP.Panel.query=L),function(t){const e=t.querySelectorAll("input.copy-to-clipboard");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("copy-to-clipboard"),i.addEventListener("click",(function(){let t=!1;"password"===n.getAttribute("type")&&(n.setAttribute("type","text"),t=!0),n.select(),n.setSelectionRange(0,99999),document.execCommand("copy"),t&&n.setAttribute("type","password")})),n.parentNode.insertBefore(i,n.nextSibling)}}(m),function(t){const e=t.querySelectorAll("input[type=password].show-pwd");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("show-pwd"),i.addEventListener("click",(function(){if("password"===n.getAttribute("type"))return n.setAttribute("type","text"),void i.classList.add("hide");n.setAttribute("type","password"),i.classList.remove("hide")})),n.parentNode.insertBefore(i,n.nextSibling)}}(m),S=m.getElementById("kalamar-plugins")){let t=S.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=f.create(),m.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=p.create(),m.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.0-en.js.map b/public/js/kalamar-0.43.0-en.js.map
new file mode 100644
index 0000000..13f88a8
--- /dev/null
+++ b/public/js/kalamar-0.43.0-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.43.0-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","cItem","addMenu","addPrefix","prefItem","exit","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","ds","dataset","total","count","widgetClass","stateClass","pageInfoClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","pi","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\nwindow.KorAP = window.KorAP || {};\r\n\r\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined) {\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    }\r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array(); //all childNodes, i.e. ItemClass, prefixClass\r\n\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined; //filtered List containing all itemClass items\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n\r\n    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      //Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n    removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      //Upon Change please update alwaysmenu.js prev\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[this._notItemElements]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\n// TODO:\r\n//   Add addToggle() method\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the list of items and the itemClass.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\tthis.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\r\n     */\r\n    panel : function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n\r\n      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\r\n    },\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\r\n    },\r\n\r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\r\n    },\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\r\n    },\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t._actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions().element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this._actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this._actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions().element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n     * \r\n     * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n     * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n     * @returns The container object\r\n     */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container, 0 to length-1 = in container\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\r\n\r\n\r\n    },\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n    * @param {Object} An object with properties.\r\n    */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Exit the container unconditionally. Required so that active returns the\r\n     * correct result. Called when the prefix or similar resets the currently visual\r\n     * field.\r\n     */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n     * @returns whether an item within the container is active (by checking this.position)\r\n     */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n     * Getter for items\r\n     * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n     * @returns item at location index\r\n     */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n     * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n     * \r\n     * @returns The number of items that are selectable. Is the actual length of the list.\r\n     */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //there are only two new lines, marked with NEW\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n      t.container().exit(); //NEW\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._el.classList.add('visible');\r\n\r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n      t.container()._el.classList.add('visible'); //NEW\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () { //only one new line\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\r\n        };\r\n      }// The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        }\r\n      }\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n    \r\n    /**\r\n    * Upgrade this object to another object,\r\n    * while private data stays intact.\r\n    *\r\n    * @param {Object} An object with properties.\r\n    */\r\n   upgradeTo : function (props) {\r\n     for (var prop in props) {\r\n       this[prop] = props[prop];\r\n     };\r\n     return this;\r\n   },\r\n\r\n    /**\r\n     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\r\n\r\n\r\n  };\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menuCollection   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menuCollection[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menuCollection[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menuCollection[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions().add.apply(this.actions(), i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions().add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions().add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions();\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions().add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions().add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to a plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions().addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\r\n      \r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from form\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"param\"] = p; // readonly\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        }\r\n\r\n        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\r\n        };\r\n\r\n        // data needs to be mirrored\r\n        if (d._id) {\r\n          service.sendMsg(d);\r\n        };\r\n\r\n        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (e._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    });\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions().element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n\r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.1-de.js b/public/js/kalamar-0.43.1-de.js
new file mode 100644
index 0000000..9f51899
--- /dev/null
+++ b/public/js/kalamar-0.43.1-de.js
@@ -0,0 +1,22 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function v(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,v=e&&e.split("/"),g=u.map,m=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&v&&(t=v.slice(0,v.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((v||m)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),v)for(d=v.length;d>0;d-=1)if((r=g[v.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&m&&m[i]&&(c=m[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function m(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(v(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!v(c,t)&&!v(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return m(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(v(c,o)||v(l,o)||v(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,m(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),v(c,t)||v(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},Object.prototype.upgradeTo=function(t){for(let e in t)this[e]=t[e];return this},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),window.KorAP=window.KorAP||{},KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._notItemElements=3,s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},append:function(t){const e=this;t._menu=e,e._list=void 0,e.removeItems(),e._items.push(t),e._lengthField.add([t.content().data]),e._slider.length(e.liveLength()).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(var e=0;t.length>e;)t[e].parentNode===this._el?this._el.removeChild(t[e]):e++},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[this._notItemElements]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[this._notItemElements])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),this._left=!1,this._below=!1,this._outside=!1,i},openAt:function(t,e,n){this._left=!!t,this._below=!!e,this._outside=!!n},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},add:function(t,e,n){let i=this;const r=this.itemClass().create([t,t,function(t){let e=i._bind||this;e.button=r,n.apply(e)}]);return this.append(r),r},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect(),n=this._el.style;let i=window.pageXOffset,r=0;n.right="auto",n.bottom="auto",i+=e.left,this._left&&(i+=e.width-this._el.clientWidth),this._below?(r+=e.bottom,this._outside||(r-=e.height)):(r-=this._el.clientHeight,this._outside?r+=e.top:r+=e.bottom),n.left=i+"px",n.top=r+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},adopt:function(t){const e=Object.create(this);return e._el=t,e},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&(n.add.apply(n,t),t.forEach(t=>{switch(t){case"open-menu-below":this._omBelow=!0;break;case"open-menu-outside":this._omOutside=!0;break;case"open-menu-left":this._omLeft=!0}})),n.add("button-group"),this._el=e,this},element:function(){return this._el},anchor:function(t){return null!==t&&t.parentNode==this._el&&(this._anchor=t,!0)},_insert:function(t="span"){const e=document.createElement(t);return this._anchor?(this._el.insertBefore(e,this._anchor),e):this._el.appendChild(e)},add:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);o.openAt(!!this._omLeft,!!this._omBelow,!!this._omOutside);let s=this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()}));return s.list=o,s},addToggle:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n._actions=t.create(i).bind(this),n.prepend=!1,n._actions.panel=n,n},actions:function(){return this._actions},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions().element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this._actions=t.create(i).bind(this),this._actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this._actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions().element()),this._el=t},actions:function(){return this._actions},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions().add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("loc/de",[],(function(){const t=KorAP.Locale;t.OR="oder",t.AND="und",t.VC_allCorpora="allen Korpora",t.VC_oneCollection="einem virtuellen Korpus",t.REGEX_DESC=t.REGEX_DESC||"Regulären Ausdruck verwenden",t.WDAY=["Mo","Di","Mi","Do","Fr","Sa","So"],t.MONTH=["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],t.ADDTREE="Relationen",t.SHOWANNO="Token",t.SHOWINFO="Informationen",t.CLOSE="Schließen",t.MINIMIZE="Zuklappen",t.DOWNLOAD="Herunterladen",t.TOGGLE_ALIGN="tausche Textausrichtung",t.SHOW_KQ="zeige KoralQuery",t.SHOW_META="Metadaten",t.NEW_QUERY="Neue Anfrage",t.SHOW_STAT="Korpusstatistik",t.REFRESH="Neu laden",t.NEW_CONSTRAINT="Neue Bedingung",t.TOUR_lprev="Zurück",t.TOUR_lnext="Weiter",t.TOUR_ldone="Beenden",t.TOUR_ldoneSearch="Suchen",t.TOUR_welcti=" <span class='tgreeting'> Willkommen zur KorAP Tour! </span>",t.TOUR_welc="Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. Wir führen Sie Schritt für Schritt anhand eines Beispiels durch die Anwendung.",t.TOUR_sear1ti="Suchanfrage",t.TOUR_sear1="Hier können Sie die Suchanfrage eingeben, zum Beispiel die Suche nach '"+t.TOUR_Qexample+"'.",t.TOUR_searAnnotti="Annotationsassistent (1)",t.TOUR_searAnnot="<p> Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung. </p> <p> Er wird ausgewählt, in dem Sie auf den kleinen orangen Balken unter dem Sucheingabefenster klicken oder die Pfeiltaste nach unten &darr; betätigen. </p>",t.TOUR_annotAssti="Annotationsassistent (2)",t.TOUR_annotAss="Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.",t.TOUR_vccho1ti="Auswahl der Korpora",t.TOUR_vccho1="Hier gelangen Sie zum Korpusassistenten.",t.TOUR_vccho2ti="Korpusassistent",t.TOUR_vccho2="Im Korpusassistenten ist die Definition von Subkorpora durch die Verknüpfung beliebiger Metadatenfelder möglich.",t.TOUR_vcStat1ti="Korpusstatistik (1)",t.TOUR_vcStat1="Anzeige der Korpusstatistik.",t.TOUR_vcStat2ti="Korpusstatistik (2)",t.TOUR_vcStat2="Hier sehen sie die Korpusstatistik.",t.TOUR_qlfieldti="Suchanfragen",t.TOUR_qlfield="In KorAP können mehrere Suchanfragesprachen verwendet werden. Welche Sie verwenden wollen, wählen Sie hier aus.",t.TOUR_glimpseti="Glimpse",t.TOUR_glimpse="Durch das Aktivieren dieser Option legen Sie fest, dass nur die ersten Treffer in undefinierter Reihenfolge angezeigt werden.",t.TOUR_helpti="Hilfe",t.TOUR_help="Hier finden Sie die Hilfe zu KorAP.",t.TOUR_seargoti="Suche",t.TOUR_seargo="Durch das Klicken auf das Lupensymbol wird die Suchanfrage gestartet.",t.TOUR_kwic="Anzeige des Ergebnisses als KWIC (keyword in context).",t.TOUR_snippet="Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.",t.TOUR_snippetb="Anzeige des Snippets",t.TOUR_metadatab="Durch die Auswahl des Buttons werden die Metadaten angezeigt.",t.TOUR_metadata="Anzeige der Metadaten",t.TOUR_tokenb=t.TOUR_tokenb||"Anzeige der Token-Annotationen",t.TOUR_token=t.TOUR_token||"KorAP unterstützt multiple Annotationen.",t.TOUR_treeb=t.TOUR_tree||"Anzeige weiterer Ansichten",t.TOUR_tree=t.TOUR_tree||"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.",t.TOUR_tourdone="Viel Spaß mit KorAP!",t.RANDOM_PAGE="Zufallsseite"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("^(?:[^ :.'\\\\|&]+:)?[^ :.'\\\\|&]+$");function n(t){return null===t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),v=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?v.time:v.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=T(t.graph());return e.setGraph(i.merge({},_,k(n,m),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=T(t.node(n));e.setNode(n,i.defaults(k(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=T(t.edge(n));e.setEdge(n,i.merge({},A,k(r,E),i.pick(r,x)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(v.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};v.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=v.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){v.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(v.intersectRect(o,n)),r.points.push(v.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var m=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],A={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},x=["labelpos"];function k(t,e){return i.mapValues(i.pick(t,e),Number)}function T(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,v=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:v,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:v,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,v=0;v<4;++p,++v){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(v=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var v=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(v,f);var g=s(v,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var m=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+m.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-v(t,n)/2}));return i.max(e,(function(e,n){return e+v(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function v(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=v(n);)m(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function v(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function m(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=v,u.enterEdge=g,u.exchangeEdges=m},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),v=/($^)/,g=/\bthis\b/,m=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",A="[object Date]",x="[object Object]",k="[object String]",T={"[object Function]":!1};T[b]=T[w]=T[E]=T[A]=T["[object Number]"]=T[x]=T["[object RegExp]"]=T[k]=!0;var C={leading:!1,maxWait:0,trailing:!1},S={configurable:!1,enumerable:!1,value:null,writable:!1},P={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},L={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},O=P[typeof window]&&window||this,N=P[typeof n]&&n&&!n.nodeType&&n,R=P[typeof e]&&e&&!e.nodeType&&e,I=R&&R.exports===N&&N,j=P[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function U(t){return t.charCodeAt(0)}function B(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function D(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=z();s.false=s.null=s.true=s[void 0]=!1;var a=z();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+L[t]}function H(){return i.pop()||[]}function z(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function V(t){t.length=0,i.length<40&&i.push(t)}function G(t){var e=t.cache;e&&G(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function W(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(O=j);var Y=function t(e){var n=(e=e?Y.defaults(O.Object(),e,Y.pick(O,_)):O).Array,i=e.Boolean,r=e.Date,L=e.Function,N=e.Math,R=e.Number,I=e.Object,j=e.RegExp,q=e.String,Q=e.TypeError,$=[],J=I.prototype,Z=e._,X=J.toString,tt=j("^"+q(X).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=N.ceil,nt=e.clearTimeout,it=N.floor,rt=L.prototype.toString,ot=Bt(ot=I.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=$.push,ct=e.setTimeout,lt=$.splice,ut=$.unshift,ht=function(){try{var t={},e=Bt(e=I.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Bt(dt=I.create)&&dt,ft=Bt(ft=n.isArray)&&ft,pt=e.isFinite,vt=e.isNaN,gt=Bt(gt=I.keys)&&gt,mt=N.max,_t=N.min,yt=e.parseInt,bt=N.random,wt={};function Et(t){return t&&"object"==typeof t&&!Vt(t)&&st.call(t,"__wrapped__")?t:new At(t)}function At(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[A]=r,wt["[object Function]"]=L,wt[x]=I,wt["[object Number]"]=R,wt["[object RegExp]"]=j,wt[k]=q,At.prototype=Et.prototype;var xt=Et.support={};function kt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=W(n);at.apply(t,arguments)}if(this instanceof r){var o=Ct(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Dt(r,t),r}function Tt(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=X.call(t);if(!T[s])return t;var a=wt[s];switch(s){case E:case A:return new a(+t);case"[object Number]":case k:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Vt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?W(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?ve:te)(t,(function(t,s){o[s]=Tt(t,e,n,i,r)})),l&&(V(i),V(r)),o):o}function Ct(t,e){return oe(t)?dt(t):{}}function St(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(xt.funcNames&&(i=!t.name),!(i=i||!xt.funcDecomp))){var r=rt.call(t);xt.funcNames||(i=!d.test(r)),i||(i=g.test(r),Dt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Ie(t,e)}function Pt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=W(i);at.apply(f,arguments)}if((r||l)&&(f||(f=W(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Pt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Ct(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Dt(d,t),d}function Lt(t,e){var n=-1,i=Ut(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=D(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&G(e),s}function Ot(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Vt(a)||zt(a))){e||(a=Ot(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Nt(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&P[typeof t]||e&&P[typeof e]))return!1;if(null==t||null==e)return t===e;var a=X.call(t),c=X.call(e);if(a==b&&(a=x),c==b&&(c=x),a!=c)return!1;switch(a){case E:case A:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case k:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Nt(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=x)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var v=r.length;v--;)if(r[v]==t)return o[v]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(v=t.length,g=e.length,(s=g==v)||i)for(;g--;){var m=v,_=e[g];if(i)for(;m--&&!(s=Nt(t[m],_,n,i,r,o)););else if(!(s=Nt(t[g],_,n,i,r,o)))break}}else Xt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Nt(t[a],e,n,i,r,o)})),s&&!i&&Xt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(V(r),V(o)),s}function Rt(t,e,n,i,r){(Vt(e)?ve:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Vt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Vt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||Rt(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function It(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=D(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(V(c.array),G(c)):n&&V(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new Q;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=W(u))[2]&&(u[2]=W(u[2])),u[3]&&(u[3]=W(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?kt:Pt)([t,e,n,i,r,o])}function qt(t){return Wt[t]}function Ut(){var t=(t=Et.indexOf)===Se?K:t;return t}function Bt(t){return"function"==typeof t&&tt.test(t)}xt.funcDecomp=!Bt(e.WinRTError)&&g.test(t),xt.funcNames="string"==typeof L.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Ct=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Dt=ht?function(t,e){S.value=e,ht(t,"__bindData__",S)}:qe;function Ft(t){var e,n;return!(!t||X.call(t)!=x||re(e=t.constructor)&&!(e instanceof e))&&(Xt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Yt[t]}function zt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==b||!1}var Vt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&X.call(t)==w||!1},Gt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!P[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Wt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Yt=ie(Wt),Qt=j("("+Gt(Yt).join("|")+")","g"),$t=j("["+Gt(Wt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=St(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&P[typeof r])for(var u=-1,h=P[typeof r]&&Gt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&P[typeof r])for(var l=-1,u=P[typeof r]&&Gt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;for(i in e=e&&void 0===n?e:St(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!P[typeof r])return o;e=e&&void 0===n?e:St(e,n,3);for(var s=-1,a=P[typeof r]&&Gt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=Gt(t),r=i.length;for(e=St(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Xt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=Gt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!P[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==X.call(t)||!1}var ae=ot?function(t){if(!t||X.call(t)!=x)return!1;var e=t.valueOf,n=Bt(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&X.call(t)==k||!1}function le(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Ut(),o=t?t.length:0,s=!1;return n=(n<0?mt(0,o+n):n)||0,Vt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function ve(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:St(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:St(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=Gt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var me=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Vt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ve(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function Ae(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function xe(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return ve(t,(function(t){var n=It(0,++e);r[e]=r[n],r[n]=t})),r}function ke(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Te=fe;function Ce(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return W(t,0,_t(mt(0,i),r))}function Se(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?mt(0,i+n):n||0}else if(n){var r=Le(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Pe(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:mt(0,e);return W(t,i)}function Le(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Oe(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Ne(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Re(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Vt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Ie(t,e){return arguments.length>2?Mt(t,17,W(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new Q;if(e=mt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(mt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(Be()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=Be(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},v=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=Be(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=Be(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),m=g<=0;m?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(v,g))}return m&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(m=!0,o=t.apply(a,i)),!m||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=At,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);ve(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Ue,Be=Bt(Be=r.now)&&Be||function(){return(new r).getTime()},De=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new Q;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=Ot(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Ie,Et.bindAll=function(t){for(var e=arguments.length>1?Ot(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,W(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new At(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new Q;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Ct(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return St(t,e,n);if("object"!=i)return Fe(t);var r=Gt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Nt(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Zt,Et.defer=function(t){if(!re(t))throw new Q;var e=W(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new Q;var n=W(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return Lt(t,Ot(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),Ot(t,e)},Et.forEach=ve,Et.forEachRight=ge,Et.forIn=Xt,Et.forInRight=function(t,e,n){var i=[];Xt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=St(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=me,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return W(t,0,_t(mt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Ut(),o=r===K,s=H();++e<n;){var a=arguments[e];(Vt(a)||zt(a))&&(t.push(a),i.push(o&&a.length>=75&&D(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&G(d);return V(i),V(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=W(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return ve(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=Gt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new Q;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=St(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=W(arguments,1,n),o=-1,s=H(),a=H();++o<n;)Rt(t,r[o],i,s,a);return V(s),V(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Vt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?U:Et.createCallback(e,n,3),ve(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Xt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=Lt(r,Ot(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new Q;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=Gt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,W(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,W(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=Ot(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Xt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=mt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Pe,Et.shuffle=xe,Et.sortBy=function(t,e,i){var r=-1,o=Vt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),ve(t,(function(t,n,i){var s=a[++r]=z();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(B);s--;){var c=a[s];a[s]=c.value,o||V(c.criteria),G(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new Q;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),C.leading=i,C.maxWait=e,C.trailing=r,je(t,e,C)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=St(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?W(t):le(t)},Et.transform=function(t,e,n,i){var r=Vt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Ct(s)}return e&&(e=Et.createCallback(e,i,4),(r?ve:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(Ot(arguments,!0,!0))},Et.uniq=Oe,Et.values=le,Et.where=Te,Et.without=function(t){return Lt(t,W(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Vt(n)||zt(n))var i=i?jt(Lt(i,n).concat(Lt(n,i))):n}return i||[]},Et.zip=Ne,Et.zipObject=Re,Et.collect=ye,Et.drop=Pe,Et.each=ve,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Re,Et.select=fe,Et.tail=Pe,Et.unique=Oe,Et.unzip=Ne,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Tt(t,e,"function"==typeof n&&St(n,i,1))},Et.cloneDeep=function(t,e,n){return Tt(t,!0,"function"==typeof e&&St(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace($t,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Se,Et.isArguments=zt,Et.isArray=Vt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&X.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&X.call(t)==A||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=X.call(t),i=t.length;return n==w||n==k||n==b||n==x&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Nt(t,e,"function"==typeof n&&St(n,i,2))},Et.isFinite=function(t){return pt(t)&&!vt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==X.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?mt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=Z,this},Et.noop=qe,Et.now=Be,Et.parseInt=De,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return It(t,e)},Et.reduce=Ee,Et.reduceRight=Ae,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:Gt(t).length},Et.some=ke,Et.sortedIndex=Le,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Zt({},n,i);var r,o=Zt({},n.imports,i.imports),s=Gt(o),h=le(o),d=0,p=n.interpolate||v,g="__p += '",_=j((n.escape||v).source+"|"+p.source+"|"+(p===f?u:v).source+"|"+(n.evaluate||v).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(m,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var A=L(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?A(e):(A.source=g,A)},Et.unescape=function(t){return null==t?"":q(t).replace(Qt,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=ke,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=Ae,Et.include=ue,Et.inject=Ee,Me((Ue={},te(Et,(function(t,e){Et.prototype[e]||(Ue[e]=t)})),Ue),!1),Et.first=Ce,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return W(t,mt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[It(0,t.length-1)]:void 0;var i=xe(t);return i.length=_t(mt(0,e),i.length),i},Et.take=Ce,Et.head=Ce,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new At(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,ve(["join","pop","shift"],(function(t){var e=$[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new At(n,t):n}})),ve(["push","reverse","sort","unshift"],(function(t){var e=$[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),ve(["concat","slice","splice"],(function(t){var e=$[t];Et.prototype[t]=function(){return new At(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();N&&R?I?(R.exports=Y)._=Y:N._=Y:O._=Y}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let v=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const m=n;g.addEventListener("mouseenter",(function(){m.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",v+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,A=g.insertBefore(n._c("rect"),_),x=w+2*n.xPadding;A.setAttribute("x",d+u-x/2),A.setAttribute("ry",5),A.setAttribute("y",b.y-n.yPadding),A.setAttribute("width",x),A.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions().add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions(),i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions().element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("container/containeritem",{create:function(){return Object.create(this)},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),this._el=t},content:function(t){var e;return 1===arguments.length?e=t:(void 0===this.defaultTextValue&&(this.defaultTextValue=""),e=this.defaultTextValue),void 0===this._content?(this._content=document.createTextNode(e),this.element().appendChild(this._content)):this._content.nodeValue=e,this._content},isSelectable:function(){return!0},add:function(t){},clear:function(){},onclick:function(t){},chop:function(){},further:function(t){},menu:function(){return this._menu}}),n("container/container",["container/containeritem"],(function(t){return{create:function(t,e){var n=Object.create(this);return n._init(t,e),n},_init:function(e,n){void 0!==n&&void 0!==n.containerItemClass?this._containerItemClass=n.containerItemClass:this._containerItemClass=t;var i=document.createElement("ul");if(i.style.outline=0,i.setAttribute("tabindex",0),i.classList.add("menu","container"),this._el=i,this._cItemPrefix=void 0,this.items=new Array,void 0!==e)for(let t of e)this.addItem(t);this.position=void 0,this._prefixPosition=void 0},addItem:function(t){var e=this._containerItemClass.create().upgradeTo(t);return e._menu=this._menu,this.items.push(e),void 0!==this._cItemPrefix&&(this.items.splice(this.items.indexOf(this._cItemPrefix),1),this.items.push(this._cItemPrefix)),this._el.appendChild(e.element()),e.content(),e},addMenu:function(t){this._menu=t,void 0!==this._cItemPrefix&&(this._menu._prefix=this._cItemPrefix);for(let e of this.items)e._menu=t},addPrefix:function(t){t.isSelectable=function(){return this.isSet()},this._prefixPosition=this.items.length,t.content=function(t){};var e=this.addItem(t);this._cItemPrefix=e,e._el.onclick=e.onclick.bind(e),void 0!==this._menu&&(this._menu._prefix=e)},removeItem:function(t){t.active()&&this._menu.next(),t._menu=void 0,this._el.removeChild(t.element()),this.items.splice(this.items.indexOf(t),1)},removeItemByIndex:function(t){this.removeItem(this.items[t])},removeItemByIndex:function(t){t<0||t>=this.length()?KorAP.log(0,"Invalid index in containers removeItemByIndex: "+t,"container.js"):this.removeItem(this.items[t])},exit:function(){void 0!==this.position&&(this.item().active(!1),this.position=void 0)},element:function(){return this._el},destroy:function(){for(let t of this.items)delete t._menu},active:function(){return void 0!==this.position},item:function(t){return void 0===t?this.items[this.position]:this.items[t]},makeActive:function(){void 0===this.position&&(this._cItemPrefix.isSelectable()?(this.position=this._prefixPosition,this.item().active(!0)):this.liveLength()>0&&(this.position=0,this._cItemPrefix.active(!1),this.item().active(!0)))},next:function(){if(void 0!==this.position?(this.item().active(!1),this.position++):this.position=0,this.position>=this.length())return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position++,this.position>=this.length())return this.position=void 0,!0;return this.item().active(!0),!1},prev:function(){if(void 0!==this.position?(this.item().active(!1),this.position=this.position-1):this.position=this.items.length-1,this.position<0)return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position--,this.position<0)return this.position=void 0,!0;return this.item().active(!0),!1},further:function(){const t=this.item();void 0!==t.further&&t.further.bind(t).apply()},enter:function(t){this.item().onclick(t)},chop:function(){for(let t of this.items)t.chop()},add:function(t){for(let e of this.items)e.add(t)},length:function(){return this.items.length},liveLength:function(){var t=0;for(let e of this.items)e.isSelectable()&&t++;return t}}})),n("containermenu",["menu","container/container","util"],(function(t,e){return{create:function(n,i,r){const o=t.create(n,i).upgradeTo(this)._init(n,i);return o._el.classList.add("containermenu"),void 0!==i&&void 0!==i.containerClass?o._container=i.containerClass.create(r,i):o._container=e.create(r,i),o.container().addMenu(o),o._el.appendChild(o.container().element()),o._el.removeChild(o._prefix.element()),o.container().addPrefix(o._prefix),o},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu,t.container().destroy(),delete t.container()._menu},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e.container().active()){e.container().further(),t.halt();break}const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e.container().active()?e.container().enter(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e.container().chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this.container().add(String.fromCharCode(h(t))),this.show())},show:function(t){const e=this;if(e._unmark(),e.removeItems(),e.container().exit(),!e._initList())return e._prefix.active(!0),e.container().makeActive(),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"),this.container()._el.classList.remove("visible"))},next:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.next()&&e.next())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position++;let i=t.liveItem(t.position);void 0===i?(t.position=-1,0!==n?t.container().next()&&(t.position=0,t._showItems(0),i=t.liveItem(0)):(t.position=0,t._showItems(0),i=t.liveItem(0))):t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position),void 0!==i&&i.active(!0)},prev:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.prev()&&e.prev())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position--;let i=t.liveItem(t.position);if(void 0===i){t.position=-1;let e=t.liveLength()-t.limit();e=e<0?0:e,0!==n?t.container().prev()?(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e)):t.offset=e:(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e))}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);void 0!==i&&i.active(!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},container:function(){return this._container}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["containermenu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=t.create(s,{itemClass:e,prefixClass:n,lengthFieldClass:i}).upgradeTo(this);return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menuCollection={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menuCollection[t]){if(void 0===KorAP.annotationHelper[t])return;this._menuCollection[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menuCollection[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},v={},g=!1,m=13,_=27,y=32,b=[];return v={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,v="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(v=d.value),"function"==typeof t&&(void 0!==d?t(!0,v):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===m)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=v.message.replace("{{message}}",i),"prompt"===n&&(e+=v.input),e+=v.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(v.buttons.cancel,v.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(v.buttons.cancel,v.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",v.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function m(){return void 0!==E.sL?function(){if(E.sL&&!v[E.sL])return e(k);var t=E.sL?c(E.sL,k,!0,A[E.sL]):l(k);return E.r>0&&(T+=t.r),"continuous"==E.subLanguageMode&&(A[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(k);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(k);i;){t+=e(k.substr(n,i.index-n));var r=d(E,i);r?(T+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(k)}return t+e(k.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(x+=i,k=""):t.eB?(x+=e(n)+i,k=""):(x+=i,k=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(k+=t,void 0===n)return x+=m(),0;var i=s(n,E);if(i)return x+=m(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(k+=n),x+=m();do{E.cN&&(x+="</span>"),T+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(x+=e(n)),k="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return k+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,A={},x="";for(w=E;w!=b;w=w.parent)w.cN&&(x=g(w.cN,"",!0)+x);var k="",T=0;try{for(var C,S,P=0;E.t.lastIndex=P,C=E.t.exec(n);)S=y(n.substr(P,C.index-P),C[0]),P=C.index+S;for(y(n.substr(P)),w=E;w.parent;w=w.parent)w.cN&&(x+="</span>");return{r:T,value:x,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(v);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return v[t]||v[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},v={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=v[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(v)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions().add.apply(this.actions(),t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions().add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions().add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions();return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),n("pageInfo",[],(function(){return{create:function(){const t=Object.create(this),e=document.getElementById("pagination");return t.ds=e?e.dataset:{},t},page:function(){return parseInt(this.ds.page||0)},total:function(){return parseInt(this.ds.total||0)},count:function(){return parseInt(this.ds.count||0)}}})),n("panel/pagination",["panel","buttongroup","pageInfo"],(function(t,e,n){document;const i=KorAP.Locale;return i.RANDOM_PAGE=i.RANDOM_PAGE||"Random page",{create:function(){return Object.create(t)._init(["pagination"]).upgradeTo(this)._init()},_init:function(){let t=document.getElementById("pagination");if(null===t)return null;if("0"===t.getAttribute("data-total"))return null;this._actions.panel=void 0,this._actions.clear();const n=e.adopt(t);n._omOutside=!0,n._omLeft=!0,n.anchor(t.lastElementChild);let i=n.addList("More",{cls:["button-group-list","button-icon"]});return this._actions=i.list,this._bg=n,i.setAttribute("data-icon",""),this._actions.panel=this,this.prepend=!0,this},buttonGroup:function(){return this._bg},addRandomPage:function(){const t=n.create();this.actions().add(i.RANDOM_PAGE,{},(function(){if(t.total()>0){const e=new URLSearchParams(window.location.search);e.set("p",Math.floor(Math.random()*t.total())+1),window.location.search=e.toString()}}))}}})),
+/*!
+ * Intro.js v4.2.2
+ * https://introjs.com
+ *
+ * Copyright (C) 2012-2021 Afshin Mehrabani (@afshinmeh).
+ * https://raw.githubusercontent.com/usablica/intro.js/master/license.md
+ *
+ * Date: Fri, 27 Aug 2021 12:07:05 GMT
+ */
+function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof n&&n.amd?n("lib/intro",e):(t="undefined"!=typeof globalThis?globalThis:t||self).introJs=e()}(this,(function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}var e=function(){var t={};return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"introjs-stamp";return t[n]=t[n]||0,void 0===e[n]&&(e[n]=t[n]++),e[n]}}();function n(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var i=new function(){var t="introjs_event";this._id=function(t,n,i,r){return n+e(i)+(r?"_".concat(e(r)):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on".concat(n),a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on".concat(n),a),e[t][s]=null)}},r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,e){return t(e={exports:{}},e.exports),e.exports}var s,a,c=function(t){return t&&t.Math==Math&&t},l=c("object"==typeof globalThis&&globalThis)||c("object"==typeof window&&window)||c("object"==typeof self&&self)||c("object"==typeof r&&r)||function(){return this}()||Function("return this")(),u=function(t){try{return!!t()}catch(t){return!0}},h=!u((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),d={}.propertyIsEnumerable,f=Object.getOwnPropertyDescriptor,p={f:f&&!d.call({1:2},1)?function(t){var e=f(this,t);return!!e&&e.enumerable}:d},v=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},g={}.toString,m=function(t){return g.call(t).slice(8,-1)},_="".split,y=u((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==m(t)?_.call(t,""):Object(t)}:Object,b=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},w=function(t){return y(b(t))},E=function(t){return"object"==typeof t?null!==t:"function"==typeof t},A=function(t){return"function"==typeof t?t:void 0},x=function(t,e){return arguments.length<2?A(l[t]):l[t]&&l[t][e]},k=x("navigator","userAgent")||"",T=l.process,C=l.Deno,S=T&&T.versions||C&&C.version,P=S&&S.v8;P?a=(s=P.split("."))[0]<4?1:s[0]+s[1]:k&&(!(s=k.match(/Edge\/(\d+)/))||s[1]>=74)&&(s=k.match(/Chrome\/(\d+)/))&&(a=s[1]);var L=a&&+a,O=!!Object.getOwnPropertySymbols&&!u((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&L&&L<41})),N=O&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,R=N?function(t){return"symbol"==typeof t}:function(t){var e=x("Symbol");return"function"==typeof e&&Object(t)instanceof e},I=function(t,e){try{Object.defineProperty(l,t,{value:e,configurable:!0,writable:!0})}catch(n){l[t]=e}return e},j=l["__core-js_shared__"]||I("__core-js_shared__",{}),K=o((function(t){(t.exports=function(t,e){return j[t]||(j[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.16.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),M=function(t){return Object(b(t))},q={}.hasOwnProperty,U=Object.hasOwn||function(t,e){return q.call(M(t),e)},B=0,D=Math.random(),F=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++B+D).toString(36)},H=K("wks"),z=l.Symbol,V=N?z:z&&z.withoutSetter||F,G=function(t){return U(H,t)&&(O||"string"==typeof H[t])||(O&&U(z,t)?H[t]=z[t]:H[t]=V("Symbol."+t)),H[t]},W=G("toPrimitive"),Y=function(t,e){if(!E(t)||R(t))return t;var n,i=t[W];if(void 0!==i){if(void 0===e&&(e="default"),n=i.call(t,e),!E(n)||R(n))return n;throw TypeError("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var n,i;if("string"===e&&"function"==typeof(n=t.toString)&&!E(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!E(i=n.call(t)))return i;if("string"!==e&&"function"==typeof(n=t.toString)&&!E(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}(t,e)},Q=function(t){var e=Y(t,"string");return R(e)?e:String(e)},$=l.document,J=E($)&&E($.createElement),Z=function(t){return J?$.createElement(t):{}},X=!h&&!u((function(){return 7!=Object.defineProperty(Z("div"),"a",{get:function(){return 7}}).a})),tt=Object.getOwnPropertyDescriptor,et={f:h?tt:function(t,e){if(t=w(t),e=Q(e),X)try{return tt(t,e)}catch(t){}if(U(t,e))return v(!p.f.call(t,e),t[e])}},nt=function(t){if(!E(t))throw TypeError(String(t)+" is not an object");return t},it=Object.defineProperty,rt={f:h?it:function(t,e,n){if(nt(t),e=Q(e),nt(n),X)try{return it(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},ot=h?function(t,e,n){return rt.f(t,e,v(1,n))}:function(t,e,n){return t[e]=n,t},st=Function.toString;"function"!=typeof j.inspectSource&&(j.inspectSource=function(t){return st.call(t)});var at,ct,lt,ut=j.inspectSource,ht=l.WeakMap,dt="function"==typeof ht&&/native code/.test(ut(ht)),ft=K("keys"),pt=function(t){return ft[t]||(ft[t]=F(t))},vt={},gt=l.WeakMap;if(dt||j.state){var mt=j.state||(j.state=new gt),_t=mt.get,yt=mt.has,bt=mt.set;at=function(t,e){if(yt.call(mt,t))throw new TypeError("Object already initialized");return e.facade=t,bt.call(mt,t,e),e},ct=function(t){return _t.call(mt,t)||{}},lt=function(t){return yt.call(mt,t)}}else{var wt=pt("state");vt[wt]=!0,at=function(t,e){if(U(t,wt))throw new TypeError("Object already initialized");return e.facade=t,ot(t,wt,e),e},ct=function(t){return U(t,wt)?t[wt]:{}},lt=function(t){return U(t,wt)}}var Et,At={set:at,get:ct,has:lt,enforce:function(t){return lt(t)?ct(t):at(t,{})},getterFor:function(t){return function(e){var n;if(!E(e)||(n=ct(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}},xt=o((function(t){var e=At.get,n=At.enforce,i=String(String).split("String");(t.exports=function(t,e,r,o){var s,a=!!o&&!!o.unsafe,c=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;"function"==typeof r&&("string"!=typeof e||U(r,"name")||ot(r,"name",e),(s=n(r)).source||(s.source=i.join("string"==typeof e?e:""))),t!==l?(a?!u&&t[e]&&(c=!0):delete t[e],c?t[e]=r:ot(t,e,r)):c?t[e]=r:I(e,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&e(this).source||ut(this)}))})),kt=Math.ceil,Tt=Math.floor,Ct=function(t){return isNaN(t=+t)?0:(t>0?Tt:kt)(t)},St=Math.min,Pt=function(t){return t>0?St(Ct(t),9007199254740991):0},Lt=Math.max,Ot=Math.min,Nt=function(t,e){var n=Ct(t);return n<0?Lt(n+e,0):Ot(n,e)},Rt=function(t){return function(e,n,i){var r,o=w(e),s=Pt(o.length),a=Nt(i,s);if(t&&n!=n){for(;s>a;)if((r=o[a++])!=r)return!0}else for(;s>a;a++)if((t||a in o)&&o[a]===n)return t||a||0;return!t&&-1}},It={includes:Rt(!0),indexOf:Rt(!1)},jt=It.indexOf,Kt=function(t,e){var n,i=w(t),r=0,o=[];for(n in i)!U(vt,n)&&U(i,n)&&o.push(n);for(;e.length>r;)U(i,n=e[r++])&&(~jt(o,n)||o.push(n));return o},Mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],qt=Mt.concat("length","prototype"),Ut={f:Object.getOwnPropertyNames||function(t){return Kt(t,qt)}},Bt={f:Object.getOwnPropertySymbols},Dt=x("Reflect","ownKeys")||function(t){var e=Ut.f(nt(t)),n=Bt.f;return n?e.concat(n(t)):e},Ft=function(t,e){for(var n=Dt(e),i=rt.f,r=et.f,o=0;o<n.length;o++){var s=n[o];U(t,s)||i(t,s,r(e,s))}},Ht=/#|\.prototype\./,zt=function(t,e){var n=Gt[Vt(t)];return n==Yt||n!=Wt&&("function"==typeof e?u(e):!!e)},Vt=zt.normalize=function(t){return String(t).replace(Ht,".").toLowerCase()},Gt=zt.data={},Wt=zt.NATIVE="N",Yt=zt.POLYFILL="P",Qt=zt,$t=et.f,Jt=function(t,e){var n,i,r,o,s,a=t.target,c=t.global,u=t.stat;if(n=c?l:u?l[a]||I(a,{}):(l[a]||{}).prototype)for(i in e){if(o=e[i],r=t.noTargetGet?(s=$t(n,i))&&s.value:n[i],!Qt(c?i:a+(u?".":"#")+i,t.forced)&&void 0!==r){if(typeof o==typeof r)continue;Ft(o,r)}(t.sham||r&&r.sham)&&ot(o,"sham",!0),xt(n,i,o,t)}},Zt=function(t){if(R(t))throw TypeError("Cannot convert a Symbol value to a string");return String(t)},Xt=function(){var t=nt(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e},te=function(t,e){return RegExp(t,e)},ee={UNSUPPORTED_Y:u((function(){var t=te("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),BROKEN_CARET:u((function(){var t=te("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},ne=Object.keys||function(t){return Kt(t,Mt)},ie=h?Object.defineProperties:function(t,e){nt(t);for(var n,i=ne(e),r=i.length,o=0;r>o;)rt.f(t,n=i[o++],e[n]);return t},re=x("document","documentElement"),oe=pt("IE_PROTO"),se=function(){},ae=function(t){return"<script>"+t+"<\/script>"},ce=function(t){t.write(ae("")),t.close();var e=t.parentWindow.Object;return t=null,e},le=function(){try{Et=new ActiveXObject("htmlfile")}catch(t){}le=document.domain&&Et?ce(Et):function(){var t,e=Z("iframe");if(e.style)return e.style.display="none",re.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(ae("document.F=Object")),t.close(),t.F}()||ce(Et);for(var t=Mt.length;t--;)delete le.prototype[Mt[t]];return le()};vt[oe]=!0;var ue,he,de=Object.create||function(t,e){var n;return null!==t?(se.prototype=nt(t),n=new se,se.prototype=null,n[oe]=t):n=le(),void 0===e?n:ie(n,e)},fe=u((function(){var t=RegExp(".","string".charAt(0));return!(t.dotAll&&t.exec("\n")&&"s"===t.flags)})),pe=u((function(){var t=RegExp("(?<a>b)","string".charAt(5));return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$<a>c")})),ve=At.get,ge=RegExp.prototype.exec,me=K("native-string-replace",String.prototype.replace),_e=ge,ye=(ue=/a/,he=/b*/g,ge.call(ue,"a"),ge.call(he,"a"),0!==ue.lastIndex||0!==he.lastIndex),be=ee.UNSUPPORTED_Y||ee.BROKEN_CARET,we=void 0!==/()??/.exec("")[1];(ye||we||be||fe||pe)&&(_e=function(t){var e,n,i,r,o,s,a,c=this,l=ve(c),u=Zt(t),h=l.raw;if(h)return h.lastIndex=c.lastIndex,e=_e.call(h,u),c.lastIndex=h.lastIndex,e;var d=l.groups,f=be&&c.sticky,p=Xt.call(c),v=c.source,g=0,m=u;if(f&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=u.slice(c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&"\n"!==u.charAt(c.lastIndex-1))&&(v="(?: "+v+")",m=" "+m,g++),n=new RegExp("^(?:"+v+")",p)),we&&(n=new RegExp("^"+v+"$(?!\\s)",p)),ye&&(i=c.lastIndex),r=ge.call(f?n:c,m),f?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=c.lastIndex,c.lastIndex+=r[0].length):c.lastIndex=0:ye&&r&&(c.lastIndex=c.global?r.index+r[0].length:i),we&&r&&r.length>1&&me.call(r[0],n,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r&&d)for(r.groups=s=de(null),o=0;o<d.length;o++)s[(a=d[o])[0]]=r[a[1]];return r});var Ee=_e;Jt({target:"RegExp",proto:!0,forced:/./.exec!==Ee},{exec:Ee});var Ae=G("species"),xe=RegExp.prototype,ke=function(t,e,n,i){var r=G(t),o=!u((function(){var e={};return e[r]=function(){return 7},7!=""[t](e)})),s=o&&!u((function(){var e=!1,n=/a/;return"split"===t&&((n={}).constructor={},n.constructor[Ae]=function(){return n},n.flags="",n[r]=/./[r]),n.exec=function(){return e=!0,null},n[r](""),!e}));if(!o||!s||n){var a=/./[r],c=e(r,""[t],(function(t,e,n,i,r){var s=e.exec;return s===Ee||s===xe.exec?o&&!r?{done:!0,value:a.call(e,n,i)}:{done:!0,value:t.call(n,e,i)}:{done:!1}}));xt(String.prototype,t,c[0]),xt(xe,r,c[1])}i&&ot(xe[r],"sham",!0)},Te=function(t){return function(e,n){var i,r,o=Zt(b(e)),s=Ct(n),a=o.length;return s<0||s>=a?t?"":void 0:(i=o.charCodeAt(s))<55296||i>56319||s+1===a||(r=o.charCodeAt(s+1))<56320||r>57343?t?o.charAt(s):i:t?o.slice(s,s+2):r-56320+(i-55296<<10)+65536}},Ce={codeAt:Te(!1),charAt:Te(!0)}.charAt,Se=function(t,e,n){return e+(n?Ce(t,e).length:1)},Pe=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==m(t))throw TypeError("RegExp#exec called on incompatible receiver");return Ee.call(t,e)};ke("match",(function(t,e,n){return[function(e){var n=b(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,n):new RegExp(e)[t](Zt(n))},function(t){var i=nt(this),r=Zt(t),o=n(e,i,r);if(o.done)return o.value;if(!i.global)return Pe(i,r);var s=i.unicode;i.lastIndex=0;for(var a,c=[],l=0;null!==(a=Pe(i,r));){var u=Zt(a[0]);c[l]=u,""===u&&(i.lastIndex=Se(r,Pt(i.lastIndex),s)),l++}return 0===l?null:c}]}));var Le=Array.isArray||function(t){return"Array"==m(t)},Oe=function(t,e,n){var i=Q(e);i in t?rt.f(t,i,v(0,n)):t[i]=n},Ne=G("species"),Re=function(t,e){return new(function(t){var e;return Le(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!Le(e.prototype)?E(e)&&null===(e=e[Ne])&&(e=void 0):e=void 0),void 0===e?Array:e}(t))(0===e?0:e)},Ie=G("species"),je=function(t){return L>=51||!u((function(){var e=[];return(e.constructor={})[Ie]=function(){return{foo:1}},1!==e[t](Boolean).foo}))},Ke=G("isConcatSpreadable"),Me=L>=51||!u((function(){var t=[];return t[Ke]=!1,t.concat()[0]!==t})),qe=je("concat"),Ue=function(t){if(!E(t))return!1;var e=t[Ke];return void 0!==e?!!e:Le(t)};Jt({target:"Array",proto:!0,forced:!Me||!qe},{concat:function(t){var e,n,i,r,o,s=M(this),a=Re(s,0),c=0;for(e=-1,i=arguments.length;e<i;e++)if(Ue(o=-1===e?s:arguments[e])){if(c+(r=Pt(o.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n<r;n++,c++)n in o&&Oe(a,c,o[n])}else{if(c>=9007199254740991)throw TypeError("Maximum allowed index exceeded");Oe(a,c++,o)}return a.length=c,a}});var Be={};Be[G("toStringTag")]="z";var De="[object z]"===String(Be),Fe=G("toStringTag"),He="Arguments"==m(function(){return arguments}()),ze=De?m:function(t){var e,n,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),Fe))?n:He?m(e):"Object"==(i=m(e))&&"function"==typeof e.callee?"Arguments":i},Ve=De?{}.toString:function(){return"[object "+ze(this)+"]"};De||xt(Object.prototype,"toString",Ve,{unsafe:!0});var Ge=RegExp.prototype,We=Ge.toString,Ye=u((function(){return"/a/b"!=We.call({source:"a",flags:"b"})})),Qe="toString"!=We.name;(Ye||Qe)&&xt(RegExp.prototype,"toString",(function(){var t=nt(this),e=Zt(t.source),n=t.flags;return"/"+e+"/"+Zt(void 0===n&&t instanceof RegExp&&!("flags"in Ge)?Xt.call(t):n)}),{unsafe:!0});var $e=G("match"),Je=function(t){var e;return E(t)&&(void 0!==(e=t[$e])?!!e:"RegExp"==m(t))},Ze=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},Xe=G("species"),tn=ee.UNSUPPORTED_Y,en=[].push,nn=Math.min;function rn(t,e){if(t instanceof SVGElement){var i=t.getAttribute("class")||"";i.match(e)||t.setAttribute("class","".concat(i," ").concat(e))}else{if(void 0!==t.classList)n(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" ".concat(e))}}function on(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function sn(t){var e=t.element;if(this._options.scrollToElement){var n=function(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}(e);n!==document.body&&(n.scrollTop=e.offsetTop-n.offsetTop)}}function an(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function cn(t,e,n){var i,r=e.element;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():r.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(r)))){var o=an().height;i.bottom-(i.bottom-i.top)<0||r.clientHeight>o?window.scrollBy(0,i.top-(o/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(o/2-i.height/2)+this._options.scrollPadding)}}function ln(t){t.setAttribute("role","button"),t.tabIndex=0}ke("split",(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=Zt(b(this)),r=void 0===n?4294967295:n>>>0;if(0===r)return[];if(void 0===t)return[i];if(!Je(t))return e.call(i,t,r);for(var o,s,a,c=[],l=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),u=0,h=new RegExp(t.source,l+"g");(o=Ee.call(h,i))&&!((s=h.lastIndex)>u&&(c.push(i.slice(u,o.index)),o.length>1&&o.index<i.length&&en.apply(c,o.slice(1)),a=o[0].length,u=s,c.length>=r));)h.lastIndex===o.index&&h.lastIndex++;return u===i.length?!a&&h.test("")||c.push(""):c.push(i.slice(u)),c.length>r?c.slice(0,r):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var r=b(this),o=null==e?void 0:e[t];return void 0!==o?o.call(e,r,n):i.call(Zt(r),e,n)},function(t,r){var o=nt(this),s=Zt(t),a=n(i,o,s,r,i!==e);if(a.done)return a.value;var c=function(t,e){var n,i=nt(t).constructor;return void 0===i||null==(n=nt(i)[Xe])?e:Ze(n)}(o,RegExp),l=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(tn?"g":"y"),h=new c(tn?"^(?:"+o.source+")":o,u),d=void 0===r?4294967295:r>>>0;if(0===d)return[];if(0===s.length)return null===Pe(h,s)?[s]:[];for(var f=0,p=0,v=[];p<s.length;){h.lastIndex=tn?0:p;var g,m=Pe(h,tn?s.slice(p):s);if(null===m||(g=nn(Pt(h.lastIndex+(tn?p:0)),s.length))===f)p=Se(s,p,l);else{if(v.push(s.slice(f,p)),v.length===d)return v;for(var _=1;_<=m.length-1;_++)if(v.push(m[_]),v.length===d)return v;p=f=g}}return v.push(s.slice(f)),v}]}),!!u((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),tn);var un=Object.assign,hn=Object.defineProperty,dn=!un||u((function(){if(h&&1!==un({b:1},un(hn({},"a",{enumerable:!0,get:function(){hn(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=un({},t)[n]||"abcdefghijklmnopqrst"!=ne(un({},e)).join("")}))?function(t,e){for(var n=M(t),i=arguments.length,r=1,o=Bt.f,s=p.f;i>r;)for(var a,c=y(arguments[r++]),l=o?ne(c).concat(o(c)):ne(c),u=l.length,d=0;u>d;)a=l[d++],h&&!s.call(c,a)||(n[a]=c[a]);return n}:un;function fn(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===on(t,"position")||fn(e))}function pn(t,e){var n=document.body,i=document.documentElement,r=window.pageYOffset||i.scrollTop||n.scrollTop,o=window.pageXOffset||i.scrollLeft||n.scrollLeft;e=e||n;var s=t.getBoundingClientRect(),a=e.getBoundingClientRect(),c=on(e,"position"),l={width:s.width,height:s.height};return"body"!==e.tagName.toLowerCase()&&"relative"===c||"sticky"===c?Object.assign(l,{top:s.top-a.top,left:s.left-a.left}):fn(t)?Object.assign(l,{top:s.top,left:s.left}):Object.assign(l,{top:s.top+r,left:s.left+o})}Jt({target:"Object",stat:!0,forced:Object.assign!==dn},{assign:dn});var vn=Math.floor,gn="".replace,mn=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,_n=/\$([$&'`]|\d{1,2})/g,yn=function(t,e,n,i,r,o){var s=n+t.length,a=i.length,c=_n;return void 0!==r&&(r=M(r),c=mn),gn.call(o,c,(function(o,c){var l;switch(c.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(s);case"<":l=r[c.slice(1,-1)];break;default:var u=+c;if(0===u)return o;if(u>a){var h=vn(u/10);return 0===h?o:h<=a?void 0===i[h-1]?c.charAt(1):i[h-1]+c.charAt(1):o}l=i[u-1]}return void 0===l?"":l}))},bn=G("replace"),wn=Math.max,En=Math.min,An="$0"==="a".replace(/./,"$0"),xn=!!/./[bn]&&""===/./[bn]("a","$0");function kn(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function Tn(t,e){var n="";if(t.style.cssText&&(n+=t.style.cssText),"string"==typeof e)n+=e;else for(var i in e)n+="".concat(i,":").concat(e[i],";");t.style.cssText=n}function Cn(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=pn(e.element,this._targetElement),i=this._options.helperElementPadding;fn(e.element)?rn(t,"introjs-fixedTooltip"):kn(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),Tn(t,{width:"".concat(n.width+i,"px"),height:"".concat(n.height+i,"px"),top:"".concat(n.top-i/2,"px"),left:"".concat(n.left-i/2,"px")})}}ke("replace",(function(t,e,n){var i=xn?"$":"$0";return[function(t,n){var i=b(this),r=null==t?void 0:t[bn];return void 0!==r?r.call(t,i,n):e.call(Zt(i),t,n)},function(t,r){var o=nt(this),s=Zt(t);if("string"==typeof r&&-1===r.indexOf(i)&&-1===r.indexOf("$<")){var a=n(e,o,s,r);if(a.done)return a.value}var c="function"==typeof r;c||(r=Zt(r));var l=o.global;if(l){var u=o.unicode;o.lastIndex=0}for(var h=[];;){var d=Pe(o,s);if(null===d)break;if(h.push(d),!l)break;""===Zt(d[0])&&(o.lastIndex=Se(s,Pt(o.lastIndex),u))}for(var f,p="",v=0,g=0;g<h.length;g++){d=h[g];for(var m=Zt(d[0]),_=wn(En(Ct(d.index),s.length),0),y=[],b=1;b<d.length;b++)y.push(void 0===(f=d[b])?f:String(f));var w=d.groups;if(c){var E=[m].concat(y,_,s);void 0!==w&&E.push(w);var A=Zt(r.apply(void 0,E))}else A=yn(m,s,_,y,w,r);_>=v&&(p+=s.slice(v,_)+A,v=_+m.length)}return p+s.slice(v)}]}),!!u((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")}))||!An||xn);var Sn=G("unscopables"),Pn=Array.prototype;null==Pn[Sn]&&rt.f(Pn,Sn,{configurable:!0,value:de(null)});var Ln,On=It.includes;Jt({target:"Array",proto:!0},{includes:function(t){return On(this,t,arguments.length>1?arguments[1]:void 0)}}),Ln="includes",Pn[Sn][Ln]=!0;var Nn=je("slice"),Rn=G("species"),In=[].slice,jn=Math.max;Jt({target:"Array",proto:!0,forced:!Nn},{slice:function(t,e){var n,i,r,o=w(this),s=Pt(o.length),a=Nt(t,s),c=Nt(void 0===e?s:e,s);if(Le(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Le(n.prototype)?E(n)&&null===(n=n[Rn])&&(n=void 0):n=void 0,n===Array||void 0===n))return In.call(o,a,c);for(i=new(void 0===n?Array:n)(jn(c-a,0)),r=0;a<c;a++,r++)a in o&&Oe(i,r,o[a]);return i.length=r,i}});var Kn=function(t){if(Je(t))throw TypeError("The method doesn't accept regular expressions");return t},Mn=G("match");Jt({target:"String",proto:!0,forced:!function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[Mn]=!1,"/./"[t](e)}catch(t){}}return!1}("includes")},{includes:function(t){return!!~Zt(b(this)).indexOf(Zt(Kn(t)),arguments.length>1?arguments[1]:void 0)}});var qn=function(t,e){var n=[][t];return!!n&&u((function(){n.call(null,e||function(){throw 1},1)}))},Un=[].join,Bn=y!=Object,Dn=qn("join",",");Jt({target:"Array",proto:!0,forced:Bn||!Dn},{join:function(t){return Un.call(w(this),void 0===t?",":t)}});var Fn=[].push,Hn=function(t){var e=1==t,n=2==t,i=3==t,r=4==t,o=6==t,s=7==t,a=5==t||o;return function(c,l,u,h){for(var d,f,p=M(c),v=y(p),g=function(t,e,n){if(Ze(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)}}return function(){return t.apply(e,arguments)}}(l,u,3),m=Pt(v.length),_=0,b=h||Re,w=e?b(c,m):n||s?b(c,0):void 0;m>_;_++)if((a||_ in v)&&(f=g(d=v[_],_,p),t))if(e)w[_]=f;else if(f)switch(t){case 3:return!0;case 5:return d;case 6:return _;case 2:Fn.call(w,d)}else switch(t){case 4:return!1;case 7:Fn.call(w,d)}return o?-1:i||r?r:w}},zn={forEach:Hn(0),map:Hn(1),filter:Hn(2),some:Hn(3),every:Hn(4),find:Hn(5),findIndex:Hn(6),filterReject:Hn(7)}.filter;function Vn(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left="".concat(i.width-n.width-t.left,"px"),!1):(r.style.left="".concat(e,"px"),!0)}function Gn(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left="".concat(-t.left,"px"),!1):(i.style.right="".concat(e,"px"),!0)}Jt({target:"Array",proto:!0,forced:!je("filter")},{filter:function(t){return zn(this,t,arguments.length>1?arguments[1]:void 0)}});var Wn=je("splice"),Yn=Math.max,Qn=Math.min;function $n(t,e){t.includes(e)&&t.splice(t.indexOf(e),1)}function Jn(t,e,n){var i=this._options.positionPrecedence.slice(),r=an(),o=pn(e).height+10,s=pn(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o>r.height&&$n(i,"bottom"),a.top-o<0&&$n(i,"top"),a.right+s>r.width&&$n(i,"right"),a.left-s<0&&$n(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c=i.includes(n)?n:i[0]),["top","bottom"].includes(c)&&(c+=function(t,e,n,i){var r=n.width,o=e/2,s=Math.min(r,window.screen.width),a=["-left-aligned","-middle-aligned","-right-aligned"];return s-t<e&&$n(a,"-left-aligned"),(t<o||s-t<o)&&$n(a,"-middle-aligned"),t<e&&$n(a,"-right-aligned"),a.length?a.includes(i)?i:a[0]:"-middle-aligned"}(a.left,s,r,h)),c}function Zn(t,e,n,i){var r,o,s,a,c,l="";if(i=i||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",this._introItems[this._currentStep])switch(l="string"==typeof(r=this._introItems[this._currentStep]).tooltipClass?r.tooltipClass:this._options.tooltipClass,e.className=["introjs-tooltip",l].filter(Boolean).join(" "),e.setAttribute("role","dialog"),"floating"!==(c=this._introItems[this._currentStep].position)&&this._options.autoPosition&&(c=Jn.call(this,t,e,c)),s=pn(t),o=pn(e),a=an(),rn(e,"introjs-".concat(c)),c){case"top-right-aligned":n.className="introjs-arrow bottom-right";var u=0;Gn(s,u,o,e),e.style.bottom="".concat(s.height+20,"px");break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var h=s.width/2-o.width/2;i&&(h+=5),Gn(s,h,o,e)&&(e.style.right=null,Vn(s,h,o,a,e)),e.style.bottom="".concat(s.height+20,"px");break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",Vn(s,i?0:15,o,a,e),e.style.bottom="".concat(s.height+20,"px");break;case"right":e.style.left="".concat(s.width+20,"px"),s.top+o.height>a.height?(n.className="introjs-arrow left-bottom",e.style.top="-".concat(o.height-s.height-20,"px")):n.className="introjs-arrow left";break;case"left":i||!0!==this._options.showStepNumbers||(e.style.top="15px"),s.top+o.height>a.height?(e.style.top="-".concat(o.height-s.height-20,"px"),n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right="".concat(s.width+20,"px");break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-".concat(o.width/2,"px"),e.style.marginTop="-".concat(o.height/2,"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",Gn(s,u=0,o,e),e.style.top="".concat(s.height+20,"px");break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",h=s.width/2-o.width/2,i&&(h+=5),Gn(s,h,o,e)&&(e.style.right=null,Vn(s,h,o,a,e)),e.style.top="".concat(s.height+20,"px");break;default:n.className="introjs-arrow top",Vn(s,0,o,a,e),e.style.top="".concat(s.height+20,"px")}}function Xn(){n(document.querySelectorAll(".introjs-showElement"),(function(t){kn(t,/introjs-[a-zA-Z]+/g)}))}function ti(t,e){var n=document.createElement(t);e=e||{};var i=/^(?:role|data-|aria-)/;for(var r in e){var o=e[r];"style"===r?Tn(n,o):r.match(i)?n.setAttribute(r,o):n[r]=o}return n}function ei(t,e,n){if(n){var i=e.style.opacity||"1";Tn(e,{opacity:"0"}),window.setTimeout((function(){Tn(e,{opacity:i})}),10)}t.appendChild(e)}function ni(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}function ii(){var t=document.querySelector(".introjs-disableInteraction");null===t&&(t=ti("div",{className:"introjs-disableInteraction"}),this._targetElement.appendChild(t)),Cn.call(this,t)}function ri(t){var e=this,i=ti("div",{className:"introjs-bullets"});!1===this._options.showBullets&&(i.style.display="none");var r=ti("ul");r.setAttribute("role","tablist");var o=function(){e.goToStep(this.getAttribute("data-stepnumber"))};return n(this._introItems,(function(e,n){var i=e.step,s=ti("li"),a=ti("a");s.setAttribute("role","presentation"),a.setAttribute("role","tab"),a.onclick=o,n===t.step-1&&(a.className="active"),ln(a),a.innerHTML="&nbsp;",a.setAttribute("data-stepnumber",i),s.appendChild(a),r.appendChild(s)})),i.appendChild(r),i}function oi(t,e){if(this._options.showBullets){var n=document.querySelector(".introjs-bullets");n.parentNode.replaceChild(ri.call(this,e),n)}}function si(t,e){this._options.showBullets&&(t.querySelector(".introjs-bullets li > a.active").className="",t.querySelector('.introjs-bullets li > a[data-stepnumber="'.concat(e.step,'"]')).className="active")}function ai(){var t=ti("div");t.className="introjs-progress",!1===this._options.showProgress&&(t.style.display="none");var e=ti("div",{className:"introjs-progressbar"});return this._options.progressBarAdditionalClass&&(e.className+=" "+this._options.progressBarAdditionalClass),e.setAttribute("role","progress"),e.setAttribute("aria-valuemin",0),e.setAttribute("aria-valuemax",100),e.setAttribute("aria-valuenow",ni.call(this)),e.style.cssText="width:".concat(ni.call(this),"%;"),t.appendChild(e),t}function ci(t){t.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:".concat(ni.call(this),"%;"),t.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",ni.call(this))}function li(t){var e=this;void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),a=document.querySelector(".introjs-tooltipReferenceLayer"),c="introjs-helperLayer";if("string"==typeof t.highlightClass&&(c+=" ".concat(t.highlightClass)),"string"==typeof this._options.highlightClass&&(c+=" ".concat(this._options.highlightClass)),null!==s&&null!==a){var l=a.querySelector(".introjs-helperNumberLayer"),u=a.querySelector(".introjs-tooltiptext"),h=a.querySelector(".introjs-tooltip-title"),d=a.querySelector(".introjs-arrow"),f=a.querySelector(".introjs-tooltip");r=a.querySelector(".introjs-skipbutton"),i=a.querySelector(".introjs-prevbutton"),n=a.querySelector(".introjs-nextbutton"),s.className=c,f.style.opacity=0,f.style.display="none",sn.call(o,t),Cn.call(o,s),Cn.call(o,a),Xn(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==l&&(l.innerHTML="".concat(t.step," of ").concat(e._introItems.length)),u.innerHTML=t.intro,h.innerHTML=t.title,f.style.display="block",Zn.call(o,t.element,f,d),si.call(o,a,t),ci.call(o,a),f.style.opacity=1,(null!=n&&/introjs-donebutton/gi.test(n.className)||null!=n)&&n.focus(),cn.call(o,t.scrollTo,t,u)}),350)}else{var p=ti("div",{className:c}),v=ti("div",{className:"introjs-tooltipReferenceLayer"}),g=ti("div",{className:"introjs-arrow"}),m=ti("div",{className:"introjs-tooltip"}),_=ti("div",{className:"introjs-tooltiptext"}),y=ti("div",{className:"introjs-tooltip-header"}),b=ti("h1",{className:"introjs-tooltip-title"}),w=ti("div");Tn(p,{"box-shadow":"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, ".concat(o._options.overlayOpacity.toString(),") 0 0 0 5000px")}),sn.call(o,t),Cn.call(o,p),Cn.call(o,v),ei(this._targetElement,p,!0),ei(this._targetElement,v),_.innerHTML=t.intro,b.innerHTML=t.title,w.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(w.style.display="none"),y.appendChild(b),m.appendChild(y),m.appendChild(_),m.appendChild(ri.call(this,t)),m.appendChild(ai.call(this));var E=ti("div");!0===this._options.showStepNumbers&&(E.className="introjs-helperNumberLayer",E.innerHTML="".concat(t.step," of ").concat(this._introItems.length),m.appendChild(E)),m.appendChild(g),v.appendChild(m),(n=ti("a")).onclick=function(){o._introItems.length-1!==o._currentStep?di.call(o):/introjs-donebutton/gi.test(n.className)&&("function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),$i.call(o,o._targetElement))},ln(n),n.innerHTML=this._options.nextLabel,(i=ti("a")).onclick=function(){0!==o._currentStep&&fi.call(o)},ln(i),i.innerHTML=this._options.prevLabel,ln(r=ti("a",{className:"introjs-skipbutton"})),r.innerHTML=this._options.skipLabel,r.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),$i.call(o,o._targetElement)},y.appendChild(r),this._introItems.length>1&&w.appendChild(i),w.appendChild(n),m.appendChild(w),Zn.call(o,t.element,m,g),cn.call(this,t.scrollTo,t,m)}var A=o._targetElement.querySelector(".introjs-disableInteraction");A&&A.parentNode.removeChild(A),t.disableInteraction&&ii.call(o),0===this._currentStep&&this._introItems.length>1?(null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton"),n.innerHTML=this._options.nextLabel),!0===this._options.hidePrev?(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton introjs-hidden")),null!=n&&rn(n,"introjs-fullbutton")):null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton introjs-disabled"))):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton")),!0===this._options.hideNext?(null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton introjs-hidden")),null!=i&&rn(i,"introjs-fullbutton")):null!=n&&(!0===this._options.nextToDone?(n.innerHTML=this._options.doneLabel,rn(n,"".concat(this._options.buttonClass," introjs-nextbutton introjs-donebutton"))):n.className="".concat(this._options.buttonClass," introjs-nextbutton introjs-disabled"))):(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton")),null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton"),n.innerHTML=this._options.nextLabel)),null!=i&&i.setAttribute("role","button"),null!=n&&n.setAttribute("role","button"),null!=r&&r.setAttribute("role","button"),null!=n&&n.focus(),function(t){var e=t.element;rn(e,"introjs-showElement");var n=on(e,"position");"absolute"!==n&&"relative"!==n&&"sticky"!==n&&"fixed"!==n&&rn(e,"introjs-relativePosition")}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function ui(t){this._currentStep=t-2,void 0!==this._introItems&&di.call(this)}function hi(t){this._currentStepNumber=t,void 0!==this._introItems&&di.call(this)}function di(){var t=this;this._direction="forward",void 0!==this._currentStepNumber&&n(this._introItems,(function(e,n){e.step===t._currentStepNumber&&(t._currentStep=n-1,t._currentStepNumber=void 0)})),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var e=this._introItems[this._currentStep],i=!0;return void 0!==this._introBeforeChangeCallback&&(i=this._introBeforeChangeCallback.call(this,e&&e.element)),!1===i?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void $i.call(this,this._targetElement)):void li.call(this,e)}function fi(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t&&t.element)),!1===e)return++this._currentStep,!1;li.call(this,t)}function pi(){return this._currentStep}function vi(t){var e=void 0===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)fi.call(this);else if("ArrowRight"===e||39===e)di.call(this);else if("Enter"===e||"NumpadEnter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?fi.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),$i.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():di.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else $i.call(this,this._targetElement)}function gi(e){if(null===e||"object"!==t(e)||void 0!==e.nodeType)return e;var n={};for(var i in e)void 0!==window.jQuery&&e[i]instanceof window.jQuery?n[i]=e[i]:n[i]=gi(e[i]);return n}function mi(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function _i(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];Ci.call(this),e&&rn(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function yi(){var t=this;n(mi(".introjs-hint"),(function(e){_i.call(t,e.getAttribute("data-step"))}))}function bi(){var t=this,e=mi(".introjs-hint");e&&e.length?n(e,(function(e){wi.call(t,e.getAttribute("data-step"))})):Si.call(this,this._targetElement)}function wi(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];e&&kn(e,/introjs-hidehint/g)}function Ei(){var t=this;n(mi(".introjs-hint"),(function(e){Ai.call(t,e.getAttribute("data-step"))}))}function Ai(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];e&&e.parentNode.removeChild(e)}function xi(){var t=this,e=this,i=document.querySelector(".introjs-hints");null===i&&(i=ti("div",{className:"introjs-hints"}));n(this._introItems,(function(n,r){if(!document.querySelector('.introjs-hint[data-step="'.concat(r,'"]'))){var o=ti("a",{className:"introjs-hint"});ln(o),o.onclick=function(t){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),Ti.call(e,t)}}(r),n.hintAnimation||rn(o,"introjs-hint-no-anim"),fn(n.element)&&rn(o,"introjs-fixedhint");var s=ti("div",{className:"introjs-hint-dot"}),a=ti("div",{className:"introjs-hint-pulse"});o.appendChild(s),o.appendChild(a),o.setAttribute("data-step",r),n.targetElement=n.element,n.element=o,ki.call(t,n.hintPosition,o,n.targetElement),i.appendChild(o)}})),document.body.appendChild(i),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function ki(t,e,n){var i=e.style,r=pn.call(this,n);switch(t){default:case"top-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top,"px");break;case"top-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top,"px");break;case"bottom-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"bottom-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"middle-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"middle-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"middle-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"bottom-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"top-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top,"px")}}function Ti(t){var e=document.querySelector('.introjs-hint[data-step="'.concat(t,'"]')),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=Ci.call(this);if(parseInt(i,10)!==t){var r=ti("div",{className:"introjs-tooltip"}),o=ti("div"),s=ti("div"),a=ti("div");r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=ti("p");c.innerHTML=n.hint;var l=ti("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=_i.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),Cn.call(this,a),a.appendChild(r),document.body.appendChild(a),Zn.call(this,e,r,s,!0)}}function Ci(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function Si(t){var e=this;if(this._introItems=[],this._options.hints)n(this._options.hints,(function(t){var n=gi(t);"string"==typeof n.element&&(n.element=document.querySelector(n.element)),n.hintPosition=n.hintPosition||e._options.hintPosition,n.hintAnimation=n.hintAnimation||e._options.hintAnimation,null!==n.element&&e._introItems.push(n)}));else{var r=t.querySelectorAll("*[data-hint]");if(!r||!r.length)return!1;n(r,(function(t){var n=t.getAttribute("data-hintanimation");n=n?"true"===n:e._options.hintAnimation,e._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||e._options.hintPosition,hintAnimation:n,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition})}))}xi.call(this),i.on(document,"click",Ci,this,!1),i.on(window,"resize",Pi,this,!0)}function Pi(){var t=this;n(this._introItems,(function(e){var n=e.targetElement,i=e.hintPosition,r=e.element;void 0!==n&&ki.call(t,i,r,n)}))}Jt({target:"Array",proto:!0,forced:!Wn},{splice:function(t,e){var n,i,r,o,s,a,c=M(this),l=Pt(c.length),u=Nt(t,l),h=arguments.length;if(0===h?n=i=0:1===h?(n=0,i=l-u):(n=h-2,i=Qn(Yn(Ct(e),0),l-u)),l+n-i>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(r=Re(c,i),o=0;o<i;o++)(s=u+o)in c&&Oe(r,o,c[s]);if(r.length=i,n<i){for(o=u;o<l-i;o++)a=o+n,(s=o+i)in c?c[a]=c[s]:delete c[a];for(o=l;o>l-i+n;o--)delete c[o-1]}else if(n>i)for(o=l-i;o>u;o--)a=o+n-1,(s=o+i-1)in c?c[a]=c[s]:delete c[a];for(o=0;o<n;o++)c[o+u]=arguments[o+2];return c.length=l-i+n,r}});var Li=Math.floor,Oi=function(t,e){var n=t.length,i=Li(n/2);return n<8?Ni(t,e):Ri(Oi(t.slice(0,i),e),Oi(t.slice(i),e),e)},Ni=function(t,e){for(var n,i,r=t.length,o=1;o<r;){for(i=o,n=t[o];i&&e(t[i-1],n)>0;)t[i]=t[--i];i!==o++&&(t[i]=n)}return t},Ri=function(t,e,n){for(var i=t.length,r=e.length,o=0,s=0,a=[];o<i||s<r;)o<i&&s<r?a.push(n(t[o],e[s])<=0?t[o++]:e[s++]):a.push(o<i?t[o++]:e[s++]);return a},Ii=Oi,ji=k.match(/firefox\/(\d+)/i),Ki=!!ji&&+ji[1],Mi=/MSIE|Trident/.test(k),qi=k.match(/AppleWebKit\/(\d+)\./),Ui=!!qi&&+qi[1],Bi=[],Di=Bi.sort,Fi=u((function(){Bi.sort(void 0)})),Hi=u((function(){Bi.sort(null)})),zi=qn("sort"),Vi=!u((function(){if(L)return L<70;if(!(Ki&&Ki>3)){if(Mi)return!0;if(Ui)return Ui<603;var t,e,n,i,r="";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(i=0;i<47;i++)Bi.push({k:e+i,v:n})}for(Bi.sort((function(t,e){return e.v-t.v})),i=0;i<Bi.length;i++)e=Bi[i].k.charAt(0),r.charAt(r.length-1)!==e&&(r+=e);return"DGBEFHACIJK"!==r}}));function Gi(t){var e=this,i=t.querySelectorAll("*[data-intro]"),r=[];if(this._options.steps)n(this._options.steps,(function(t){var n=gi(t);if(n.step=r.length+1,n.title=n.title||"","string"==typeof n.element&&(n.element=document.querySelector(n.element)),void 0===n.element||null===n.element){var i=document.querySelector(".introjsFloatingElement");null===i&&(i=ti("div",{className:"introjsFloatingElement"}),document.body.appendChild(i)),n.element=i,n.position="floating"}n.position=n.position||e._options.tooltipPosition,n.scrollTo=n.scrollTo||e._options.scrollTo,void 0===n.disableInteraction&&(n.disableInteraction=e._options.disableInteraction),null!==n.element&&r.push(n)}));else{var o;if(i.length<1)return[];n(i,(function(t){if((!e._options.group||t.getAttribute("data-intro-group")===e._options.group)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);o=t.hasAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):e._options.disableInteraction,n>0&&(r[n-1]={element:t,title:t.getAttribute("data-title")||"",intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||e._options.scrollTo,disableInteraction:o})}}));var s=0;n(i,(function(t){if((!e._options.group||t.getAttribute("data-intro-group")===e._options.group)&&null===t.getAttribute("data-step")){for(;void 0!==r[s];)s++;o=t.hasAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):e._options.disableInteraction,r[s]={element:t,title:t.getAttribute("data-title")||"",intro:t.getAttribute("data-intro"),step:s+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||e._options.scrollTo,disableInteraction:o}}}))}for(var a=[],c=0;c<r.length;c++)r[c]&&a.push(r[c]);return(r=a).sort((function(t,e){return t.step-e.step})),r}function Wi(t){var e=document.querySelector(".introjs-tooltipReferenceLayer"),n=document.querySelector(".introjs-helperLayer"),i=document.querySelector(".introjs-disableInteraction");if(Cn.call(this,n),Cn.call(this,e),Cn.call(this,i),t&&(this._introItems=Gi.call(this,this._targetElement),oi.call(this,e,this._introItems[this._currentStep]),ci.call(this,e)),void 0!==this._currentStep&&null!==this._currentStep){var r=document.querySelector(".introjs-arrow"),o=document.querySelector(".introjs-tooltip");Zn.call(this,this._introItems[this._currentStep].element,o,r)}return Pi.call(this),this}function Yi(){Wi.call(this)}function Qi(t,e){if(t&&t.parentElement){var n=t.parentElement;e?(Tn(t,{opacity:"0"}),window.setTimeout((function(){try{n.removeChild(t)}catch(t){}}),500)):n.removeChild(t)}}function $i(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&n(o,(function(t){return Qi(t)})),Qi(t.querySelector(".introjs-helperLayer"),!0),Qi(t.querySelector(".introjs-tooltipReferenceLayer")),Qi(t.querySelector(".introjs-disableInteraction")),Qi(document.querySelector(".introjsFloatingElement")),Xn(),i.off(window,"keydown",vi,this,!0),i.off(window,"resize",Yi,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function Ji(t){var e=this,n=ti("div",{className:"introjs-overlay"});return Tn(n,{top:0,bottom:0,left:0,right:0,position:"fixed"}),t.appendChild(n),!0===this._options.exitOnOverlayClick&&(Tn(n,{cursor:"pointer"}),n.onclick=function(){$i.call(e,t)}),!0}function Zi(t){var e=Gi.call(this,t);return 0===e.length||(this._introItems=e,Ji.call(this,t)&&(di.call(this),this._options.keyboardNavigation&&i.on(window,"keydown",vi,this,!0),i.on(window,"resize",Yi,this,!0))),!1}Jt({target:"Array",proto:!0,forced:Fi||!Hi||!zi||!Vi},{sort:function(t){void 0!==t&&Ze(t);var e=M(this);if(Vi)return void 0===t?Di.call(e):Di.call(e,t);var n,i,r=[],o=Pt(e.length);for(i=0;i<o;i++)i in e&&r.push(e[i]);for(n=(r=Ii(r,function(t){return function(e,n){return void 0===n?-1:void 0===e?1:void 0!==t?+t(e,n)||0:Zt(e)>Zt(n)?1:-1}}(t))).length,i=0;i<n;)e[i]=r[i++];for(;i<o;)delete e[i++];return e}});function Xi(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next",prevLabel:"Back",skipLabel:"×",doneLabel:"Done",hidePrev:!1,hideNext:!1,nextToDone:!0,tooltipPosition:"bottom",tooltipClass:"",group:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!1,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.5,autoPosition:!0,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button",progressBarAdditionalClass:!1}}var tr=function n(i){var r;if("object"===t(i))r=new Xi(i);else if("string"==typeof i){var o=document.querySelector(i);if(!o)throw new Error("There is no element with given selector.");r=new Xi(o)}else r=new Xi(document.body);return n.instances[e(r,"introjs-instance")]=r,r};return tr.version="4.2.2",tr.instances={},tr.fn=Xi.prototype={clone:function(){return new Xi(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(){return Zi.call(this,this._targetElement),this},goToStep:function(t){return ui.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return hi.call(this,t),this},nextStep:function(){return di.call(this),this},previousStep:function(){return fi.call(this),this},currentStep:function(){return pi.call(this)},exit:function(t){return $i.call(this,this._targetElement,t),this},refresh:function(t){return Wi.call(this,t),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return Si.call(this,this._targetElement),this},hideHint:function(t){return _i.call(this,t),this},hideHints:function(){return yi.call(this),this},showHint:function(t){return wi.call(this,t),this},showHints:function(){return bi.call(this),this},removeHints:function(){return Ei.call(this),this},removeHint:function(t){return Ai().call(this,t),this},showHintDialog:function(t){return Ti.call(this,t),this}},tr})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welcti=s.TOUR_welcti||"<span class='tgreeting'> Welcome to our guided tour! </span>",s.TOUR_welc=s.TOUR_welc||"This tour should give you a quick introduction to KorAP. We lead you step by step through an example.",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.5,exitOnOverlayClick:!1,disableInteraction:!0,tooltipClass:"customTooltip",hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{element:"#link-guided-tour",title:s.TOUR_welcti,intro:s.TOUR_welc,position:"right"},{title:s.TOUR_sear1ti,element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{title:s.TOUR_searAnnotti,element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{title:s.TOUR_annotAssti,element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{title:s.TOUR_vccho1ti,element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{title:s.TOUR_vccho2ti,element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{title:s.TOUR_vcStat1ti,element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{title:s.TOUR_vcStat2ti,element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{title:s.TOUR_qlfieldti,element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{title:s.TOUR_glimpseti,element:l.querySelector("#glimpse").parentNode,intro:s.TOUR_glimpse,position:"bottom"},{title:s.TOUR_helpti,element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{title:s.TOUR_seargoti,element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions().add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},setIfNotYet:function(t){null==this.value&&this.set(t)},get:function(){return null==this.value&&(this.value=this.values[0]),this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.get()==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","pageInfo","util"],(function(t,e,n,i){KorAP.Panel=KorAP.Panel||{};var r={},o={},s={match:[]},a={query:[],result:[]},c={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var i=t.desc,c=o[e]={name:e,desc:i,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let o=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!s[u]&&!a[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);void 0!==h.default&&t.setIfNotYet(h.default),KorAP.Panel[u].actions().addToggle(o,{cls:["title"]},t);let i=this.addService({name:e,src:h.template,permissions:h.permissions}),s=r[i];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(i)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(r[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:i});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?r[n].minimize():r[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),s[u]?s[u].push([o,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions().add(o,p,f):a[u].push([o,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=s[t]?s[t]:null!=a[t]?a[t]:[]},clearButtonGroup:function(t){null!=s[t]?s[t]=[]:null!=a[t]&&(a[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<c.length;t++)c[t]++>=100&&(c[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let i=e.create(t);return r[n]=i,c[n]=100,this.element().appendChild(i.load()),n},addWidget:function(e,n){let i=this._getServiceID();n.id=i;var o=t.create(n);return r[i]=o,c[i]=100,o._mgr=this,e.add(o),i},service:function(t){return r[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let o=r[n];if(o){if(c[n]--<0)return KorAP.log(0,"Suspicious action by service",o.src),this._closeService(o.id),void o.close();switch(e.action){case"resize":o.isWidget&&o.resize(e);break;case"log":KorAP.log(e.code,e.msg,o.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var s;(s=t.getElementById("q-field"))&&(n.q=s.value),(s=t.getElementById("ql-field"))&&(n.ql=s.value),(s=KorAP.vc)&&(n.cq=s.toQuery())}else if("QueryParam"==e.key){var a=new URLSearchParams(window.location.search);let t=e.value={};t.search=window.location.search,t.q=a.get("q"),t.ql=a.get("ql"),t.cq=a.get("cq")}else if("Pagination"==e.key){const t=i.create();let n=e.value={};n.page=t.page(),n.total=t.total(),n.count=t.count()}e._id&&o.sendMsg(e);break;case"redirect":const t=new URL(window.location);e.queryParam&&(t.search=new URLSearchParams(e.queryParam)),window.location=t.toString()}}},_closeService:function(t){delete c[t],r[t]&&r[t]._closeIframe&&(r[t]._closeIframe(),delete r[t]),0==Object.keys(c).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(c={},Object.keys(r).forEach(t=>r[t].close()),r={},Object.keys(s).forEach(t=>s[t]=[]),Object.keys(a).forEach(t=>a[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){console.log(arguments);const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onload=function(){console.log(s.responseText)},s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText+" - "+JSON.parse(this.responseText).errors[0].message})}},"POST"===t||"PUT"===t?(console.log("JSON: \n",JSON.stringify(i)),console.log(s),s.send(JSON.stringify(i))):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","panel/pagination","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p,v){const g=document;KorAP.URL=g.body.getAttribute("data-korap-url")||"";const m=g.getElementById("koralQuery");let _;null!==m&&(KorAP.koralQuery=JSON.parse(m.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(_=document.getElementById("link-guided-tour"))&&(_.setAttribute("href","#"),_.addEventListener("click",(function(){f.gTstartSearch().start()})),KorAP.tourshowR=function(){f.gTshowResults().start()}),r((function(n){var r,o,a={},m=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},g.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var _=g.getElementById("cq"),y=KorAP.vc;if(_){if(_.style.display="none",(r=g.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{y.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(y.getName()),y.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var b=g.querySelectorAll("#search > ol > li");b.forEach((function(e){e.classList.contains("active")?void 0===e._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}));var w=g.getElementsByTagName("aside")[0];if(w&&0==w.classList.contains("active")){var E=!1;w.addEventListener("focus",(function(t){this.classList.add("active")}));var A=g.getElementsByTagName("body")[0];null!==A&&A.addEventListener("click",(function(){E?E=!1:w.classList.remove("active")})),w.addEventListener("click",(function(t){E=!0}))}null!==g.getElementById("ql-field")&&(KorAP.QLmenu=c.create(g.getElementById("ql-field").parentNode).limit(5));var x=g.getElementById("resultinfo"),k=l.create(m);if(null!=x){x.appendChild(k.actions().element());var T=g.getElementById("search");T.insertBefore(k.element(),T.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==x&&k.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),b.length>0&&k.addAlignAction(),KorAP.Panel.result=k,r){y.onMinimize=function(){r.classList.remove("active"),delete m.vc},y.onOpen=function(){r.classList.add("active");var t=g.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),m.vc=!0};var C=function(){y.isOpen()?y.minimize():y.open()};r.onclick=C,m.vc&&C.apply()}g.getElementById("view-tutorial")?(window.tutorial=i.create(g.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(g),a.tutorial.initDocLinks(g));var S=g.getElementById("searchform");null!==S&&S.addEventListener("submit",(function(t){var e=g.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",m),void 0!==y?(_.value=y.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),g.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&f.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var P=u.create(),L=g.getElementById("searchform"),O=g.getElementById("vc-view");L&&O&&(L.insertBefore(P.element(),O),KorAP.Panel.query=P);const N=d.create();let R;if(N&&(N.addRandomPage(),KorAP.Panel.pagination=N),function(t){const e=t.querySelectorAll("input.copy-to-clipboard");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("copy-to-clipboard"),i.addEventListener("click",(function(){let t=!1;"password"===n.getAttribute("type")&&(n.setAttribute("type","text"),t=!0),n.select(),n.setSelectionRange(0,99999),document.execCommand("copy"),t&&n.setAttribute("type","password")})),n.parentNode.insertBefore(i,n.nextSibling)}}(g),function(t){const e=t.querySelectorAll("input[type=password].show-pwd");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("show-pwd"),i.addEventListener("click",(function(){if("password"===n.getAttribute("type"))return n.setAttribute("type","text"),void i.classList.add("hide");n.setAttribute("type","password"),i.classList.remove("hide")})),n.parentNode.insertBefore(i,n.nextSibling)}}(g),R=g.getElementById("kalamar-plugins")){let t=R.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=p.create(),g.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=v.create(),g.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","loc/de","init"]),n("app/de",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.1-de.js.map b/public/js/kalamar-0.43.1-de.js.map
new file mode 100644
index 0000000..e225558
--- /dev/null
+++ b/public/js/kalamar-0.43.1-de.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.43.1-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","upgradeTo","props","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welcti","TOUR_welc","TOUR_sear1ti","TOUR_sear1","TOUR_searAnnotti","TOUR_searAnnot","TOUR_annotAssti","TOUR_annotAss","TOUR_vccho1ti","TOUR_vccho1","TOUR_vccho2ti","TOUR_vccho2","TOUR_vcStat1ti","TOUR_vcStat1","TOUR_vcStat2ti","TOUR_vcStat2","TOUR_qlfieldti","TOUR_qlfield","TOUR_glimpseti","TOUR_glimpse","TOUR_helpti","TOUR_help","TOUR_seargoti","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","RANDOM_PAGE","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","_prefixPosition","cItem","addMenu","addPrefix","prefItem","removeItem","removeItemByIndex","exit","makeActive","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","ds","dataset","total","count","pageInfoClass","pagEl","bg","lastElementChild","_bg","addRandomPage","pi","sp","URLSearchParams","factory","globalThis","introJs","_typeof","Symbol","iterator","forEachFnc","completeFnc","DOMEvent","events_key","_id","listener","on","useCapture","handler","commonjsGlobal","createCommonjsModule","version$1","global_1","fails","descriptors","$propertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor$1","getOwnPropertyDescriptor","objectPropertyIsEnumerable","V","createPropertyDescriptor","bitmap","classofRaw","indexedObject","requireObjectCoercible","toIndexedObject","aFunction$1","getBuiltIn","namespace","method","engineUserAgent","process","Deno","versions","v8","engineV8Version","nativeSymbol","getOwnPropertySymbols","symbol","sham","useSymbolAsUid","isSymbol","$Symbol","setGlobal","sharedStore","shared","mode","copyright","toObject","argument","has$1","postfix","uid","WellKnownSymbolsStore","Symbol$1","createWellKnownSymbol","withoutSetter","wellKnownSymbol","TO_PRIMITIVE","toPrimitive","exoticToPrim","ordinaryToPrimitive","toPropertyKey","document$1","EXISTS","documentCreateElement","ie8DomDefine","$getOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","anObject","$defineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","functionToString","inspectSource","WeakMap$1","WeakMap","nativeWeakMap","sharedKey","hiddenKeys$1","wmget","wmhas","wmset","metadata","facade","STATE","activeXDocument","internalState","enforce","getterFor","TYPE","redefine","getInternalState","enforceInternalState","TEMPLATE","unsafe","simple","noTargetGet","floor$2","toInteger","min$4","toLength","max$3","min$3","toAbsoluteIndex","integer","createMethod$2","IS_INCLUDES","$this","arrayIncludes","objectKeysInternal","names","enumBugKeys","hiddenKeys","objectGetOwnPropertyNames","getOwnPropertyNames","objectGetOwnPropertySymbols","ownKeys","copyConstructorProperties","replacement","isForced","feature","detection","POLYFILL","NATIVE","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","toString_1","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","regexpStickyHelpers","UNSUPPORTED_Y","BROKEN_CARET","objectKeys","objectDefineProperties","defineProperties","Properties","IE_PROTO","EmptyConstructor","scriptTag","LT","NullProtoObjectViaActiveX","parentWindow","NullProtoObject","ActiveXObject","domain","iframeDocument","iframe","contentWindow","F","NullProtoObjectViaIFrame","re1","re2","objectCreate","regexpUnsupportedDotAll","flags","regexpUnsupportedNcg","groups","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","UNSUPPORTED_Y$1","NPCG_INCLUDED","reCopy","raw","charsAdded","strCopy","regexpExec","SPECIES$4","RegExpPrototype$1","fixRegexpWellKnownSymbolLogic","KEY","FORCED","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","regexp","arg2","forceStringMethod","$exec","done","createMethod$1","CONVERT_TO_STRING","second","codeAt","advanceStringIndex","regexpExecAbstract","MATCH","nativeMatch","maybeCallNative","matcher","rx","res","fullUnicode","A","matchStr","arg","createProperty","propertyKey","SPECIES$3","arraySpeciesCreate","originalArray","SPECIES$2","arrayMethodHasSpeciesSupport","METHOD_NAME","foo","IS_CONCAT_SPREADABLE","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","test$1","toStringTagSupport","TO_STRING_TAG","CORRECT_ARGUMENTS","classof","tryGet","callee","objectToString","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","MATCH$1","isRegexp","aFunction","SPECIES$1","arrayPush","min$2","addClass","SVGElement","pre","getPropValue","propName","propValue","currentStyle","defaultView","scrollParentToElement","targetElement","_options","scrollToElement","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","getScrollParent","offsetTop","getWinSize","innerWidth","innerHeight","D","documentElement","tooltipLayer","elementInViewport","winHeight","scrollBy","scrollPadding","setAnchorAsButton","tabIndex","SPLIT","nativeSplit","internalSplit","separator","lastLength","output","lastLastIndex","separatorCopy","splitter","defaultConstructor","speciesConstructor","unicodeMatching","z","originalExec","$assign","objectAssign","chr","T","argumentsLength","isFixed","getOffset","relativeEl","docEl","pageYOffset","xr","relativeElPosition","floor$1","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","getSubstitution","matched","captures","namedCaptures","tailPos","symbols","ch","capture","REPLACE","max$2","min$1","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","removeClass","classNameRegex","setStyle","cssText","rule","setHelperLayerPosition","helperLayer","_introItems","_currentStep","currentElement","elementPosition","_targetElement","widthHeightPadding","helperElementPadding","UNSAFE_SUBSTITUTE","searchValue","replaceValue","replacer","functionalReplace","accumulatedResult","nextSourcePosition","replacerArgs","UNSCOPABLES","ArrayPrototype","$includes","HAS_SPECIES_SUPPORT$2","SPECIES","nativeSlice","max$1","Constructor","fin","notARegexp","error1","error2","correctIsRegexpLogic","searchString","arrayMethodIsStrict","nativeJoin","ES3_STRINGS","STRICT_METHOD$1","createMethod","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","specificCreate","boundFunction","functionBindContext","$filter","filterReject","checkRight","targetOffset","tooltipLayerStyleLeft","tooltipOffset","windowSize","checkLeft","tooltipLayerStyleRight","HAS_SPECIES_SUPPORT","removeEntry","stringArray","stringToRemove","_determineAutoPosition","desiredTooltipPosition","possiblePositions","positionPrecedence","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","_determineAutoAlignment","placeTooltip","arrowLayer","hintMode","currentStepObj","currentTooltipPosition","tooltipCssClass","marginTop","tooltipClass","autoPosition","tooltipLayerStyleLeftRight","showStepNumbers","removeShowElement","elm","_createElement","tagname","setAttRegex","animate","existingOpacity","opacity","_getProgress","_disableInteraction","disableInteractionLayer","_createBullets","bulletsLayer","showBullets","ulContainer","anchorClick","goToStep","innerLi","anchorLink","_recreateBullets","oldReferenceLayer","existing","_updateBullets","_createProgressBar","progressLayer","showProgress","progressBar","progressBarAdditionalClass","_updateProgressBar","_showElement","_this","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","oldHelperLayer","highlightClass","oldHelperNumberLayer","oldtooltipLayer","oldTooltipTitleLayer","oldArrowLayer","oldtooltipContainer","_lastShowElementTimer","intro","referenceLayer","tooltipTextLayer","tooltipHeaderLayer","tooltipTitleLayer","buttonsLayer","box-shadow","overlayOpacity","showButtons","helperNumberLayer","nextStep","_introCompleteCallback","exitIntro","nextLabel","previousStep","prevLabel","skipLabel","_introSkipCallback","disableInteraction","buttonClass","hidePrev","hideNext","nextToDone","doneLabel","currentElementPosition","setShowElement","_introAfterChangeCallback","goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","currentStep","onKeyDown","which","exitOnEsc","srcElement","returnValue","cloneObject","hintQuerySelectorAll","selector","hintsWrapper","hideHint","stepId","removeHintTooltip","_hintCloseCallback","hideHints","showHints","_this2","hints","showHint","populateHints","removeHints","_this3","removeHint","addHints","_this4","evt","cancelBubble","showHintDialog","getHintClick","hintAnimation","hintDot","hintPulse","alignHintPosition","hintPosition","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","hintButtonLabel","tooltip","targetElm","_this5","currentItem","tooltipPosition","reAlignHints","_this6","_ref2","deleteCount","insertCount","actualDeleteCount","actualStart","mergeSort","comparefn","insertionSort","llength","rlength","lindex","rindex","arraySort","firefox","engineFfVersion","engineIsIeOrEdge","webkit","engineWebkitVersion","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","STRICT_METHOD","STABLE_SORT","fetchIntroSteps","allIntroSteps","introItems","steps","floatingElementQuery","tempIntroItems","refresh","refreshSteps","onResize","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","_introExitCallback","addOverlayLayer","exitOnOverlayClick","cursor","introForElement","keyboardNavigation","itemsLength","arrayLength","getSortCompare","IntroJs","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","mergeOptions","addStep","addSteps","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","setIfNotYet","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","responseText","onreadystatechange","retJSObj","status","statusText","errors","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","paginationPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","paginationPanel","pe","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n/**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\nObject.prototype.upgradeTo  = function (props) {\r\n  for (let prop in props) {\r\n    this[prop] = props[prop];\r\n  };\r\n  return this;\r\n};\r\n\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\r\n\nwindow.KorAP = window.KorAP || {};\r\n\r\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined) {\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    }\r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array(); //all childNodes, i.e. ItemClass, prefixClass\r\n\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined; //filtered List containing all itemClass items\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n\r\n    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      //Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n    removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      //Upon Change please update alwaysmenu.js prev\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[this._notItemElements]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\n// TODO:\r\n//   Add addToggle() method\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the list of items and the itemClass.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\tthis.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\r\n     */\r\n    panel : function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n\r\n      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\r\n    },\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\r\n    },\r\n\r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor !== null && anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\r\n    },\r\n    \r\n\r\n    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\r\n    },\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \r\n      let b = this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      b.list = list;\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t._actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions().element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this._actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this._actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions().element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n \r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  //Guided Tour: Steps\r\n  loc.TOUR_welcti = \" <span class='tgreeting'> Willkommen zur KorAP Tour! </span>\";\r\n  loc.TOUR_welc = \"Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n                  \"Wir führen Sie Schritt für Schritt anhand eines Beispiels durch die Anwendung.\";\r\n  \r\n  loc.TOUR_sear1ti = \"Suchanfrage\";\r\n  loc.TOUR_sear1 = \"Hier können Sie die Suchanfrage eingeben, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnotti = \"Annotationsassistent (1)\";\r\n  loc.TOUR_searAnnot =\"<p> Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung. </p> \" +\r\n            \"<p> Er wird ausgewählt, in dem Sie auf den kleinen orangen Balken unter dem Sucheingabefenster klicken \" +\r\n            \"oder die Pfeiltaste nach unten &darr; betätigen. </p>\";\r\n  loc.TOUR_annotAssti = \"Annotationsassistent (2)\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1ti = \"Auswahl der Korpora\",\r\n  loc.TOUR_vccho1 = \"Hier gelangen Sie zum Korpusassistenten.\";\r\n  loc.TOUR_vccho2ti = \"Korpusassistent\",\r\n  loc.TOUR_vccho2 = \"Im Korpusassistenten ist die Definition von Subkorpora durch die Verknüpfung beliebiger Metadatenfelder möglich.\";\r\n  loc.TOUR_vcStat1ti =  \"Korpusstatistik (1)\",\r\n  loc.TOUR_vcStat1 = \"Anzeige der Korpusstatistik.\";\r\n  loc.TOUR_vcStat2ti = \"Korpusstatistik (2)\",\r\n  loc.TOUR_vcStat2 = \"Hier sehen sie die Korpusstatistik.\";\r\n  loc.TOUR_qlfieldti =  \"Suchanfragen\",\r\n  loc.TOUR_qlfield = \"In KorAP können mehrere Suchanfragesprachen verwendet werden. Welche Sie verwenden wollen, wählen Sie hier aus.\";\r\n  loc.TOUR_glimpseti = \"Glimpse\",\r\n  loc.TOUR_glimpse = \"Durch das Aktivieren dieser Option legen Sie fest, dass nur die ersten Treffer in undefinierter Reihenfolge angezeigt werden.\";\r\n  loc.TOUR_helpti = \"Hilfe\",\r\n  loc.TOUR_help = \"Hier finden Sie die Hilfe zu KorAP.\";\r\n  loc.TOUR_seargoti = \"Suche\",\r\n  loc.TOUR_seargo = \"Durch das Klicken auf das Lupensymbol wird die Suchanfrage gestartet.\";\r\n    \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n\r\n  // Pagination panel\r\n  loc.RANDOM_PAGE = 'Zufallsseite';\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"^(?:[^ \\:\\.\\'\\\\\\\\\\|\\&]+:)?[^ \\:\\.\\'\\\\\\\\\\|\\&]+$\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) === null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\r\n\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n    * \r\n    * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n    * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n    * @returns The container object\r\n    */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      //items are stored in the order they are added in. This includes the prefix.\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container,\r\n      // 0 to length-1 = in container\r\n\r\n      this._prefixPosition = undefined; //Required so that switching\r\n      // to prefix by default is supported\r\n\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\r\n\r\n  },\r\n\r\n    /**\r\n     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      this._prefixPosition = this.items.length;\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n    \r\n    //Taken from Branch 5133\r\n    /**\r\n    * Remove a containeritem from the container by identity. Should not be used with prefix.\r\n    * If the active item is removed, this calls menu.next().\r\n    * @param {containerItemClass} item The item to be removed.\r\n    */\r\n     removeItem : function (item) {\r\n      if (item.active()) {\r\n        this._menu.next();\r\n      }\r\n      item._menu=undefined;\r\n      this._el.removeChild(item.element());\r\n      this.items.splice(this.items.indexOf(item) , 1);\r\n      //TODO what to do when we completely empty the item and containeritem lists???\r\n      //Nothing is active anymore and the arrow keys do not work then.\r\n    },\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      if (index < 0 || index >= this.length()){\r\n        KorAP.log(0,\"Invalid index in containers removeItemByIndex: \"+index, \"container.js\");\r\n        return;\r\n      };\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n    /**\r\n    * Exit the container unconditionally. Required so that active returns the\r\n    * correct result. Called when the prefix or similar resets the currently visual\r\n    * field.\r\n    */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n    * @returns whether an item within the container is active (by checking this.position)\r\n    */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n    * Getter for items\r\n    * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n    * @returns item at location index\r\n    */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * \r\n     * Make the container active without having called prev or next.\r\n     * Occurs whenever the prefix makes the\r\n     * menus list empty while we had it selected.\r\n     * This potentially requires adjusting this.position.\r\n     */\r\n     makeActive : function () {\r\n      if (this.position === undefined) {\r\n        if (this._cItemPrefix.isSelectable()) {\r\n          this.position = this._prefixPosition; //make prefix active if it exists\r\n          this.item().active(true);\r\n        } else if (this.liveLength() > 0) {\r\n          this.position = 0;\r\n          this._cItemPrefix.active(false); // usually the menu makes the prefix active anyway.\r\n          this.item().active(true);\r\n        }\r\n      }\r\n    },\r\n    \r\n    /**\r\n     * \r\n    * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n    * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n    * \r\n    * @returns The number of items that are selectable. Is the actual length of the list.\r\n    */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\r\n\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //There are only four new lines, marked with NEW\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n      t.container().exit(); //NEW\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);        \r\n        t.container().makeActive(); //NEW Incase the own\r\n        // list becomes empty we need to make container active for line 129 to work\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._el.classList.add('visible'); //NEW\r\n\r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n      t.container()._el.classList.add('visible'); //NEW\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () { //only one new line\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\r\n        };\r\n      }// The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        }\r\n      }\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n    \r\n    /**\r\n    * Upgrade this object to another object,\r\n    * while private data stays intact.\r\n    *\r\n    * @param {Object} An object with properties.\r\n    */\r\n   upgradeTo : function (props) {\r\n     for (var prop in props) {\r\n       this[prop] = props[prop];\r\n     };\r\n     return this;\r\n   },\r\n\r\n    /**\r\n     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\r\n\r\n\r\n  };\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menuCollection   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menuCollection[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menuCollection[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menuCollection[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions().add.apply(this.actions(), i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions().add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions().add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions();\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The pagination panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/pagination',[\r\n  'panel',\r\n  'buttongroup',\r\n  'pageInfo'\r\n], function (panelClass, buttonGroupClass, pageInfoClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.RANDOM_PAGE = loc.RANDOM_PAGE || 'Random page';\r\n\r\n  \r\n  return {\r\n    create : function () {\r\n      return Object.create(panelClass)._init(['pagination']).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function () {\r\n\r\n      // Override existing button group\r\n      // This allows actions.add() ... to work for list items in server.js\r\n      let pagEl = document.getElementById(\"pagination\");\r\n      if (pagEl === null) {\r\n        return null;\r\n      };\r\n\r\n      // Do not show if no pages exist\r\n      if (pagEl.getAttribute('data-total') === '0') {\r\n        return null;\r\n      };\r\n\r\n      this._actions.panel = undefined;\r\n      this._actions.clear();\r\n\r\n      const bg = buttonGroupClass.adopt(pagEl);\r\n      bg._omOutside = true;\r\n      bg._omLeft = true;\r\n      \r\n      bg.anchor(pagEl.lastElementChild);\r\n\r\n      let button = bg.addList(\"More\", {'cls':['button-group-list','button-icon']});\r\n      this._actions = button.list;\r\n      this._bg = bg;\r\n\r\n      button.setAttribute('data-icon',\"\\uf0c9\");\r\n\r\n      // Warning: This is circular\r\n      this._actions.panel = this;\r\n     \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The buttongroup holding the pagination panel.\r\n     * This differs from action, as action contains the list.\r\n     */\r\n    buttonGroup : function () {\r\n      return this._bg;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add random paginator to list\r\n     */\r\n    addRandomPage : function () {\r\n      const pi = pageInfoClass.create();\r\n      \r\n      const button = this.actions().add(\r\n        loc.RANDOM_PAGE,\r\n        {},\r\n        function () {\r\n          if (pi.total() > 0) {\r\n            const sp = new URLSearchParams(window.location.search);\r\n            sp.set(\"p\", Math.floor(Math.random() * pi.total()) + 1);\r\n            window.location.search = sp.toString();\r\n          };\r\n        }\r\n      )\r\n    }\r\n  }\r\n});\r\n\n/*!\r\n * Intro.js v4.2.2\r\n * https://introjs.com\r\n *\r\n * Copyright (C) 2012-2021 Afshin Mehrabani (@afshinmeh).\r\n * https://raw.githubusercontent.com/usablica/intro.js/master/license.md\r\n *\r\n * Date: Fri, 27 Aug 2021 12:07:05 GMT\r\n */\r\n\r\n(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n  typeof define === 'function' && define.amd ? define('lib/intro',factory) :\r\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.introJs = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n  function _typeof(obj) {\r\n    \"@babel/helpers - typeof\";\r\n\r\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n      _typeof = function (obj) {\r\n        return typeof obj;\r\n      };\r\n    } else {\r\n      _typeof = function (obj) {\r\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n      };\r\n    }\r\n\r\n    return _typeof(obj);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function mergeOptions(obj1, obj2) {\r\n    var obj3 = {};\r\n    var attrname;\r\n\r\n    for (attrname in obj1) {\r\n      obj3[attrname] = obj1[attrname];\r\n    }\r\n\r\n    for (attrname in obj2) {\r\n      obj3[attrname] = obj2[attrname];\r\n    }\r\n\r\n    return obj3;\r\n  }\r\n\r\n  /**\r\n   * Mark any object with an incrementing number\r\n   * used for keeping track of objects\r\n   *\r\n   * @param Object obj   Any object or DOM Element\r\n   * @param String key\r\n   * @return Object\r\n   */\r\n  var stamp = function () {\r\n    var keys = {};\r\n    return function stamp(obj) {\r\n      var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"introjs-stamp\";\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0; // stamp only once per object\r\n\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  }();\r\n\r\n  /**\r\n   * Iterates arrays\r\n   *\r\n   * @param {Array} arr\r\n   * @param {Function} forEachFnc\r\n   * @param {Function} [completeFnc]\r\n   * @return {Null}\r\n   */\r\n  function forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof completeFnc === \"function\") {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * DOMEvent Handles all DOM events\r\n   *\r\n   * methods:\r\n   *\r\n   * on - add event handler\r\n   * off - remove event\r\n   */\r\n\r\n  var DOMEvent = function () {\r\n    function DOMEvent() {\r\n      var events_key = \"introjs_event\";\r\n      /**\r\n       * Gets a unique ID for an event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type event type\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @return String\r\n       */\r\n\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + stamp(listener) + (context ? \"_\".concat(stamp(context)) : \"\");\r\n      };\r\n      /**\r\n       * Adds event listener\r\n       *\r\n       * @param obj Object obj\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = function handler(e) {\r\n          return listener.call(context || obj, e || window.event);\r\n        };\r\n\r\n        if (\"addEventListener\" in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if (\"attachEvent\" in obj) {\r\n          obj.attachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n      /**\r\n       * Removes event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if (\"removeEventListener\" in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if (\"detachEvent\" in obj) {\r\n          obj.detachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  }();\r\n\r\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\r\n\r\n  function createCommonjsModule(fn, module) {\r\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\r\n  }\r\n\r\n  var check = function (it) {\r\n    return it && it.Math == Math && it;\r\n  };\r\n\r\n  // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\r\n  var global_1 =\r\n    // eslint-disable-next-line es/no-global-this -- safe\r\n    check(typeof globalThis == 'object' && globalThis) ||\r\n    check(typeof window == 'object' && window) ||\r\n    // eslint-disable-next-line no-restricted-globals -- safe\r\n    check(typeof self == 'object' && self) ||\r\n    check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\r\n    // eslint-disable-next-line no-new-func -- fallback\r\n    (function () { return this; })() || Function('return this')();\r\n\r\n  var fails = function (exec) {\r\n    try {\r\n      return !!exec();\r\n    } catch (error) {\r\n      return true;\r\n    }\r\n  };\r\n\r\n  // Detect IE8's incomplete defineProperty implementation\r\n  var descriptors = !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n    return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\r\n  });\r\n\r\n  var $propertyIsEnumerable = {}.propertyIsEnumerable;\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;\r\n\r\n  // Nashorn ~ JDK8 bug\r\n  var NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({ 1: 2 }, 1);\r\n\r\n  // `Object.prototype.propertyIsEnumerable` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\r\n  var f$4 = NASHORN_BUG ? function propertyIsEnumerable(V) {\r\n    var descriptor = getOwnPropertyDescriptor$1(this, V);\r\n    return !!descriptor && descriptor.enumerable;\r\n  } : $propertyIsEnumerable;\r\n\r\n  var objectPropertyIsEnumerable = {\r\n  \tf: f$4\r\n  };\r\n\r\n  var createPropertyDescriptor = function (bitmap, value) {\r\n    return {\r\n      enumerable: !(bitmap & 1),\r\n      configurable: !(bitmap & 2),\r\n      writable: !(bitmap & 4),\r\n      value: value\r\n    };\r\n  };\r\n\r\n  var toString = {}.toString;\r\n\r\n  var classofRaw = function (it) {\r\n    return toString.call(it).slice(8, -1);\r\n  };\r\n\r\n  var split = ''.split;\r\n\r\n  // fallback for non-array-like ES3 and non-enumerable old V8 strings\r\n  var indexedObject = fails(function () {\r\n    // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\r\n    // eslint-disable-next-line no-prototype-builtins -- safe\r\n    return !Object('z').propertyIsEnumerable(0);\r\n  }) ? function (it) {\r\n    return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\r\n  } : Object;\r\n\r\n  // `RequireObjectCoercible` abstract operation\r\n  // https://tc39.es/ecma262/#sec-requireobjectcoercible\r\n  var requireObjectCoercible = function (it) {\r\n    if (it == undefined) throw TypeError(\"Can't call method on \" + it);\r\n    return it;\r\n  };\r\n\r\n  // toObject with fallback for non-array-like ES3 strings\r\n\r\n\r\n\r\n  var toIndexedObject = function (it) {\r\n    return indexedObject(requireObjectCoercible(it));\r\n  };\r\n\r\n  var isObject = function (it) {\r\n    return typeof it === 'object' ? it !== null : typeof it === 'function';\r\n  };\r\n\r\n  var aFunction$1 = function (variable) {\r\n    return typeof variable == 'function' ? variable : undefined;\r\n  };\r\n\r\n  var getBuiltIn = function (namespace, method) {\r\n    return arguments.length < 2 ? aFunction$1(global_1[namespace]) : global_1[namespace] && global_1[namespace][method];\r\n  };\r\n\r\n  var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\r\n\r\n  var process = global_1.process;\r\n  var Deno = global_1.Deno;\r\n  var versions = process && process.versions || Deno && Deno.version;\r\n  var v8 = versions && versions.v8;\r\n  var match, version$1;\r\n\r\n  if (v8) {\r\n    match = v8.split('.');\r\n    version$1 = match[0] < 4 ? 1 : match[0] + match[1];\r\n  } else if (engineUserAgent) {\r\n    match = engineUserAgent.match(/Edge\\/(\\d+)/);\r\n    if (!match || match[1] >= 74) {\r\n      match = engineUserAgent.match(/Chrome\\/(\\d+)/);\r\n      if (match) version$1 = match[1];\r\n    }\r\n  }\r\n\r\n  var engineV8Version = version$1 && +version$1;\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\r\n  var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\r\n    var symbol = Symbol();\r\n    // Chrome 38 Symbol has incorrect toString conversion\r\n    // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\r\n    return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\r\n      // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\r\n      !Symbol.sham && engineV8Version && engineV8Version < 41;\r\n  });\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n  var useSymbolAsUid = nativeSymbol\r\n    && !Symbol.sham\r\n    && typeof Symbol.iterator == 'symbol';\r\n\r\n  var isSymbol = useSymbolAsUid ? function (it) {\r\n    return typeof it == 'symbol';\r\n  } : function (it) {\r\n    var $Symbol = getBuiltIn('Symbol');\r\n    return typeof $Symbol == 'function' && Object(it) instanceof $Symbol;\r\n  };\r\n\r\n  // `OrdinaryToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-ordinarytoprimitive\r\n  var ordinaryToPrimitive = function (input, pref) {\r\n    var fn, val;\r\n    if (pref === 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (pref !== 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    throw TypeError(\"Can't convert object to primitive value\");\r\n  };\r\n\r\n  var setGlobal = function (key, value) {\r\n    try {\r\n      // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n      Object.defineProperty(global_1, key, { value: value, configurable: true, writable: true });\r\n    } catch (error) {\r\n      global_1[key] = value;\r\n    } return value;\r\n  };\r\n\r\n  var SHARED = '__core-js_shared__';\r\n  var store$1 = global_1[SHARED] || setGlobal(SHARED, {});\r\n\r\n  var sharedStore = store$1;\r\n\r\n  var shared = createCommonjsModule(function (module) {\r\n  (module.exports = function (key, value) {\r\n    return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\r\n  })('versions', []).push({\r\n    version: '3.16.1',\r\n    mode: 'global',\r\n    copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\r\n  });\r\n  });\r\n\r\n  // `ToObject` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toobject\r\n  var toObject = function (argument) {\r\n    return Object(requireObjectCoercible(argument));\r\n  };\r\n\r\n  var hasOwnProperty = {}.hasOwnProperty;\r\n\r\n  var has$1 = Object.hasOwn || function hasOwn(it, key) {\r\n    return hasOwnProperty.call(toObject(it), key);\r\n  };\r\n\r\n  var id = 0;\r\n  var postfix = Math.random();\r\n\r\n  var uid = function (key) {\r\n    return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\r\n  };\r\n\r\n  var WellKnownSymbolsStore = shared('wks');\r\n  var Symbol$1 = global_1.Symbol;\r\n  var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\r\n\r\n  var wellKnownSymbol = function (name) {\r\n    if (!has$1(WellKnownSymbolsStore, name) || !(nativeSymbol || typeof WellKnownSymbolsStore[name] == 'string')) {\r\n      if (nativeSymbol && has$1(Symbol$1, name)) {\r\n        WellKnownSymbolsStore[name] = Symbol$1[name];\r\n      } else {\r\n        WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\r\n      }\r\n    } return WellKnownSymbolsStore[name];\r\n  };\r\n\r\n  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\r\n\r\n  // `ToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toprimitive\r\n  var toPrimitive = function (input, pref) {\r\n    if (!isObject(input) || isSymbol(input)) return input;\r\n    var exoticToPrim = input[TO_PRIMITIVE];\r\n    var result;\r\n    if (exoticToPrim !== undefined) {\r\n      if (pref === undefined) pref = 'default';\r\n      result = exoticToPrim.call(input, pref);\r\n      if (!isObject(result) || isSymbol(result)) return result;\r\n      throw TypeError(\"Can't convert object to primitive value\");\r\n    }\r\n    if (pref === undefined) pref = 'number';\r\n    return ordinaryToPrimitive(input, pref);\r\n  };\r\n\r\n  // `ToPropertyKey` abstract operation\r\n  // https://tc39.es/ecma262/#sec-topropertykey\r\n  var toPropertyKey = function (argument) {\r\n    var key = toPrimitive(argument, 'string');\r\n    return isSymbol(key) ? key : String(key);\r\n  };\r\n\r\n  var document$1 = global_1.document;\r\n  // typeof document.createElement is 'object' in old IE\r\n  var EXISTS = isObject(document$1) && isObject(document$1.createElement);\r\n\r\n  var documentCreateElement = function (it) {\r\n    return EXISTS ? document$1.createElement(it) : {};\r\n  };\r\n\r\n  // Thank's IE8 for his funny defineProperty\r\n  var ie8DomDefine = !descriptors && !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\r\n    return Object.defineProperty(documentCreateElement('div'), 'a', {\r\n      get: function () { return 7; }\r\n    }).a != 7;\r\n  });\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\r\n\r\n  // `Object.getOwnPropertyDescriptor` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\r\n  var f$3 = descriptors ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\r\n    O = toIndexedObject(O);\r\n    P = toPropertyKey(P);\r\n    if (ie8DomDefine) try {\r\n      return $getOwnPropertyDescriptor(O, P);\r\n    } catch (error) { /* empty */ }\r\n    if (has$1(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\r\n  };\r\n\r\n  var objectGetOwnPropertyDescriptor = {\r\n  \tf: f$3\r\n  };\r\n\r\n  var anObject = function (it) {\r\n    if (!isObject(it)) {\r\n      throw TypeError(String(it) + ' is not an object');\r\n    } return it;\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n  var $defineProperty = Object.defineProperty;\r\n\r\n  // `Object.defineProperty` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperty\r\n  var f$2 = descriptors ? $defineProperty : function defineProperty(O, P, Attributes) {\r\n    anObject(O);\r\n    P = toPropertyKey(P);\r\n    anObject(Attributes);\r\n    if (ie8DomDefine) try {\r\n      return $defineProperty(O, P, Attributes);\r\n    } catch (error) { /* empty */ }\r\n    if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\r\n    if ('value' in Attributes) O[P] = Attributes.value;\r\n    return O;\r\n  };\r\n\r\n  var objectDefineProperty = {\r\n  \tf: f$2\r\n  };\r\n\r\n  var createNonEnumerableProperty = descriptors ? function (object, key, value) {\r\n    return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\r\n  } : function (object, key, value) {\r\n    object[key] = value;\r\n    return object;\r\n  };\r\n\r\n  var functionToString = Function.toString;\r\n\r\n  // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\r\n  if (typeof sharedStore.inspectSource != 'function') {\r\n    sharedStore.inspectSource = function (it) {\r\n      return functionToString.call(it);\r\n    };\r\n  }\r\n\r\n  var inspectSource = sharedStore.inspectSource;\r\n\r\n  var WeakMap$1 = global_1.WeakMap;\r\n\r\n  var nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\r\n\r\n  var keys = shared('keys');\r\n\r\n  var sharedKey = function (key) {\r\n    return keys[key] || (keys[key] = uid(key));\r\n  };\r\n\r\n  var hiddenKeys$1 = {};\r\n\r\n  var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\r\n  var WeakMap = global_1.WeakMap;\r\n  var set, get, has;\r\n\r\n  var enforce = function (it) {\r\n    return has(it) ? get(it) : set(it, {});\r\n  };\r\n\r\n  var getterFor = function (TYPE) {\r\n    return function (it) {\r\n      var state;\r\n      if (!isObject(it) || (state = get(it)).type !== TYPE) {\r\n        throw TypeError('Incompatible receiver, ' + TYPE + ' required');\r\n      } return state;\r\n    };\r\n  };\r\n\r\n  if (nativeWeakMap || sharedStore.state) {\r\n    var store = sharedStore.state || (sharedStore.state = new WeakMap());\r\n    var wmget = store.get;\r\n    var wmhas = store.has;\r\n    var wmset = store.set;\r\n    set = function (it, metadata) {\r\n      if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      wmset.call(store, it, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return wmget.call(store, it) || {};\r\n    };\r\n    has = function (it) {\r\n      return wmhas.call(store, it);\r\n    };\r\n  } else {\r\n    var STATE = sharedKey('state');\r\n    hiddenKeys$1[STATE] = true;\r\n    set = function (it, metadata) {\r\n      if (has$1(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      createNonEnumerableProperty(it, STATE, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return has$1(it, STATE) ? it[STATE] : {};\r\n    };\r\n    has = function (it) {\r\n      return has$1(it, STATE);\r\n    };\r\n  }\r\n\r\n  var internalState = {\r\n    set: set,\r\n    get: get,\r\n    has: has,\r\n    enforce: enforce,\r\n    getterFor: getterFor\r\n  };\r\n\r\n  var redefine = createCommonjsModule(function (module) {\r\n  var getInternalState = internalState.get;\r\n  var enforceInternalState = internalState.enforce;\r\n  var TEMPLATE = String(String).split('String');\r\n\r\n  (module.exports = function (O, key, value, options) {\r\n    var unsafe = options ? !!options.unsafe : false;\r\n    var simple = options ? !!options.enumerable : false;\r\n    var noTargetGet = options ? !!options.noTargetGet : false;\r\n    var state;\r\n    if (typeof value == 'function') {\r\n      if (typeof key == 'string' && !has$1(value, 'name')) {\r\n        createNonEnumerableProperty(value, 'name', key);\r\n      }\r\n      state = enforceInternalState(value);\r\n      if (!state.source) {\r\n        state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\r\n      }\r\n    }\r\n    if (O === global_1) {\r\n      if (simple) O[key] = value;\r\n      else setGlobal(key, value);\r\n      return;\r\n    } else if (!unsafe) {\r\n      delete O[key];\r\n    } else if (!noTargetGet && O[key]) {\r\n      simple = true;\r\n    }\r\n    if (simple) O[key] = value;\r\n    else createNonEnumerableProperty(O, key, value);\r\n  // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\r\n  })(Function.prototype, 'toString', function toString() {\r\n    return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\r\n  });\r\n  });\r\n\r\n  var ceil = Math.ceil;\r\n  var floor$2 = Math.floor;\r\n\r\n  // `ToInteger` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tointeger\r\n  var toInteger = function (argument) {\r\n    return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$2 : ceil)(argument);\r\n  };\r\n\r\n  var min$4 = Math.min;\r\n\r\n  // `ToLength` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tolength\r\n  var toLength = function (argument) {\r\n    return argument > 0 ? min$4(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\r\n  };\r\n\r\n  var max$3 = Math.max;\r\n  var min$3 = Math.min;\r\n\r\n  // Helper for a popular repeating case of the spec:\r\n  // Let integer be ? ToInteger(index).\r\n  // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\r\n  var toAbsoluteIndex = function (index, length) {\r\n    var integer = toInteger(index);\r\n    return integer < 0 ? max$3(integer + length, 0) : min$3(integer, length);\r\n  };\r\n\r\n  // `Array.prototype.{ indexOf, includes }` methods implementation\r\n  var createMethod$2 = function (IS_INCLUDES) {\r\n    return function ($this, el, fromIndex) {\r\n      var O = toIndexedObject($this);\r\n      var length = toLength(O.length);\r\n      var index = toAbsoluteIndex(fromIndex, length);\r\n      var value;\r\n      // Array#includes uses SameValueZero equality algorithm\r\n      // eslint-disable-next-line no-self-compare -- NaN check\r\n      if (IS_INCLUDES && el != el) while (length > index) {\r\n        value = O[index++];\r\n        // eslint-disable-next-line no-self-compare -- NaN check\r\n        if (value != value) return true;\r\n      // Array#indexOf ignores holes, Array#includes - not\r\n      } else for (;length > index; index++) {\r\n        if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\r\n      } return !IS_INCLUDES && -1;\r\n    };\r\n  };\r\n\r\n  var arrayIncludes = {\r\n    // `Array.prototype.includes` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n    includes: createMethod$2(true),\r\n    // `Array.prototype.indexOf` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.indexof\r\n    indexOf: createMethod$2(false)\r\n  };\r\n\r\n  var indexOf = arrayIncludes.indexOf;\r\n\r\n\r\n  var objectKeysInternal = function (object, names) {\r\n    var O = toIndexedObject(object);\r\n    var i = 0;\r\n    var result = [];\r\n    var key;\r\n    for (key in O) !has$1(hiddenKeys$1, key) && has$1(O, key) && result.push(key);\r\n    // Don't enum bug & hidden keys\r\n    while (names.length > i) if (has$1(O, key = names[i++])) {\r\n      ~indexOf(result, key) || result.push(key);\r\n    }\r\n    return result;\r\n  };\r\n\r\n  // IE8- don't enum bug keys\r\n  var enumBugKeys = [\r\n    'constructor',\r\n    'hasOwnProperty',\r\n    'isPrototypeOf',\r\n    'propertyIsEnumerable',\r\n    'toLocaleString',\r\n    'toString',\r\n    'valueOf'\r\n  ];\r\n\r\n  var hiddenKeys = enumBugKeys.concat('length', 'prototype');\r\n\r\n  // `Object.getOwnPropertyNames` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertynames\r\n  // eslint-disable-next-line es/no-object-getownpropertynames -- safe\r\n  var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\r\n    return objectKeysInternal(O, hiddenKeys);\r\n  };\r\n\r\n  var objectGetOwnPropertyNames = {\r\n  \tf: f$1\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\r\n  var f = Object.getOwnPropertySymbols;\r\n\r\n  var objectGetOwnPropertySymbols = {\r\n  \tf: f\r\n  };\r\n\r\n  // all object keys, includes non-enumerable and symbols\r\n  var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\r\n    var keys = objectGetOwnPropertyNames.f(anObject(it));\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\r\n  };\r\n\r\n  var copyConstructorProperties = function (target, source) {\r\n    var keys = ownKeys(source);\r\n    var defineProperty = objectDefineProperty.f;\r\n    var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n    for (var i = 0; i < keys.length; i++) {\r\n      var key = keys[i];\r\n      if (!has$1(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\r\n    }\r\n  };\r\n\r\n  var replacement = /#|\\.prototype\\./;\r\n\r\n  var isForced = function (feature, detection) {\r\n    var value = data[normalize(feature)];\r\n    return value == POLYFILL ? true\r\n      : value == NATIVE ? false\r\n      : typeof detection == 'function' ? fails(detection)\r\n      : !!detection;\r\n  };\r\n\r\n  var normalize = isForced.normalize = function (string) {\r\n    return String(string).replace(replacement, '.').toLowerCase();\r\n  };\r\n\r\n  var data = isForced.data = {};\r\n  var NATIVE = isForced.NATIVE = 'N';\r\n  var POLYFILL = isForced.POLYFILL = 'P';\r\n\r\n  var isForced_1 = isForced;\r\n\r\n  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n\r\n\r\n\r\n\r\n\r\n\r\n  /*\r\n    options.target      - name of the target object\r\n    options.global      - target is the global object\r\n    options.stat        - export as static methods of target\r\n    options.proto       - export as prototype methods of target\r\n    options.real        - real prototype method for the `pure` version\r\n    options.forced      - export even if the native feature is available\r\n    options.bind        - bind methods to the target, required for the `pure` version\r\n    options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\r\n    options.unsafe      - use the simple assignment of property instead of delete + defineProperty\r\n    options.sham        - add a flag to not completely full polyfills\r\n    options.enumerable  - export as enumerable property\r\n    options.noTargetGet - prevent calling a getter on target\r\n  */\r\n  var _export = function (options, source) {\r\n    var TARGET = options.target;\r\n    var GLOBAL = options.global;\r\n    var STATIC = options.stat;\r\n    var FORCED, target, key, targetProperty, sourceProperty, descriptor;\r\n    if (GLOBAL) {\r\n      target = global_1;\r\n    } else if (STATIC) {\r\n      target = global_1[TARGET] || setGlobal(TARGET, {});\r\n    } else {\r\n      target = (global_1[TARGET] || {}).prototype;\r\n    }\r\n    if (target) for (key in source) {\r\n      sourceProperty = source[key];\r\n      if (options.noTargetGet) {\r\n        descriptor = getOwnPropertyDescriptor(target, key);\r\n        targetProperty = descriptor && descriptor.value;\r\n      } else targetProperty = target[key];\r\n      FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\r\n      // contained in target\r\n      if (!FORCED && targetProperty !== undefined) {\r\n        if (typeof sourceProperty === typeof targetProperty) continue;\r\n        copyConstructorProperties(sourceProperty, targetProperty);\r\n      }\r\n      // add a flag to not completely full polyfills\r\n      if (options.sham || (targetProperty && targetProperty.sham)) {\r\n        createNonEnumerableProperty(sourceProperty, 'sham', true);\r\n      }\r\n      // extend global\r\n      redefine(target, key, sourceProperty, options);\r\n    }\r\n  };\r\n\r\n  var toString_1 = function (argument) {\r\n    if (isSymbol(argument)) throw TypeError('Cannot convert a Symbol value to a string');\r\n    return String(argument);\r\n  };\r\n\r\n  // `RegExp.prototype.flags` getter implementation\r\n  // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\r\n  var regexpFlags = function () {\r\n    var that = anObject(this);\r\n    var result = '';\r\n    if (that.global) result += 'g';\r\n    if (that.ignoreCase) result += 'i';\r\n    if (that.multiline) result += 'm';\r\n    if (that.dotAll) result += 's';\r\n    if (that.unicode) result += 'u';\r\n    if (that.sticky) result += 'y';\r\n    return result;\r\n  };\r\n\r\n  // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\r\n  var RE = function (s, f) {\r\n    return RegExp(s, f);\r\n  };\r\n\r\n  var UNSUPPORTED_Y$2 = fails(function () {\r\n    var re = RE('a', 'y');\r\n    re.lastIndex = 2;\r\n    return re.exec('abcd') != null;\r\n  });\r\n\r\n  var BROKEN_CARET = fails(function () {\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\r\n    var re = RE('^r', 'gy');\r\n    re.lastIndex = 2;\r\n    return re.exec('str') != null;\r\n  });\r\n\r\n  var regexpStickyHelpers = {\r\n  \tUNSUPPORTED_Y: UNSUPPORTED_Y$2,\r\n  \tBROKEN_CARET: BROKEN_CARET\r\n  };\r\n\r\n  // `Object.keys` method\r\n  // https://tc39.es/ecma262/#sec-object.keys\r\n  // eslint-disable-next-line es/no-object-keys -- safe\r\n  var objectKeys = Object.keys || function keys(O) {\r\n    return objectKeysInternal(O, enumBugKeys);\r\n  };\r\n\r\n  // `Object.defineProperties` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperties\r\n  // eslint-disable-next-line es/no-object-defineproperties -- safe\r\n  var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\r\n    anObject(O);\r\n    var keys = objectKeys(Properties);\r\n    var length = keys.length;\r\n    var index = 0;\r\n    var key;\r\n    while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\r\n    return O;\r\n  };\r\n\r\n  var html = getBuiltIn('document', 'documentElement');\r\n\r\n  /* global ActiveXObject -- old IE, WSH */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var GT = '>';\r\n  var LT = '<';\r\n  var PROTOTYPE = 'prototype';\r\n  var SCRIPT = 'script';\r\n  var IE_PROTO = sharedKey('IE_PROTO');\r\n\r\n  var EmptyConstructor = function () { /* empty */ };\r\n\r\n  var scriptTag = function (content) {\r\n    return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\r\n  var NullProtoObjectViaActiveX = function (activeXDocument) {\r\n    activeXDocument.write(scriptTag(''));\r\n    activeXDocument.close();\r\n    var temp = activeXDocument.parentWindow.Object;\r\n    activeXDocument = null; // avoid memory leak\r\n    return temp;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use iframe Object with cleared prototype\r\n  var NullProtoObjectViaIFrame = function () {\r\n    // Thrash, waste and sodomy: IE GC bug\r\n    var iframe = documentCreateElement('iframe');\r\n    var JS = 'java' + SCRIPT + ':';\r\n    var iframeDocument;\r\n    if (iframe.style) {\r\n      iframe.style.display = 'none';\r\n      html.appendChild(iframe);\r\n      // https://github.com/zloirock/core-js/issues/475\r\n      iframe.src = String(JS);\r\n      iframeDocument = iframe.contentWindow.document;\r\n      iframeDocument.open();\r\n      iframeDocument.write(scriptTag('document.F=Object'));\r\n      iframeDocument.close();\r\n      return iframeDocument.F;\r\n    }\r\n  };\r\n\r\n  // Check for document.domain and active x support\r\n  // No need to use active x approach when document.domain is not set\r\n  // see https://github.com/es-shims/es5-shim/issues/150\r\n  // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\r\n  // avoid IE GC bug\r\n  var activeXDocument;\r\n  var NullProtoObject = function () {\r\n    try {\r\n      activeXDocument = new ActiveXObject('htmlfile');\r\n    } catch (error) { /* ignore */ }\r\n    NullProtoObject = document.domain && activeXDocument ?\r\n      NullProtoObjectViaActiveX(activeXDocument) : // old IE\r\n      NullProtoObjectViaIFrame() ||\r\n      NullProtoObjectViaActiveX(activeXDocument); // WSH\r\n    var length = enumBugKeys.length;\r\n    while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\r\n    return NullProtoObject();\r\n  };\r\n\r\n  hiddenKeys$1[IE_PROTO] = true;\r\n\r\n  // `Object.create` method\r\n  // https://tc39.es/ecma262/#sec-object.create\r\n  var objectCreate = Object.create || function create(O, Properties) {\r\n    var result;\r\n    if (O !== null) {\r\n      EmptyConstructor[PROTOTYPE] = anObject(O);\r\n      result = new EmptyConstructor();\r\n      EmptyConstructor[PROTOTYPE] = null;\r\n      // add \"__proto__\" for Object.getPrototypeOf polyfill\r\n      result[IE_PROTO] = O;\r\n    } else result = NullProtoObject();\r\n    return Properties === undefined ? result : objectDefineProperties(result, Properties);\r\n  };\r\n\r\n  var regexpUnsupportedDotAll = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\r\n    var re = RegExp('.', (typeof '').charAt(0));\r\n    return !(re.dotAll && re.exec('\\n') && re.flags === 's');\r\n  });\r\n\r\n  var regexpUnsupportedNcg = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 'g') -> /./g and it causes SyntaxError\r\n    var re = RegExp('(?<a>b)', (typeof '').charAt(5));\r\n    return re.exec('b').groups.a !== 'b' ||\r\n      'b'.replace(re, '$<a>c') !== 'bc';\r\n  });\r\n\r\n  /* eslint-disable regexp/no-assertion-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\r\n  /* eslint-disable regexp/no-useless-quantifier -- testing */\r\n\r\n\r\n\r\n\r\n\r\n  var getInternalState = internalState.get;\r\n\r\n\r\n\r\n  var nativeExec = RegExp.prototype.exec;\r\n  var nativeReplace = shared('native-string-replace', String.prototype.replace);\r\n\r\n  var patchedExec = nativeExec;\r\n\r\n  var UPDATES_LAST_INDEX_WRONG = (function () {\r\n    var re1 = /a/;\r\n    var re2 = /b*/g;\r\n    nativeExec.call(re1, 'a');\r\n    nativeExec.call(re2, 'a');\r\n    return re1.lastIndex !== 0 || re2.lastIndex !== 0;\r\n  })();\r\n\r\n  var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\r\n\r\n  // nonparticipating capturing group, copied from es5-shim's String#split patch.\r\n  var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\r\n\r\n  var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1 || regexpUnsupportedDotAll || regexpUnsupportedNcg;\r\n\r\n  if (PATCH) {\r\n    // eslint-disable-next-line max-statements -- TODO\r\n    patchedExec = function exec(string) {\r\n      var re = this;\r\n      var state = getInternalState(re);\r\n      var str = toString_1(string);\r\n      var raw = state.raw;\r\n      var result, reCopy, lastIndex, match, i, object, group;\r\n\r\n      if (raw) {\r\n        raw.lastIndex = re.lastIndex;\r\n        result = patchedExec.call(raw, str);\r\n        re.lastIndex = raw.lastIndex;\r\n        return result;\r\n      }\r\n\r\n      var groups = state.groups;\r\n      var sticky = UNSUPPORTED_Y$1 && re.sticky;\r\n      var flags = regexpFlags.call(re);\r\n      var source = re.source;\r\n      var charsAdded = 0;\r\n      var strCopy = str;\r\n\r\n      if (sticky) {\r\n        flags = flags.replace('y', '');\r\n        if (flags.indexOf('g') === -1) {\r\n          flags += 'g';\r\n        }\r\n\r\n        strCopy = str.slice(re.lastIndex);\r\n        // Support anchored sticky behavior.\r\n        if (re.lastIndex > 0 && (!re.multiline || re.multiline && str.charAt(re.lastIndex - 1) !== '\\n')) {\r\n          source = '(?: ' + source + ')';\r\n          strCopy = ' ' + strCopy;\r\n          charsAdded++;\r\n        }\r\n        // ^(? + rx + ) is needed, in combination with some str slicing, to\r\n        // simulate the 'y' flag.\r\n        reCopy = new RegExp('^(?:' + source + ')', flags);\r\n      }\r\n\r\n      if (NPCG_INCLUDED) {\r\n        reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\r\n      }\r\n      if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\r\n\r\n      match = nativeExec.call(sticky ? reCopy : re, strCopy);\r\n\r\n      if (sticky) {\r\n        if (match) {\r\n          match.input = match.input.slice(charsAdded);\r\n          match[0] = match[0].slice(charsAdded);\r\n          match.index = re.lastIndex;\r\n          re.lastIndex += match[0].length;\r\n        } else re.lastIndex = 0;\r\n      } else if (UPDATES_LAST_INDEX_WRONG && match) {\r\n        re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\r\n      }\r\n      if (NPCG_INCLUDED && match && match.length > 1) {\r\n        // Fix browsers whose `exec` methods don't consistently return `undefined`\r\n        // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\r\n        nativeReplace.call(match[0], reCopy, function () {\r\n          for (i = 1; i < arguments.length - 2; i++) {\r\n            if (arguments[i] === undefined) match[i] = undefined;\r\n          }\r\n        });\r\n      }\r\n\r\n      if (match && groups) {\r\n        match.groups = object = objectCreate(null);\r\n        for (i = 0; i < groups.length; i++) {\r\n          group = groups[i];\r\n          object[group[0]] = match[group[1]];\r\n        }\r\n      }\r\n\r\n      return match;\r\n    };\r\n  }\r\n\r\n  var regexpExec = patchedExec;\r\n\r\n  // `RegExp.prototype.exec` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.exec\r\n  _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\r\n    exec: regexpExec\r\n  });\r\n\r\n  // TODO: Remove from `core-js@4` since it's moved to entry points\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var SPECIES$4 = wellKnownSymbol('species');\r\n  var RegExpPrototype$1 = RegExp.prototype;\r\n\r\n  var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {\r\n    var SYMBOL = wellKnownSymbol(KEY);\r\n\r\n    var DELEGATES_TO_SYMBOL = !fails(function () {\r\n      // String methods call symbol-named RegEp methods\r\n      var O = {};\r\n      O[SYMBOL] = function () { return 7; };\r\n      return ''[KEY](O) != 7;\r\n    });\r\n\r\n    var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\r\n      // Symbol-named RegExp methods call .exec\r\n      var execCalled = false;\r\n      var re = /a/;\r\n\r\n      if (KEY === 'split') {\r\n        // We can't use real regex here since it causes deoptimization\r\n        // and serious performance degradation in V8\r\n        // https://github.com/zloirock/core-js/issues/306\r\n        re = {};\r\n        // RegExp[@@split] doesn't call the regex's exec method, but first creates\r\n        // a new one. We need to return the patched regex when creating the new one.\r\n        re.constructor = {};\r\n        re.constructor[SPECIES$4] = function () { return re; };\r\n        re.flags = '';\r\n        re[SYMBOL] = /./[SYMBOL];\r\n      }\r\n\r\n      re.exec = function () { execCalled = true; return null; };\r\n\r\n      re[SYMBOL]('');\r\n      return !execCalled;\r\n    });\r\n\r\n    if (\r\n      !DELEGATES_TO_SYMBOL ||\r\n      !DELEGATES_TO_EXEC ||\r\n      FORCED\r\n    ) {\r\n      var nativeRegExpMethod = /./[SYMBOL];\r\n      var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\r\n        var $exec = regexp.exec;\r\n        if ($exec === regexpExec || $exec === RegExpPrototype$1.exec) {\r\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\r\n            // The native String method already delegates to @@method (this\r\n            // polyfilled function), leasing to infinite recursion.\r\n            // We avoid it by directly calling the native @@method method.\r\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\r\n          }\r\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\r\n        }\r\n        return { done: false };\r\n      });\r\n\r\n      redefine(String.prototype, KEY, methods[0]);\r\n      redefine(RegExpPrototype$1, SYMBOL, methods[1]);\r\n    }\r\n\r\n    if (SHAM) createNonEnumerableProperty(RegExpPrototype$1[SYMBOL], 'sham', true);\r\n  };\r\n\r\n  // `String.prototype.codePointAt` methods implementation\r\n  var createMethod$1 = function (CONVERT_TO_STRING) {\r\n    return function ($this, pos) {\r\n      var S = toString_1(requireObjectCoercible($this));\r\n      var position = toInteger(pos);\r\n      var size = S.length;\r\n      var first, second;\r\n      if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\r\n      first = S.charCodeAt(position);\r\n      return first < 0xD800 || first > 0xDBFF || position + 1 === size\r\n        || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\r\n          ? CONVERT_TO_STRING ? S.charAt(position) : first\r\n          : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\r\n    };\r\n  };\r\n\r\n  var stringMultibyte = {\r\n    // `String.prototype.codePointAt` method\r\n    // https://tc39.es/ecma262/#sec-string.prototype.codepointat\r\n    codeAt: createMethod$1(false),\r\n    // `String.prototype.at` method\r\n    // https://github.com/mathiasbynens/String.prototype.at\r\n    charAt: createMethod$1(true)\r\n  };\r\n\r\n  var charAt = stringMultibyte.charAt;\r\n\r\n  // `AdvanceStringIndex` abstract operation\r\n  // https://tc39.es/ecma262/#sec-advancestringindex\r\n  var advanceStringIndex = function (S, index, unicode) {\r\n    return index + (unicode ? charAt(S, index).length : 1);\r\n  };\r\n\r\n  // `RegExpExec` abstract operation\r\n  // https://tc39.es/ecma262/#sec-regexpexec\r\n  var regexpExecAbstract = function (R, S) {\r\n    var exec = R.exec;\r\n    if (typeof exec === 'function') {\r\n      var result = exec.call(R, S);\r\n      if (typeof result !== 'object') {\r\n        throw TypeError('RegExp exec method returned something other than an Object or null');\r\n      }\r\n      return result;\r\n    }\r\n\r\n    if (classofRaw(R) !== 'RegExp') {\r\n      throw TypeError('RegExp#exec called on incompatible receiver');\r\n    }\r\n\r\n    return regexpExec.call(R, S);\r\n  };\r\n\r\n  // @@match logic\r\n  fixRegexpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\r\n    return [\r\n      // `String.prototype.match` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.match\r\n      function match(regexp) {\r\n        var O = requireObjectCoercible(this);\r\n        var matcher = regexp == undefined ? undefined : regexp[MATCH];\r\n        return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString_1(O));\r\n      },\r\n      // `RegExp.prototype[@@match]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\r\n      function (string) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(nativeMatch, rx, S);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        if (!rx.global) return regexpExecAbstract(rx, S);\r\n\r\n        var fullUnicode = rx.unicode;\r\n        rx.lastIndex = 0;\r\n        var A = [];\r\n        var n = 0;\r\n        var result;\r\n        while ((result = regexpExecAbstract(rx, S)) !== null) {\r\n          var matchStr = toString_1(result[0]);\r\n          A[n] = matchStr;\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n          n++;\r\n        }\r\n        return n === 0 ? null : A;\r\n      }\r\n    ];\r\n  });\r\n\r\n  // `IsArray` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isarray\r\n  // eslint-disable-next-line es/no-array-isarray -- safe\r\n  var isArray = Array.isArray || function isArray(arg) {\r\n    return classofRaw(arg) == 'Array';\r\n  };\r\n\r\n  var createProperty = function (object, key, value) {\r\n    var propertyKey = toPropertyKey(key);\r\n    if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\r\n    else object[propertyKey] = value;\r\n  };\r\n\r\n  var SPECIES$3 = wellKnownSymbol('species');\r\n\r\n  // a part of `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesConstructor = function (originalArray) {\r\n    var C;\r\n    if (isArray(originalArray)) {\r\n      C = originalArray.constructor;\r\n      // cross-realm fallback\r\n      if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\r\n      else if (isObject(C)) {\r\n        C = C[SPECIES$3];\r\n        if (C === null) C = undefined;\r\n      }\r\n    } return C === undefined ? Array : C;\r\n  };\r\n\r\n  // `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesCreate = function (originalArray, length) {\r\n    return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\r\n  };\r\n\r\n  var SPECIES$2 = wellKnownSymbol('species');\r\n\r\n  var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\r\n    // We can't use this feature detection in V8 since it causes\r\n    // deoptimization and serious performance degradation\r\n    // https://github.com/zloirock/core-js/issues/677\r\n    return engineV8Version >= 51 || !fails(function () {\r\n      var array = [];\r\n      var constructor = array.constructor = {};\r\n      constructor[SPECIES$2] = function () {\r\n        return { foo: 1 };\r\n      };\r\n      return array[METHOD_NAME](Boolean).foo !== 1;\r\n    });\r\n  };\r\n\r\n  var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\r\n  var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\r\n\r\n  // We can't use this feature detection in V8 since it causes\r\n  // deoptimization and serious performance degradation\r\n  // https://github.com/zloirock/core-js/issues/679\r\n  var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\r\n    var array = [];\r\n    array[IS_CONCAT_SPREADABLE] = false;\r\n    return array.concat()[0] !== array;\r\n  });\r\n\r\n  var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\r\n\r\n  var isConcatSpreadable = function (O) {\r\n    if (!isObject(O)) return false;\r\n    var spreadable = O[IS_CONCAT_SPREADABLE];\r\n    return spreadable !== undefined ? !!spreadable : isArray(O);\r\n  };\r\n\r\n  var FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\r\n\r\n  // `Array.prototype.concat` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.concat\r\n  // with adding support of @@isConcatSpreadable and @@species\r\n  _export({ target: 'Array', proto: true, forced: FORCED$1 }, {\r\n    // eslint-disable-next-line no-unused-vars -- required for `.length`\r\n    concat: function concat(arg) {\r\n      var O = toObject(this);\r\n      var A = arraySpeciesCreate(O, 0);\r\n      var n = 0;\r\n      var i, k, length, len, E;\r\n      for (i = -1, length = arguments.length; i < length; i++) {\r\n        E = i === -1 ? O : arguments[i];\r\n        if (isConcatSpreadable(E)) {\r\n          len = toLength(E.length);\r\n          if (n + len > MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\r\n        } else {\r\n          if (n >= MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          createProperty(A, n++, E);\r\n        }\r\n      }\r\n      A.length = n;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\r\n  var test$1 = {};\r\n\r\n  test$1[TO_STRING_TAG$1] = 'z';\r\n\r\n  var toStringTagSupport = String(test$1) === '[object z]';\r\n\r\n  var TO_STRING_TAG = wellKnownSymbol('toStringTag');\r\n  // ES3 wrong here\r\n  var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\r\n\r\n  // fallback for IE11 Script Access Denied error\r\n  var tryGet = function (it, key) {\r\n    try {\r\n      return it[key];\r\n    } catch (error) { /* empty */ }\r\n  };\r\n\r\n  // getting tag from ES6+ `Object.prototype.toString`\r\n  var classof = toStringTagSupport ? classofRaw : function (it) {\r\n    var O, tag, result;\r\n    return it === undefined ? 'Undefined' : it === null ? 'Null'\r\n      // @@toStringTag case\r\n      : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\r\n      // builtinTag case\r\n      : CORRECT_ARGUMENTS ? classofRaw(O)\r\n      // ES3 arguments fallback\r\n      : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\r\n  };\r\n\r\n  // `Object.prototype.toString` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  var objectToString = toStringTagSupport ? {}.toString : function toString() {\r\n    return '[object ' + classof(this) + ']';\r\n  };\r\n\r\n  // `Object.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  if (!toStringTagSupport) {\r\n    redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\r\n  }\r\n\r\n  var TO_STRING = 'toString';\r\n  var RegExpPrototype = RegExp.prototype;\r\n  var nativeToString = RegExpPrototype[TO_STRING];\r\n\r\n  var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\r\n  // FF44- RegExp#toString has a wrong name\r\n  var INCORRECT_NAME = nativeToString.name != TO_STRING;\r\n\r\n  // `RegExp.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.tostring\r\n  if (NOT_GENERIC || INCORRECT_NAME) {\r\n    redefine(RegExp.prototype, TO_STRING, function toString() {\r\n      var R = anObject(this);\r\n      var p = toString_1(R.source);\r\n      var rf = R.flags;\r\n      var f = toString_1(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\r\n      return '/' + p + '/' + f;\r\n    }, { unsafe: true });\r\n  }\r\n\r\n  var MATCH$1 = wellKnownSymbol('match');\r\n\r\n  // `IsRegExp` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isregexp\r\n  var isRegexp = function (it) {\r\n    var isRegExp;\r\n    return isObject(it) && ((isRegExp = it[MATCH$1]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\r\n  };\r\n\r\n  var aFunction = function (it) {\r\n    if (typeof it != 'function') {\r\n      throw TypeError(String(it) + ' is not a function');\r\n    } return it;\r\n  };\r\n\r\n  var SPECIES$1 = wellKnownSymbol('species');\r\n\r\n  // `SpeciesConstructor` abstract operation\r\n  // https://tc39.es/ecma262/#sec-speciesconstructor\r\n  var speciesConstructor = function (O, defaultConstructor) {\r\n    var C = anObject(O).constructor;\r\n    var S;\r\n    return C === undefined || (S = anObject(C)[SPECIES$1]) == undefined ? defaultConstructor : aFunction(S);\r\n  };\r\n\r\n  var UNSUPPORTED_Y = regexpStickyHelpers.UNSUPPORTED_Y;\r\n  var arrayPush = [].push;\r\n  var min$2 = Math.min;\r\n  var MAX_UINT32 = 0xFFFFFFFF;\r\n\r\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\r\n  // Weex JS has frozen built-in prototypes, so use try / catch wrapper\r\n  var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\r\n    // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n    var re = /(?:)/;\r\n    var originalExec = re.exec;\r\n    re.exec = function () { return originalExec.apply(this, arguments); };\r\n    var result = 'ab'.split(re);\r\n    return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\r\n  });\r\n\r\n  // @@split logic\r\n  fixRegexpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\r\n    var internalSplit;\r\n    if (\r\n      'abbc'.split(/(b)*/)[1] == 'c' ||\r\n      // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n      'test'.split(/(?:)/, -1).length != 4 ||\r\n      'ab'.split(/(?:ab)*/).length != 2 ||\r\n      '.'.split(/(.?)(.?)/).length != 4 ||\r\n      // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\r\n      '.'.split(/()()/).length > 1 ||\r\n      ''.split(/.?/).length\r\n    ) {\r\n      // based on es5-shim implementation, need to rework it\r\n      internalSplit = function (separator, limit) {\r\n        var string = toString_1(requireObjectCoercible(this));\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (separator === undefined) return [string];\r\n        // If `separator` is not a regex, use native split\r\n        if (!isRegexp(separator)) {\r\n          return nativeSplit.call(string, separator, lim);\r\n        }\r\n        var output = [];\r\n        var flags = (separator.ignoreCase ? 'i' : '') +\r\n                    (separator.multiline ? 'm' : '') +\r\n                    (separator.unicode ? 'u' : '') +\r\n                    (separator.sticky ? 'y' : '');\r\n        var lastLastIndex = 0;\r\n        // Make `global` and avoid `lastIndex` issues by working with a copy\r\n        var separatorCopy = new RegExp(separator.source, flags + 'g');\r\n        var match, lastIndex, lastLength;\r\n        while (match = regexpExec.call(separatorCopy, string)) {\r\n          lastIndex = separatorCopy.lastIndex;\r\n          if (lastIndex > lastLastIndex) {\r\n            output.push(string.slice(lastLastIndex, match.index));\r\n            if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\r\n            lastLength = match[0].length;\r\n            lastLastIndex = lastIndex;\r\n            if (output.length >= lim) break;\r\n          }\r\n          if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\r\n        }\r\n        if (lastLastIndex === string.length) {\r\n          if (lastLength || !separatorCopy.test('')) output.push('');\r\n        } else output.push(string.slice(lastLastIndex));\r\n        return output.length > lim ? output.slice(0, lim) : output;\r\n      };\r\n    // Chakra, V8\r\n    } else if ('0'.split(undefined, 0).length) {\r\n      internalSplit = function (separator, limit) {\r\n        return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\r\n      };\r\n    } else internalSplit = nativeSplit;\r\n\r\n    return [\r\n      // `String.prototype.split` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.split\r\n      function split(separator, limit) {\r\n        var O = requireObjectCoercible(this);\r\n        var splitter = separator == undefined ? undefined : separator[SPLIT];\r\n        return splitter !== undefined\r\n          ? splitter.call(separator, O, limit)\r\n          : internalSplit.call(toString_1(O), separator, limit);\r\n      },\r\n      // `RegExp.prototype[@@split]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\r\n      //\r\n      // NOTE: This cannot be properly polyfilled in engines that don't support\r\n      // the 'y' flag.\r\n      function (string, limit) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        var C = speciesConstructor(rx, RegExp);\r\n\r\n        var unicodeMatching = rx.unicode;\r\n        var flags = (rx.ignoreCase ? 'i' : '') +\r\n                    (rx.multiline ? 'm' : '') +\r\n                    (rx.unicode ? 'u' : '') +\r\n                    (UNSUPPORTED_Y ? 'g' : 'y');\r\n\r\n        // ^(? + rx + ) is needed, in combination with some S slicing, to\r\n        // simulate the 'y' flag.\r\n        var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\r\n        var p = 0;\r\n        var q = 0;\r\n        var A = [];\r\n        while (q < S.length) {\r\n          splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\r\n          var z = regexpExecAbstract(splitter, UNSUPPORTED_Y ? S.slice(q) : S);\r\n          var e;\r\n          if (\r\n            z === null ||\r\n            (e = min$2(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\r\n          ) {\r\n            q = advanceStringIndex(S, q, unicodeMatching);\r\n          } else {\r\n            A.push(S.slice(p, q));\r\n            if (A.length === lim) return A;\r\n            for (var i = 1; i <= z.length - 1; i++) {\r\n              A.push(z[i]);\r\n              if (A.length === lim) return A;\r\n            }\r\n            q = p = e;\r\n          }\r\n        }\r\n        A.push(S.slice(p));\r\n        return A;\r\n      }\r\n    ];\r\n  }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n\r\n  function addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n\r\n      if (!pre.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.setAttribute(\"class\", \"\".concat(pre, \" \").concat(className));\r\n      }\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(\" \");\r\n        forEach(classes, function (cls) {\r\n          element.classList.add(cls);\r\n        });\r\n      } else if (!element.className.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.className += \" \".concat(className);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns string property value\r\n   */\r\n  function getPropValue(element, propName) {\r\n    var propValue = \"\";\r\n\r\n    if (element.currentStyle) {\r\n      //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) {\r\n      //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    } //Prevent exception in IE\r\n\r\n\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function setShowElement(_ref) {\r\n    var element = _ref.element;\r\n    addClass(element, \"introjs-showElement\");\r\n    var currentElementPosition = getPropValue(element, \"position\");\r\n\r\n    if (currentElementPosition !== \"absolute\" && currentElementPosition !== \"relative\" && currentElementPosition !== \"sticky\" && currentElementPosition !== \"fixed\") {\r\n      //change to new intro item\r\n      addClass(element, \"introjs-relativePosition\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Find the nearest scrollable parent\r\n   * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n   *\r\n   * @param Element element\r\n   * @return Element\r\n   */\r\n  function getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = style.position === \"absolute\";\r\n    var overflowRegex = /(auto|scroll)/;\r\n    if (style.position === \"fixed\") return document.body;\r\n\r\n    for (var parent = element; parent = parent.parentElement;) {\r\n      style = window.getComputedStyle(parent);\r\n\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n   * scroll a scrollable element to a child element\r\n   *\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function scrollParentToElement(targetElement) {\r\n    var element = targetElement.element;\r\n    if (!this._options.scrollToElement) return;\r\n    var parent = getScrollParent(element);\r\n    if (parent === document.body) return;\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return {\r\n        width: window.innerWidth,\r\n        height: window.innerHeight\r\n      };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return {\r\n        width: D.clientWidth,\r\n        height: D.clientHeight\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n    return rect.top >= 0 && rect.left >= 0 && rect.bottom + 80 <= window.innerHeight && // add 80 to get the text right\r\n    rect.right <= window.innerWidth;\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n\r\n  function scrollTo(scrollTo, _ref, tooltipLayer) {\r\n    var element = _ref.element;\r\n    if (scrollTo === \"off\") return;\r\n    var rect;\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === \"tooltip\") {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!elementInViewport(element)) {\r\n      var winHeight = getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top); // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n        //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function setAnchorAsButton(anchor) {\r\n    anchor.setAttribute(\"role\", \"button\");\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  // eslint-disable-next-line es/no-object-assign -- safe\r\n  var $assign = Object.assign;\r\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n  var defineProperty = Object.defineProperty;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  var objectAssign = !$assign || fails(function () {\r\n    // should have correct order of operations (Edge bug)\r\n    if (descriptors && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\r\n      enumerable: true,\r\n      get: function () {\r\n        defineProperty(this, 'b', {\r\n          value: 3,\r\n          enumerable: false\r\n        });\r\n      }\r\n    }), { b: 2 })).b !== 1) return true;\r\n    // should work with symbols and should have deterministic property order (V8 bug)\r\n    var A = {};\r\n    var B = {};\r\n    // eslint-disable-next-line es/no-symbol -- safe\r\n    var symbol = Symbol();\r\n    var alphabet = 'abcdefghijklmnopqrst';\r\n    A[symbol] = 7;\r\n    alphabet.split('').forEach(function (chr) { B[chr] = chr; });\r\n    return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\r\n  }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\r\n    var T = toObject(target);\r\n    var argumentsLength = arguments.length;\r\n    var index = 1;\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    var propertyIsEnumerable = objectPropertyIsEnumerable.f;\r\n    while (argumentsLength > index) {\r\n      var S = indexedObject(arguments[index++]);\r\n      var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\r\n      var length = keys.length;\r\n      var j = 0;\r\n      var key;\r\n      while (length > j) {\r\n        key = keys[j++];\r\n        if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\r\n      }\r\n    } return T;\r\n  } : $assign;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  // eslint-disable-next-line es/no-object-assign -- required for testing\r\n  _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\r\n    assign: objectAssign\r\n  });\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n\r\n  function isFixed(element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === \"HTML\") {\r\n      return false;\r\n    }\r\n\r\n    if (getPropValue(element, \"position\") === \"fixed\") {\r\n      return true;\r\n    }\r\n\r\n    return isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page relative to another element (or body)\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method getOffset\r\n   * @param {Object} element\r\n   * @param {Object} relativeEl\r\n   * @returns Element's position info\r\n   */\r\n\r\n  function getOffset(element, relativeEl) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    relativeEl = relativeEl || body;\r\n    var x = element.getBoundingClientRect();\r\n    var xr = relativeEl.getBoundingClientRect();\r\n    var relativeElPosition = getPropValue(relativeEl, \"position\");\r\n    var obj = {\r\n      width: x.width,\r\n      height: x.height\r\n    };\r\n\r\n    if (relativeEl.tagName.toLowerCase() !== \"body\" && relativeElPosition === \"relative\" || relativeElPosition === \"sticky\") {\r\n      // when the container of our target element is _not_ body and has either \"relative\" or \"sticky\" position, we should not\r\n      // consider the scroll position but we need to include the relative x/y of the container element\r\n      return Object.assign(obj, {\r\n        top: x.top - xr.top,\r\n        left: x.left - xr.left\r\n      });\r\n    } else {\r\n      if (isFixed(element)) {\r\n        return Object.assign(obj, {\r\n          top: x.top,\r\n          left: x.left\r\n        });\r\n      } else {\r\n        return Object.assign(obj, {\r\n          top: x.top + scrollTop,\r\n          left: x.left + scrollLeft\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  var floor$1 = Math.floor;\r\n  var replace = ''.replace;\r\n  var SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\r\n  var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\r\n\r\n  // `GetSubstitution` abstract operation\r\n  // https://tc39.es/ecma262/#sec-getsubstitution\r\n  var getSubstitution = function (matched, str, position, captures, namedCaptures, replacement) {\r\n    var tailPos = position + matched.length;\r\n    var m = captures.length;\r\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\r\n    if (namedCaptures !== undefined) {\r\n      namedCaptures = toObject(namedCaptures);\r\n      symbols = SUBSTITUTION_SYMBOLS;\r\n    }\r\n    return replace.call(replacement, symbols, function (match, ch) {\r\n      var capture;\r\n      switch (ch.charAt(0)) {\r\n        case '$': return '$';\r\n        case '&': return matched;\r\n        case '`': return str.slice(0, position);\r\n        case \"'\": return str.slice(tailPos);\r\n        case '<':\r\n          capture = namedCaptures[ch.slice(1, -1)];\r\n          break;\r\n        default: // \\d\\d?\r\n          var n = +ch;\r\n          if (n === 0) return match;\r\n          if (n > m) {\r\n            var f = floor$1(n / 10);\r\n            if (f === 0) return match;\r\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\r\n            return match;\r\n          }\r\n          capture = captures[n - 1];\r\n      }\r\n      return capture === undefined ? '' : capture;\r\n    });\r\n  };\r\n\r\n  var REPLACE = wellKnownSymbol('replace');\r\n  var max$2 = Math.max;\r\n  var min$1 = Math.min;\r\n\r\n  var maybeToString = function (it) {\r\n    return it === undefined ? it : String(it);\r\n  };\r\n\r\n  // IE <= 11 replaces $0 with the whole match, as if it was $&\r\n  // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\r\n  var REPLACE_KEEPS_$0 = (function () {\r\n    // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\r\n    return 'a'.replace(/./, '$0') === '$0';\r\n  })();\r\n\r\n  // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\r\n  var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\r\n    if (/./[REPLACE]) {\r\n      return /./[REPLACE]('a', '$0') === '';\r\n    }\r\n    return false;\r\n  })();\r\n\r\n  var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\r\n    var re = /./;\r\n    re.exec = function () {\r\n      var result = [];\r\n      result.groups = { a: '7' };\r\n      return result;\r\n    };\r\n    return ''.replace(re, '$<a>') !== '7';\r\n  });\r\n\r\n  // @@replace logic\r\n  fixRegexpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\r\n    var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\r\n\r\n    return [\r\n      // `String.prototype.replace` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.replace\r\n      function replace(searchValue, replaceValue) {\r\n        var O = requireObjectCoercible(this);\r\n        var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\r\n        return replacer !== undefined\r\n          ? replacer.call(searchValue, O, replaceValue)\r\n          : nativeReplace.call(toString_1(O), searchValue, replaceValue);\r\n      },\r\n      // `RegExp.prototype[@@replace]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\r\n      function (string, replaceValue) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n\r\n        if (\r\n          typeof replaceValue === 'string' &&\r\n          replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1 &&\r\n          replaceValue.indexOf('$<') === -1\r\n        ) {\r\n          var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\r\n          if (res.done) return res.value;\r\n        }\r\n\r\n        var functionalReplace = typeof replaceValue === 'function';\r\n        if (!functionalReplace) replaceValue = toString_1(replaceValue);\r\n\r\n        var global = rx.global;\r\n        if (global) {\r\n          var fullUnicode = rx.unicode;\r\n          rx.lastIndex = 0;\r\n        }\r\n        var results = [];\r\n        while (true) {\r\n          var result = regexpExecAbstract(rx, S);\r\n          if (result === null) break;\r\n\r\n          results.push(result);\r\n          if (!global) break;\r\n\r\n          var matchStr = toString_1(result[0]);\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n        }\r\n\r\n        var accumulatedResult = '';\r\n        var nextSourcePosition = 0;\r\n        for (var i = 0; i < results.length; i++) {\r\n          result = results[i];\r\n\r\n          var matched = toString_1(result[0]);\r\n          var position = max$2(min$1(toInteger(result.index), S.length), 0);\r\n          var captures = [];\r\n          // NOTE: This is equivalent to\r\n          //   captures = result.slice(1).map(maybeToString)\r\n          // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\r\n          // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\r\n          // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\r\n          for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\r\n          var namedCaptures = result.groups;\r\n          if (functionalReplace) {\r\n            var replacerArgs = [matched].concat(captures, position, S);\r\n            if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\r\n            var replacement = toString_1(replaceValue.apply(undefined, replacerArgs));\r\n          } else {\r\n            replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\r\n          }\r\n          if (position >= nextSourcePosition) {\r\n            accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\r\n            nextSourcePosition = position + matched.length;\r\n          }\r\n        }\r\n        return accumulatedResult + S.slice(nextSourcePosition);\r\n      }\r\n    ];\r\n  }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n      element.setAttribute(\"class\", pre.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\"));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Sets the style of an DOM element\r\n   *\r\n   * @param {Object} element\r\n   * @param {Object|string} style\r\n   * @return null\r\n   */\r\n  function setStyle(element, style) {\r\n    var cssText = \"\";\r\n\r\n    if (element.style.cssText) {\r\n      cssText += element.style.cssText;\r\n    }\r\n\r\n    if (typeof style === \"string\") {\r\n      cssText += style;\r\n    } else {\r\n      for (var rule in style) {\r\n        cssText += \"\".concat(rule, \":\").concat(style[rule], \";\");\r\n      }\r\n    }\r\n\r\n    element.style.cssText = cssText;\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n\r\n  function setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n      var currentElement = this._introItems[this._currentStep];\r\n      var elementPosition = getOffset(currentElement.element, this._targetElement);\r\n      var widthHeightPadding = this._options.helperElementPadding; // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n\r\n      if (isFixed(currentElement.element)) {\r\n        addClass(helperLayer, \"introjs-fixedTooltip\");\r\n      } else {\r\n        removeClass(helperLayer, \"introjs-fixedTooltip\");\r\n      }\r\n\r\n      if (currentElement.position === \"floating\") {\r\n        widthHeightPadding = 0;\r\n      } //set new position to helper layer\r\n\r\n\r\n      setStyle(helperLayer, {\r\n        width: \"\".concat(elementPosition.width + widthHeightPadding, \"px\"),\r\n        height: \"\".concat(elementPosition.height + widthHeightPadding, \"px\"),\r\n        top: \"\".concat(elementPosition.top - widthHeightPadding / 2, \"px\"),\r\n        left: \"\".concat(elementPosition.left - widthHeightPadding / 2, \"px\")\r\n      });\r\n    }\r\n  }\r\n\r\n  var UNSCOPABLES = wellKnownSymbol('unscopables');\r\n  var ArrayPrototype = Array.prototype;\r\n\r\n  // Array.prototype[@@unscopables]\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  if (ArrayPrototype[UNSCOPABLES] == undefined) {\r\n    objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\r\n      configurable: true,\r\n      value: objectCreate(null)\r\n    });\r\n  }\r\n\r\n  // add a key to Array.prototype[@@unscopables]\r\n  var addToUnscopables = function (key) {\r\n    ArrayPrototype[UNSCOPABLES][key] = true;\r\n  };\r\n\r\n  var $includes = arrayIncludes.includes;\r\n\r\n\r\n  // `Array.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n  _export({ target: 'Array', proto: true }, {\r\n    includes: function includes(el /* , fromIndex = 0 */) {\r\n      return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  addToUnscopables('includes');\r\n\r\n  var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('slice');\r\n\r\n  var SPECIES = wellKnownSymbol('species');\r\n  var nativeSlice = [].slice;\r\n  var max$1 = Math.max;\r\n\r\n  // `Array.prototype.slice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.slice\r\n  // fallback for not array-like ES3 strings and DOM objects\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {\r\n    slice: function slice(start, end) {\r\n      var O = toIndexedObject(this);\r\n      var length = toLength(O.length);\r\n      var k = toAbsoluteIndex(start, length);\r\n      var fin = toAbsoluteIndex(end === undefined ? length : end, length);\r\n      // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\r\n      var Constructor, result, n;\r\n      if (isArray(O)) {\r\n        Constructor = O.constructor;\r\n        // cross-realm fallback\r\n        if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\r\n          Constructor = undefined;\r\n        } else if (isObject(Constructor)) {\r\n          Constructor = Constructor[SPECIES];\r\n          if (Constructor === null) Constructor = undefined;\r\n        }\r\n        if (Constructor === Array || Constructor === undefined) {\r\n          return nativeSlice.call(O, k, fin);\r\n        }\r\n      }\r\n      result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\r\n      for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\r\n      result.length = n;\r\n      return result;\r\n    }\r\n  });\r\n\r\n  var notARegexp = function (it) {\r\n    if (isRegexp(it)) {\r\n      throw TypeError(\"The method doesn't accept regular expressions\");\r\n    } return it;\r\n  };\r\n\r\n  var MATCH = wellKnownSymbol('match');\r\n\r\n  var correctIsRegexpLogic = function (METHOD_NAME) {\r\n    var regexp = /./;\r\n    try {\r\n      '/./'[METHOD_NAME](regexp);\r\n    } catch (error1) {\r\n      try {\r\n        regexp[MATCH] = false;\r\n        return '/./'[METHOD_NAME](regexp);\r\n      } catch (error2) { /* empty */ }\r\n    } return false;\r\n  };\r\n\r\n  // `String.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-string.prototype.includes\r\n  _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\r\n    includes: function includes(searchString /* , position = 0 */) {\r\n      return !!~toString_1(requireObjectCoercible(this))\r\n        .indexOf(toString_1(notARegexp(searchString)), arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  var arrayMethodIsStrict = function (METHOD_NAME, argument) {\r\n    var method = [][METHOD_NAME];\r\n    return !!method && fails(function () {\r\n      // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\r\n      method.call(null, argument || function () { throw 1; }, 1);\r\n    });\r\n  };\r\n\r\n  var nativeJoin = [].join;\r\n\r\n  var ES3_STRINGS = indexedObject != Object;\r\n  var STRICT_METHOD$1 = arrayMethodIsStrict('join', ',');\r\n\r\n  // `Array.prototype.join` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.join\r\n  _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$1 }, {\r\n    join: function join(separator) {\r\n      return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\r\n    }\r\n  });\r\n\r\n  // optional / simple context binding\r\n  var functionBindContext = function (fn, that, length) {\r\n    aFunction(fn);\r\n    if (that === undefined) return fn;\r\n    switch (length) {\r\n      case 0: return function () {\r\n        return fn.call(that);\r\n      };\r\n      case 1: return function (a) {\r\n        return fn.call(that, a);\r\n      };\r\n      case 2: return function (a, b) {\r\n        return fn.call(that, a, b);\r\n      };\r\n      case 3: return function (a, b, c) {\r\n        return fn.call(that, a, b, c);\r\n      };\r\n    }\r\n    return function (/* ...args */) {\r\n      return fn.apply(that, arguments);\r\n    };\r\n  };\r\n\r\n  var push = [].push;\r\n\r\n  // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\r\n  var createMethod = function (TYPE) {\r\n    var IS_MAP = TYPE == 1;\r\n    var IS_FILTER = TYPE == 2;\r\n    var IS_SOME = TYPE == 3;\r\n    var IS_EVERY = TYPE == 4;\r\n    var IS_FIND_INDEX = TYPE == 6;\r\n    var IS_FILTER_REJECT = TYPE == 7;\r\n    var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\r\n    return function ($this, callbackfn, that, specificCreate) {\r\n      var O = toObject($this);\r\n      var self = indexedObject(O);\r\n      var boundFunction = functionBindContext(callbackfn, that, 3);\r\n      var length = toLength(self.length);\r\n      var index = 0;\r\n      var create = specificCreate || arraySpeciesCreate;\r\n      var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\r\n      var value, result;\r\n      for (;length > index; index++) if (NO_HOLES || index in self) {\r\n        value = self[index];\r\n        result = boundFunction(value, index, O);\r\n        if (TYPE) {\r\n          if (IS_MAP) target[index] = result; // map\r\n          else if (result) switch (TYPE) {\r\n            case 3: return true;              // some\r\n            case 5: return value;             // find\r\n            case 6: return index;             // findIndex\r\n            case 2: push.call(target, value); // filter\r\n          } else switch (TYPE) {\r\n            case 4: return false;             // every\r\n            case 7: push.call(target, value); // filterReject\r\n          }\r\n        }\r\n      }\r\n      return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\r\n    };\r\n  };\r\n\r\n  var arrayIteration = {\r\n    // `Array.prototype.forEach` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.foreach\r\n    forEach: createMethod(0),\r\n    // `Array.prototype.map` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.map\r\n    map: createMethod(1),\r\n    // `Array.prototype.filter` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n    filter: createMethod(2),\r\n    // `Array.prototype.some` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.some\r\n    some: createMethod(3),\r\n    // `Array.prototype.every` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.every\r\n    every: createMethod(4),\r\n    // `Array.prototype.find` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.find\r\n    find: createMethod(5),\r\n    // `Array.prototype.findIndex` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.findIndex\r\n    findIndex: createMethod(6),\r\n    // `Array.prototype.filterReject` method\r\n    // https://github.com/tc39/proposal-array-filtering\r\n    filterReject: createMethod(7)\r\n  };\r\n\r\n  var $filter = arrayIteration.filter;\r\n\r\n\r\n  var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\r\n\r\n  // `Array.prototype.filter` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {\r\n    filter: function filter(callbackfn /* , thisArg */) {\r\n      return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = \"\".concat(windowSize.width - tooltipOffset.width - targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.left = \"\".concat(tooltipLayerStyleLeft, \"px\");\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = \"\".concat(-targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.right = \"\".concat(tooltipLayerStyleRight, \"px\");\r\n    return true;\r\n  }\r\n\r\n  var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\r\n\r\n  var max = Math.max;\r\n  var min = Math.min;\r\n  var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\r\n\r\n  // `Array.prototype.splice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.splice\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\r\n    splice: function splice(start, deleteCount /* , ...items */) {\r\n      var O = toObject(this);\r\n      var len = toLength(O.length);\r\n      var actualStart = toAbsoluteIndex(start, len);\r\n      var argumentsLength = arguments.length;\r\n      var insertCount, actualDeleteCount, A, k, from, to;\r\n      if (argumentsLength === 0) {\r\n        insertCount = actualDeleteCount = 0;\r\n      } else if (argumentsLength === 1) {\r\n        insertCount = 0;\r\n        actualDeleteCount = len - actualStart;\r\n      } else {\r\n        insertCount = argumentsLength - 2;\r\n        actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\r\n      }\r\n      if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\r\n        throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\r\n      }\r\n      A = arraySpeciesCreate(O, actualDeleteCount);\r\n      for (k = 0; k < actualDeleteCount; k++) {\r\n        from = actualStart + k;\r\n        if (from in O) createProperty(A, k, O[from]);\r\n      }\r\n      A.length = actualDeleteCount;\r\n      if (insertCount < actualDeleteCount) {\r\n        for (k = actualStart; k < len - actualDeleteCount; k++) {\r\n          from = k + actualDeleteCount;\r\n          to = k + insertCount;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n        for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\r\n      } else if (insertCount > actualDeleteCount) {\r\n        for (k = len - actualDeleteCount; k > actualStart; k--) {\r\n          from = k + actualDeleteCount - 1;\r\n          to = k + insertCount - 1;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n      }\r\n      for (k = 0; k < insertCount; k++) {\r\n        O[k + actualStart] = arguments[k + 2];\r\n      }\r\n      O.length = len - actualDeleteCount + insertCount;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.includes(stringToRemove)) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * auto-determine alignment\r\n   * @param {Integer}  offsetLeft\r\n   * @param {Integer}  tooltipWidth\r\n   * @param {Object}   windowSize\r\n   * @param {String}   desiredAlignment\r\n   * @return {String}  calculatedAlignment\r\n   */\r\n\r\n  function _determineAutoAlignment(offsetLeft, tooltipWidth, _ref, desiredAlignment) {\r\n    var width = _ref.width;\r\n    var halfTooltipWidth = tooltipWidth / 2;\r\n    var winWidth = Math.min(width, window.screen.width);\r\n    var possibleAlignments = [\"-left-aligned\", \"-middle-aligned\", \"-right-aligned\"];\r\n    var calculatedAlignment = \"\"; // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-left-aligned\");\r\n    } // valid middle must be at least half\r\n    // width away from both sides\r\n\r\n\r\n    if (offsetLeft < halfTooltipWidth || winWidth - offsetLeft < halfTooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-middle-aligned\");\r\n    } // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n\r\n\r\n    if (offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-right-aligned\");\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.includes(desiredAlignment)) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small\r\n      // for ANY alignment, middle is\r\n      // probably the best for visibility\r\n      calculatedAlignment = \"-middle-aligned\";\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n\r\n\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = getWinSize();\r\n    var tooltipHeight = getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect(); // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n\r\n    var calculatedPosition = \"floating\";\r\n    /*\r\n     * auto determine position\r\n     */\r\n    // Check for space below\r\n\r\n    if (targetElementRect.bottom + tooltipHeight > windowSize.height) {\r\n      removeEntry(possiblePositions, \"bottom\");\r\n    } // Check for space above\r\n\r\n\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      removeEntry(possiblePositions, \"top\");\r\n    } // Check for space to the right\r\n\r\n\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      removeEntry(possiblePositions, \"right\");\r\n    } // Check for space to the left\r\n\r\n\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      removeEntry(possiblePositions, \"left\");\r\n    } // @var {String}  ex: 'right-aligned'\r\n\r\n\r\n    var desiredAlignment = function (pos) {\r\n      var hyphenIndex = pos.indexOf(\"-\");\r\n\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n\r\n      return \"\";\r\n    }(desiredTooltipPosition || \"\"); // strip alignment from position\r\n\r\n\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split(\"-\")[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (possiblePositions.includes(desiredTooltipPosition)) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    } // only top and bottom positions have optional alignments\r\n\r\n\r\n    if ([\"top\", \"bottom\"].includes(calculatedPosition)) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n\r\n\r\n  function placeTooltip(targetElement, tooltipLayer, arrowLayer, hintMode) {\r\n    var tooltipCssClass = \"\";\r\n    var currentStepObj;\r\n    var tooltipOffset;\r\n    var targetOffset;\r\n    var windowSize;\r\n    var currentTooltipPosition;\r\n    hintMode = hintMode || false; //reset the old style\r\n\r\n    tooltipLayer.style.top = null;\r\n    tooltipLayer.style.right = null;\r\n    tooltipLayer.style.bottom = null;\r\n    tooltipLayer.style.left = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop = null;\r\n    arrowLayer.style.display = \"inherit\"; //prevent error when `this._currentStep` is undefined\r\n\r\n    if (!this._introItems[this._currentStep]) return; //if we have a custom css class for each step\r\n\r\n    currentStepObj = this._introItems[this._currentStep];\r\n\r\n    if (typeof currentStepObj.tooltipClass === \"string\") {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = [\"introjs-tooltip\", tooltipCssClass].filter(Boolean).join(\" \");\r\n    tooltipLayer.setAttribute(\"role\", \"dialog\");\r\n    currentTooltipPosition = this._introItems[this._currentStep].position; // Floating is always valid, no point in calculating\r\n\r\n    if (currentTooltipPosition !== \"floating\" && this._options.autoPosition) {\r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset = getOffset(targetElement);\r\n    tooltipOffset = getOffset(tooltipLayer);\r\n    windowSize = getWinSize();\r\n    addClass(tooltipLayer, \"introjs-\".concat(currentTooltipPosition));\r\n\r\n    switch (currentTooltipPosition) {\r\n      case \"top-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-right\";\r\n        var tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-middle\";\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-left-aligned\": // top-left-aligned is the same as the default top\r\n\r\n      case \"top\":\r\n        arrowLayer.className = \"introjs-arrow bottom\";\r\n        tooltipLayerStyleLeft = hintMode ? 0 : 15;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"right\":\r\n        tooltipLayer.style.left = \"\".concat(targetOffset.width + 20, \"px\");\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow left\";\r\n        }\r\n\r\n        break;\r\n\r\n      case \"left\":\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = \"15px\";\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n          arrowLayer.className = \"introjs-arrow right-bottom\";\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow right\";\r\n        }\r\n\r\n        tooltipLayer.style.right = \"\".concat(targetOffset.width + 20, \"px\");\r\n        break;\r\n\r\n      case \"floating\":\r\n        arrowLayer.style.display = \"none\"; //we have to adjust the top and left of layer manually for intro items without element\r\n\r\n        tooltipLayer.style.left = \"50%\";\r\n        tooltipLayer.style.top = \"50%\";\r\n        tooltipLayer.style.marginLeft = \"-\".concat(tooltipOffset.width / 2, \"px\");\r\n        tooltipLayer.style.marginTop = \"-\".concat(tooltipOffset.height / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-right\";\r\n        tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-middle\";\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n\r\n      default:\r\n        arrowLayer.className = \"introjs-arrow top\";\r\n        tooltipLayerStyleLeft = 0;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n\r\n  function removeShowElement() {\r\n    var elms = document.querySelectorAll(\".introjs-showElement\");\r\n    forEach(elms, function (elm) {\r\n      removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  function _createElement(tagname, attrs) {\r\n    var element = document.createElement(tagname);\r\n    attrs = attrs || {}; // regex for matching attributes that need to be set with setAttribute\r\n\r\n    var setAttRegex = /^(?:role|data-|aria-)/;\r\n\r\n    for (var k in attrs) {\r\n      var v = attrs[k];\r\n\r\n      if (k === \"style\") {\r\n        setStyle(element, v);\r\n      } else if (k.match(setAttRegex)) {\r\n        element.setAttribute(k, v);\r\n      } else {\r\n        element[k] = v;\r\n      }\r\n    }\r\n\r\n    return element;\r\n  }\r\n\r\n  /**\r\n   * Appends `element` to `parentElement`\r\n   *\r\n   * @param {Element} parentElement\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function appendChild(parentElement, element, animate) {\r\n    if (animate) {\r\n      var existingOpacity = element.style.opacity || \"1\";\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        setStyle(element, {\r\n          opacity: existingOpacity\r\n        });\r\n      }, 10);\r\n    }\r\n\r\n    parentElement.appendChild(element);\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt(this._currentStep + 1, 10);\r\n    return currentStep / this._introItems.length * 100;\r\n  }\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n\r\n\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = _createElement(\"div\", {\r\n        className: \"introjs-disableInteraction\"\r\n      });\r\n\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n  /**\r\n   * Creates the bullets layer\r\n   * @returns HTMLElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createBullets(targetElement) {\r\n    var self = this;\r\n    var bulletsLayer = _createElement(\"div\", {\r\n      className: \"introjs-bullets\"\r\n    });\r\n\r\n    if (this._options.showBullets === false) {\r\n      bulletsLayer.style.display = \"none\";\r\n    }\r\n\r\n    var ulContainer = _createElement(\"ul\");\r\n    ulContainer.setAttribute(\"role\", \"tablist\");\r\n\r\n    var anchorClick = function anchorClick() {\r\n      self.goToStep(this.getAttribute(\"data-stepnumber\"));\r\n    };\r\n\r\n    forEach(this._introItems, function (_ref, i) {\r\n      var step = _ref.step;\r\n      var innerLi = _createElement(\"li\");\r\n      var anchorLink = _createElement(\"a\");\r\n      innerLi.setAttribute(\"role\", \"presentation\");\r\n      anchorLink.setAttribute(\"role\", \"tab\");\r\n      anchorLink.onclick = anchorClick;\r\n\r\n      if (i === targetElement.step - 1) {\r\n        anchorLink.className = \"active\";\r\n      }\r\n\r\n      setAnchorAsButton(anchorLink);\r\n      anchorLink.innerHTML = \"&nbsp;\";\r\n      anchorLink.setAttribute(\"data-stepnumber\", step);\r\n      innerLi.appendChild(anchorLink);\r\n      ulContainer.appendChild(innerLi);\r\n    });\r\n    bulletsLayer.appendChild(ulContainer);\r\n    return bulletsLayer;\r\n  }\r\n  /**\r\n   * Deletes and recreates the bullets layer\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _recreateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      var existing = document.querySelector(\".introjs-bullets\");\r\n      existing.parentNode.replaceChild(_createBullets.call(this, targetElement), existing);\r\n    }\r\n  }\r\n  /**\r\n   * Updates the bullets\r\n   *\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   */\r\n\r\n  function _updateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a.active\").className = \"\";\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a[data-stepnumber=\\\"\".concat(targetElement.step, \"\\\"]\")).className = \"active\";\r\n    }\r\n  }\r\n  /**\r\n   * Creates the progress-bar layer and elements\r\n   * @returns {*}\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createProgressBar() {\r\n    var progressLayer = _createElement(\"div\");\r\n    progressLayer.className = \"introjs-progress\";\r\n\r\n    if (this._options.showProgress === false) {\r\n      progressLayer.style.display = \"none\";\r\n    }\r\n\r\n    var progressBar = _createElement(\"div\", {\r\n      className: \"introjs-progressbar\"\r\n    });\r\n\r\n    if (this._options.progressBarAdditionalClass) {\r\n      progressBar.className += \" \" + this._options.progressBarAdditionalClass;\r\n    }\r\n\r\n    progressBar.setAttribute(\"role\", \"progress\");\r\n    progressBar.setAttribute(\"aria-valuemin\", 0);\r\n    progressBar.setAttribute(\"aria-valuemax\", 100);\r\n    progressBar.setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n    progressBar.style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    progressLayer.appendChild(progressBar);\r\n    return progressLayer;\r\n  }\r\n  /**\r\n   * Updates an existing progress bar variables\r\n   * @param oldReferenceLayer\r\n   * @private\r\n   */\r\n\r\n\r\n  function _updateProgressBar(oldReferenceLayer) {\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n  }\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function _showElement(targetElement) {\r\n    var _this = this;\r\n\r\n    if (typeof this._introChangeCallback !== \"undefined\") {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this;\r\n    var oldHelperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var oldReferenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var highlightClass = \"introjs-helperLayer\";\r\n    var nextTooltipButton;\r\n    var prevTooltipButton;\r\n    var skipTooltipButton; //check for a current step highlight class\r\n\r\n    if (typeof targetElement.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(targetElement.highlightClass);\r\n    } //check for options highlight class\r\n\r\n\r\n    if (typeof this._options.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null && oldReferenceLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector(\".introjs-helperNumberLayer\");\r\n      var oldtooltipLayer = oldReferenceLayer.querySelector(\".introjs-tooltiptext\");\r\n      var oldTooltipTitleLayer = oldReferenceLayer.querySelector(\".introjs-tooltip-title\");\r\n      var oldArrowLayer = oldReferenceLayer.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = oldReferenceLayer.querySelector(\".introjs-tooltip\");\r\n      skipTooltipButton = oldReferenceLayer.querySelector(\".introjs-skipbutton\");\r\n      prevTooltipButton = oldReferenceLayer.querySelector(\".introjs-prevbutton\");\r\n      nextTooltipButton = oldReferenceLayer.querySelector(\".introjs-nextbutton\"); //update or reset the helper highlight class\r\n\r\n      oldHelperLayer.className = highlightClass; //hide the tooltip\r\n\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\"; // if the target element is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); // set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, oldHelperLayer);\r\n      setHelperLayerPosition.call(self, oldReferenceLayer); //remove old classes if the element still exist\r\n\r\n      removeShowElement(); //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function () {\r\n        // set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(_this._introItems.length);\r\n        } // set current tooltip text\r\n\r\n\r\n        oldtooltipLayer.innerHTML = targetElement.intro; // set current tooltip title\r\n\r\n        oldTooltipTitleLayer.innerHTML = targetElement.title; //set the tooltip position\r\n\r\n        oldtooltipContainer.style.display = \"block\";\r\n        placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer); //change active bullet\r\n\r\n        _updateBullets.call(self, oldReferenceLayer, targetElement);\r\n\r\n        _updateProgressBar.call(self, oldReferenceLayer); //show the tooltip\r\n\r\n\r\n        oldtooltipContainer.style.opacity = 1; //reset button focus\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null && /introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          nextTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        } // change the scroll of the window, if needed\r\n\r\n\r\n        scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350); // end of old element if-else condition\r\n    } else {\r\n      var helperLayer = _createElement(\"div\", {\r\n        className: highlightClass\r\n      });\r\n      var referenceLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltipReferenceLayer\"\r\n      });\r\n      var arrowLayer = _createElement(\"div\", {\r\n        className: \"introjs-arrow\"\r\n      });\r\n      var tooltipLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip\"\r\n      });\r\n      var tooltipTextLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltiptext\"\r\n      });\r\n      var tooltipHeaderLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip-header\"\r\n      });\r\n      var tooltipTitleLayer = _createElement(\"h1\", {\r\n        className: \"introjs-tooltip-title\"\r\n      });\r\n      var buttonsLayer = _createElement(\"div\");\r\n      setStyle(helperLayer, {\r\n        \"box-shadow\": \"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, \".concat(self._options.overlayOpacity.toString(), \") 0 0 0 5000px\")\r\n      }); // target is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); //set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, helperLayer);\r\n      setHelperLayerPosition.call(self, referenceLayer); //add helper layer to target element\r\n\r\n      appendChild(this._targetElement, helperLayer, true);\r\n      appendChild(this._targetElement, referenceLayer);\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n      tooltipTitleLayer.innerHTML = targetElement.title;\r\n      buttonsLayer.className = \"introjs-tooltipbuttons\";\r\n\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = \"none\";\r\n      }\r\n\r\n      tooltipHeaderLayer.appendChild(tooltipTitleLayer);\r\n      tooltipLayer.appendChild(tooltipHeaderLayer);\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(_createBullets.call(this, targetElement));\r\n      tooltipLayer.appendChild(_createProgressBar.call(this)); // add helper layer number\r\n\r\n      var helperNumberLayer = _createElement(\"div\");\r\n\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = \"introjs-helperNumberLayer\";\r\n        helperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(this._introItems.length);\r\n        tooltipLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer); //next button\r\n\r\n      nextTooltipButton = _createElement(\"a\");\r\n\r\n      nextTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          nextStep.call(self);\r\n        } else if (/introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          if (typeof self._introCompleteCallback === \"function\") {\r\n            self._introCompleteCallback.call(self);\r\n          }\r\n\r\n          exitIntro.call(self, self._targetElement);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel; //previous button\r\n\r\n      prevTooltipButton = _createElement(\"a\");\r\n\r\n      prevTooltipButton.onclick = function () {\r\n        if (self._currentStep !== 0) {\r\n          previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel; //skip button\r\n\r\n      skipTooltipButton = _createElement(\"a\", {\r\n        className: \"introjs-skipbutton\"\r\n      });\r\n      setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof self._introCompleteCallback === \"function\") {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (typeof self._introSkipCallback === \"function\") {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      tooltipHeaderLayer.appendChild(skipTooltipButton); //in order to prevent displaying previous button always\r\n\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n      } // we always need the next button because this\r\n      // button changes to \"Done\" in the last step of the tour\r\n\r\n\r\n      buttonsLayer.appendChild(nextTooltipButton);\r\n      tooltipLayer.appendChild(buttonsLayer); //set proper position\r\n\r\n      placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer); // change the scroll of the window, if needed\r\n\r\n      scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer); //end of new element if-else condition\r\n    } // removing previous disable interaction layer\r\n\r\n\r\n    var disableInteractionLayer = self._targetElement.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    } //disable interaction\r\n\r\n\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    } // when it's the first step of tour\r\n\r\n\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          addClass(nextTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-disabled\");\r\n        }\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          addClass(prevTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          if (this._options.nextToDone === true) {\r\n            nextTooltipButton.innerHTML = this._options.doneLabel;\r\n            addClass(nextTooltipButton, \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-donebutton\"));\r\n          } else {\r\n            nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-disabled\");\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n    }\r\n\r\n    if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n      prevTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n      skipTooltipButton.setAttribute(\"role\", \"button\");\r\n    } //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    setShowElement(targetElement);\r\n\r\n    if (typeof this._introAfterChangeCallback !== \"undefined\") {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n\r\n  function goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n\r\n  function goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n\r\n  function nextStep() {\r\n    var _this = this;\r\n\r\n    this._direction = \"forward\";\r\n\r\n    if (typeof this._currentStepNumber !== \"undefined\") {\r\n      forEach(this._introItems, function (_ref, i) {\r\n        var step = _ref.step;\r\n\r\n        if (step === _this._currentStepNumber) {\r\n          _this._currentStep = i - 1;\r\n          _this._currentStepNumber = undefined;\r\n        }\r\n      });\r\n    }\r\n\r\n    if (typeof this._currentStep === \"undefined\") {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if (this._introItems.length <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof this._introCompleteCallback === \"function\") {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n\r\n      exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n\r\n  function previousStep() {\r\n    this._direction = \"backward\";\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Returns the current step of the intro\r\n   *\r\n   * @returns {number | boolean}\r\n   */\r\n\r\n  function currentStep() {\r\n    return this._currentStep;\r\n  }\r\n\r\n  /**\r\n   * on keyCode:\r\n   * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n   * This feature has been removed from the Web standards.\r\n   * Though some browsers may still support it, it is in\r\n   * the process of being dropped.\r\n   * Instead, you should use KeyboardEvent.code,\r\n   * if it's implemented.\r\n   *\r\n   * jQuery's approach is to test for\r\n   *   (1) e.which, then\r\n   *   (2) e.charCode, then\r\n   *   (3) e.keyCode\r\n   * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n   *\r\n   * @param type var\r\n   * @return type\r\n   */\r\n\r\n  function onKeyDown(e) {\r\n    var code = e.code === undefined ? e.which : e.code; // if e.which is null\r\n\r\n    if (code === null) {\r\n      code = e.charCode === null ? e.keyCode : e.charCode;\r\n    }\r\n\r\n    if ((code === \"Escape\" || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      exitIntro.call(this, this._targetElement);\r\n    } else if (code === \"ArrowLeft\" || code === 37) {\r\n      //left arrow\r\n      previousStep.call(this);\r\n    } else if (code === \"ArrowRight\" || code === 39) {\r\n      //right arrow\r\n      nextStep.call(this);\r\n    } else if (code === \"Enter\" || code === \"NumpadEnter\" || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n\r\n      if (target && target.className.match(\"introjs-prevbutton\")) {\r\n        //user hit enter while focusing on previous button\r\n        previousStep.call(this);\r\n      } else if (target && target.className.match(\"introjs-skipbutton\")) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof this._introCompleteCallback === \"function\") {\r\n          this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute(\"data-stepnumber\")) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        nextStep.call(this);\r\n      } //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n\r\n\r\n      if (e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n   */\r\n  function cloneObject(object) {\r\n    if (object === null || _typeof(object) !== \"object\" || typeof object.nodeType !== \"undefined\") {\r\n      return object;\r\n    }\r\n\r\n    var temp = {};\r\n\r\n    for (var key in object) {\r\n      if (typeof window.jQuery !== \"undefined\" && object[key] instanceof window.jQuery) {\r\n        temp[key] = object[key];\r\n      } else {\r\n        temp[key] = cloneObject(object[key]);\r\n      }\r\n    }\r\n\r\n    return temp;\r\n  }\r\n\r\n  /**\r\n   * Get a queryselector within the hint wrapper\r\n   *\r\n   * @param {String} selector\r\n   * @return {NodeList|Array}\r\n   */\r\n\r\n  function hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n    return hintsWrapper ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method hideHint\r\n   */\r\n\r\n  function hideHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n    removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      addClass(hint, \"introjs-hidehint\");\r\n    } // call the callback function (if any)\r\n\r\n\r\n    if (typeof this._hintCloseCallback !== \"undefined\") {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method hideHints\r\n   */\r\n\r\n  function hideHints() {\r\n    var _this = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      hideHint.call(_this, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n\r\n  function showHints() {\r\n    var _this2 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n\r\n    if (hints && hints.length) {\r\n      forEach(hints, function (hint) {\r\n        showHint.call(_this2, hint.getAttribute(\"data-step\"));\r\n      });\r\n    } else {\r\n      populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method showHint\r\n   */\r\n\r\n  function showHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method removeHints\r\n   */\r\n\r\n  function removeHints() {\r\n    var _this3 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      removeHint.call(_this3, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method removeHint\r\n   */\r\n\r\n  function removeHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method addHints\r\n   */\r\n\r\n  function addHints() {\r\n    var _this4 = this;\r\n\r\n    var self = this;\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = _createElement(\"div\", {\r\n        className: \"introjs-hints\"\r\n      });\r\n    }\r\n    /**\r\n     * Returns an event handler unique to the hint iteration\r\n     *\r\n     * @param {Integer} i\r\n     * @return {Function}\r\n     */\r\n\r\n\r\n    var getHintClick = function getHintClick(i) {\r\n      return function (e) {\r\n        var evt = e ? e : window.event;\r\n\r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    forEach(this._introItems, function (item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector(\".introjs-hint[data-step=\\\"\".concat(i, \"\\\"]\"))) {\r\n        return;\r\n      }\r\n\r\n      var hint = _createElement(\"a\", {\r\n        className: \"introjs-hint\"\r\n      });\r\n      setAnchorAsButton(hint);\r\n      hint.onclick = getHintClick(i);\r\n\r\n      if (!item.hintAnimation) {\r\n        addClass(hint, \"introjs-hint-no-anim\");\r\n      } // hint's position should be fixed if the target element's position is fixed\r\n\r\n\r\n      if (isFixed(item.element)) {\r\n        addClass(hint, \"introjs-fixedhint\");\r\n      }\r\n\r\n      var hintDot = _createElement(\"div\", {\r\n        className: \"introjs-hint-dot\"\r\n      });\r\n      var hintPulse = _createElement(\"div\", {\r\n        className: \"introjs-hint-pulse\"\r\n      });\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute(\"data-step\", i); // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n\r\n      item.targetElement = item.element;\r\n      item.element = hint; // align the hint position\r\n\r\n      alignHintPosition.call(_this4, item.hintPosition, hint, item.targetElement);\r\n      hintsWrapper.appendChild(hint);\r\n    }); // adding the hints wrapper\r\n\r\n    document.body.appendChild(hintsWrapper); // call the callback function (if any)\r\n\r\n    if (typeof this._hintsAddedCallback !== \"undefined\") {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n\r\n  function alignHintPosition(position, _ref, element) {\r\n    var style = _ref.style;\r\n    // get/calculate offset of target element\r\n    var offset = getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20; // align the hint element\r\n\r\n    switch (position) {\r\n      default:\r\n      case \"top-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"top-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"bottom-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"middle-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"top-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n    }\r\n  }\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n\r\n  function showHintDialog(stepId) {\r\n    var hintElement = document.querySelector(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"));\r\n    var item = this._introItems[stepId]; // call the callback function (if any)\r\n\r\n    if (typeof this._hintClickCallback !== \"undefined\") {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    } // remove all open tooltips\r\n\r\n\r\n    var removedStep = removeHintTooltip.call(this); // to toggle the tooltip\r\n\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = _createElement(\"div\", {\r\n      className: \"introjs-tooltip\"\r\n    });\r\n    var tooltipTextLayer = _createElement(\"div\");\r\n    var arrowLayer = _createElement(\"div\");\r\n    var referenceLayer = _createElement(\"div\");\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      } //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = \"introjs-tooltiptext\";\r\n    var tooltipWrapper = _createElement(\"p\");\r\n    tooltipWrapper.innerHTML = item.hint;\r\n    var closeButton = _createElement(\"a\");\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute(\"role\", \"button\");\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = hideHint.bind(this, stepId);\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n    arrowLayer.className = \"introjs-arrow\";\r\n    tooltipLayer.appendChild(arrowLayer);\r\n    tooltipLayer.appendChild(tooltipTextLayer); // set current step for _placeTooltip function\r\n\r\n    this._currentStep = hintElement.getAttribute(\"data-step\"); // align reference layer position\r\n\r\n    referenceLayer.className = \"introjs-tooltipReferenceLayer introjs-hintReference\";\r\n    referenceLayer.setAttribute(\"data-step\", hintElement.getAttribute(\"data-step\"));\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer); //set proper position\r\n\r\n    placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, true);\r\n  }\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n\r\n  function removeHintTooltip() {\r\n    var tooltip = document.querySelector(\".introjs-hintReference\");\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute(\"data-step\");\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n\r\n  function populateHints(targetElm) {\r\n    var _this5 = this;\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      forEach(this._options.hints, function (hint) {\r\n        var currentItem = cloneObject(hint);\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || _this5._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || _this5._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          _this5._introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      var hints = targetElm.querySelectorAll(\"*[data-hint]\");\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      } //first add intro items with data-step\r\n\r\n\r\n      forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute(\"data-hintanimation\");\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = hintAnimation === \"true\";\r\n        } else {\r\n          hintAnimation = _this5._options.hintAnimation;\r\n        }\r\n\r\n        _this5._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute(\"data-hint\"),\r\n          hintPosition: currentElement.getAttribute(\"data-hintposition\") || _this5._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n          position: currentElement.getAttribute(\"data-position\") || _this5._options.tooltipPosition\r\n        });\r\n      });\r\n    }\r\n\r\n    addHints.call(this);\r\n    /*\r\n    todo:\r\n    these events should be removed at some point\r\n    */\r\n\r\n    DOMEvent.on(document, \"click\", removeHintTooltip, this, false);\r\n    DOMEvent.on(window, \"resize\", reAlignHints, this, true);\r\n  }\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n\r\n  function reAlignHints() {\r\n    var _this6 = this;\r\n\r\n    forEach(this._introItems, function (_ref2) {\r\n      var targetElement = _ref2.targetElement,\r\n          hintPosition = _ref2.hintPosition,\r\n          element = _ref2.element;\r\n\r\n      if (typeof targetElement === \"undefined\") {\r\n        return;\r\n      }\r\n\r\n      alignHintPosition.call(_this6, hintPosition, element, targetElement);\r\n    });\r\n  }\r\n\r\n  // TODO: use something more complex like timsort?\r\n  var floor = Math.floor;\r\n\r\n  var mergeSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var middle = floor(length / 2);\r\n    return length < 8 ? insertionSort(array, comparefn) : merge(\r\n      mergeSort(array.slice(0, middle), comparefn),\r\n      mergeSort(array.slice(middle), comparefn),\r\n      comparefn\r\n    );\r\n  };\r\n\r\n  var insertionSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var i = 1;\r\n    var element, j;\r\n\r\n    while (i < length) {\r\n      j = i;\r\n      element = array[i];\r\n      while (j && comparefn(array[j - 1], element) > 0) {\r\n        array[j] = array[--j];\r\n      }\r\n      if (j !== i++) array[j] = element;\r\n    } return array;\r\n  };\r\n\r\n  var merge = function (left, right, comparefn) {\r\n    var llength = left.length;\r\n    var rlength = right.length;\r\n    var lindex = 0;\r\n    var rindex = 0;\r\n    var result = [];\r\n\r\n    while (lindex < llength || rindex < rlength) {\r\n      if (lindex < llength && rindex < rlength) {\r\n        result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);\r\n      } else {\r\n        result.push(lindex < llength ? left[lindex++] : right[rindex++]);\r\n      }\r\n    } return result;\r\n  };\r\n\r\n  var arraySort = mergeSort;\r\n\r\n  var firefox = engineUserAgent.match(/firefox\\/(\\d+)/i);\r\n\r\n  var engineFfVersion = !!firefox && +firefox[1];\r\n\r\n  var engineIsIeOrEdge = /MSIE|Trident/.test(engineUserAgent);\r\n\r\n  var webkit = engineUserAgent.match(/AppleWebKit\\/(\\d+)\\./);\r\n\r\n  var engineWebkitVersion = !!webkit && +webkit[1];\r\n\r\n  var test = [];\r\n  var nativeSort = test.sort;\r\n\r\n  // IE8-\r\n  var FAILS_ON_UNDEFINED = fails(function () {\r\n    test.sort(undefined);\r\n  });\r\n  // V8 bug\r\n  var FAILS_ON_NULL = fails(function () {\r\n    test.sort(null);\r\n  });\r\n  // Old WebKit\r\n  var STRICT_METHOD = arrayMethodIsStrict('sort');\r\n\r\n  var STABLE_SORT = !fails(function () {\r\n    // feature detection can be too slow, so check engines versions\r\n    if (engineV8Version) return engineV8Version < 70;\r\n    if (engineFfVersion && engineFfVersion > 3) return;\r\n    if (engineIsIeOrEdge) return true;\r\n    if (engineWebkitVersion) return engineWebkitVersion < 603;\r\n\r\n    var result = '';\r\n    var code, chr, value, index;\r\n\r\n    // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\r\n    for (code = 65; code < 76; code++) {\r\n      chr = String.fromCharCode(code);\r\n\r\n      switch (code) {\r\n        case 66: case 69: case 70: case 72: value = 3; break;\r\n        case 68: case 71: value = 4; break;\r\n        default: value = 2;\r\n      }\r\n\r\n      for (index = 0; index < 47; index++) {\r\n        test.push({ k: chr + index, v: value });\r\n      }\r\n    }\r\n\r\n    test.sort(function (a, b) { return b.v - a.v; });\r\n\r\n    for (index = 0; index < test.length; index++) {\r\n      chr = test[index].k.charAt(0);\r\n      if (result.charAt(result.length - 1) !== chr) result += chr;\r\n    }\r\n\r\n    return result !== 'DGBEFHACIJK';\r\n  });\r\n\r\n  var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\r\n\r\n  var getSortCompare = function (comparefn) {\r\n    return function (x, y) {\r\n      if (y === undefined) return -1;\r\n      if (x === undefined) return 1;\r\n      if (comparefn !== undefined) return +comparefn(x, y) || 0;\r\n      return toString_1(x) > toString_1(y) ? 1 : -1;\r\n    };\r\n  };\r\n\r\n  // `Array.prototype.sort` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.sort\r\n  _export({ target: 'Array', proto: true, forced: FORCED }, {\r\n    sort: function sort(comparefn) {\r\n      if (comparefn !== undefined) aFunction(comparefn);\r\n\r\n      var array = toObject(this);\r\n\r\n      if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);\r\n\r\n      var items = [];\r\n      var arrayLength = toLength(array.length);\r\n      var itemsLength, index;\r\n\r\n      for (index = 0; index < arrayLength; index++) {\r\n        if (index in array) items.push(array[index]);\r\n      }\r\n\r\n      items = arraySort(items, getSortCompare(comparefn));\r\n      itemsLength = items.length;\r\n      index = 0;\r\n\r\n      while (index < itemsLength) array[index] = items[index++];\r\n      while (index < arrayLength) delete array[index++];\r\n\r\n      return array;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Finds all Intro steps from the data-* attributes and the options.steps array\r\n   *\r\n   * @api private\r\n   * @param targetElm\r\n   * @returns {[]}\r\n   */\r\n\r\n  function fetchIntroSteps(targetElm) {\r\n    var _this = this;\r\n\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\");\r\n    var introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      forEach(this._options.steps, function (step) {\r\n        var currentItem = cloneObject(step); //set the step\r\n\r\n        currentItem.step = introItems.length + 1;\r\n        currentItem.title = currentItem.title || \"\"; //use querySelector function only when developer used CSS selector\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        } //intro without element\r\n\r\n\r\n        if (typeof currentItem.element === \"undefined\" || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = _createElement(\"div\", {\r\n              className: \"introjsFloatingElement\"\r\n            });\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element = floatingElementQuery;\r\n          currentItem.position = \"floating\";\r\n        }\r\n\r\n        currentItem.position = currentItem.position || _this._options.tooltipPosition;\r\n        currentItem.scrollTo = currentItem.scrollTo || _this._options.scrollTo;\r\n\r\n        if (typeof currentItem.disableInteraction === \"undefined\") {\r\n          currentItem.disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction; //if there's no element to intro\r\n\r\n      if (elmsLength < 1) {\r\n        return [];\r\n      }\r\n\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        } // skip hidden elements\r\n\r\n\r\n        if (currentElement.style.display === \"none\") {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute(\"data-step\"), 10);\r\n\r\n        if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n          disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n        } else {\r\n          disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: parseInt(currentElement.getAttribute(\"data-step\"), 10),\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }); //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n\r\n      var nextStep = 0;\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        }\r\n\r\n        if (currentElement.getAttribute(\"data-step\") === null) {\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === \"undefined\") {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          }\r\n\r\n          if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n            disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n          } else {\r\n            disableInteraction = _this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      });\r\n    } //removing undefined/null elements\r\n\r\n\r\n    var tempIntroItems = [];\r\n\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);\r\n      }\r\n    }\r\n\r\n    introItems = tempIntroItems; //Ok, sort all items with given steps\r\n\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n    return introItems;\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   * @param {boolean} refreshSteps to refresh the intro steps as well\r\n   */\r\n\r\n  function refresh(refreshSteps) {\r\n    var referenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var helperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\"); // re-align intros\r\n\r\n    setHelperLayerPosition.call(this, helperLayer);\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n\r\n    if (refreshSteps) {\r\n      this._introItems = fetchIntroSteps.call(this, this._targetElement);\r\n\r\n      _recreateBullets.call(this, referenceLayer, this._introItems[this._currentStep]);\r\n\r\n      _updateProgressBar.call(this, referenceLayer);\r\n    } // re-align tooltip\r\n\r\n\r\n    if (this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldArrowLayer = document.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = document.querySelector(\".introjs-tooltip\");\r\n      placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer);\r\n    } //re-align hints\r\n\r\n\r\n    reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  function onResize() {\r\n    refresh.call(this);\r\n  }\r\n\r\n  /**\r\n   * Removes `element` from `parentElement`\r\n   *\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function removeChild(element, animate) {\r\n    if (!element || !element.parentElement) return;\r\n    var parentElement = element.parentElement;\r\n\r\n    if (animate) {\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        try {\r\n          // removeChild(..) throws an exception if the child has already been removed (https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild)\r\n          // this try-catch is added to make sure this function doesn't throw an exception if the child has been removed\r\n          // this scenario can happen when start()/exit() is called multiple times and the helperLayer is removed by the\r\n          // previous exit() call (note: this is a timeout)\r\n          parentElement.removeChild(element);\r\n        } catch (e) {}\r\n      }, 500);\r\n    } else {\r\n      parentElement.removeChild(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n\r\n  function exitIntro(targetElement, force) {\r\n    var continueExit = true; // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    } // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n\r\n\r\n    if (!force && continueExit === false) return; // remove overlay layers from the page\r\n\r\n    var overlayLayers = targetElement.querySelectorAll(\".introjs-overlay\");\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      forEach(overlayLayers, function (overlayLayer) {\r\n        return removeChild(overlayLayer);\r\n      });\r\n    } //remove all helper layers\r\n\r\n\r\n    var helperLayer = targetElement.querySelector(\".introjs-helperLayer\");\r\n    removeChild(helperLayer, true);\r\n    var referenceLayer = targetElement.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    removeChild(referenceLayer); //remove disableInteractionLayer\r\n\r\n    var disableInteractionLayer = targetElement.querySelector(\".introjs-disableInteraction\");\r\n    removeChild(disableInteractionLayer); //remove intro floating element\r\n\r\n    var floatingElement = document.querySelector(\".introjsFloatingElement\");\r\n    removeChild(floatingElement);\r\n    removeShowElement(); //clean listeners\r\n\r\n    DOMEvent.off(window, \"keydown\", onKeyDown, this, true);\r\n    DOMEvent.off(window, \"resize\", onResize, this, true); //check if any callback is defined\r\n\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    } //set the step to zero\r\n\r\n\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n\r\n  function addOverlayLayer(targetElm) {\r\n    var _this = this;\r\n\r\n    var overlayLayer = _createElement(\"div\", {\r\n      className: \"introjs-overlay\"\r\n    });\r\n    setStyle(overlayLayer, {\r\n      top: 0,\r\n      bottom: 0,\r\n      left: 0,\r\n      right: 0,\r\n      position: \"fixed\"\r\n    });\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    if (this._options.exitOnOverlayClick === true) {\r\n      setStyle(overlayLayer, {\r\n        cursor: \"pointer\"\r\n      });\r\n\r\n      overlayLayer.onclick = function () {\r\n        exitIntro.call(_this, targetElm);\r\n      };\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method introForElement\r\n   * @param {Object} targetElm\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n\r\n  function introForElement(targetElm) {\r\n    //set it to the introJs object\r\n    var steps = fetchIntroSteps.call(this, targetElm);\r\n\r\n    if (steps.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    this._introItems = steps; //add overlay layer to the page\r\n\r\n    if (addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, \"keydown\", onKeyDown, this, true);\r\n      } //for window resize\r\n\r\n\r\n      DOMEvent.on(window, \"resize\", onResize, this, true);\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  var version = \"4.2.2\";\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: \"Next\",\r\n\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: \"Back\",\r\n\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: \"×\",\r\n\r\n      /* Done button label in tooltip box */\r\n      doneLabel: \"Done\",\r\n\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button (note: this will also hide the \"Done\" button) */\r\n      hideNext: false,\r\n\r\n      /* Change the Next button to Done in the last step of the intro? otherwise, it will render a disabled button */\r\n      nextToDone: true,\r\n\r\n      /* Default tooltip box position */\r\n      tooltipPosition: \"bottom\",\r\n\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: \"\",\r\n\r\n      /* Start intro for a group of elements */\r\n      group: \"\",\r\n\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: \"\",\r\n\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: false,\r\n\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: \"element\",\r\n\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.5,\r\n\r\n      /* To determine the tooltip position automatically based on the window.width/height */\r\n      autoPosition: true,\r\n\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n\r\n      /* Default hint position */\r\n      hintPosition: \"top-middle\",\r\n\r\n      /* Hint button label */\r\n      hintButtonLabel: \"Got it\",\r\n\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\",\r\n\r\n      /* additional classes to put on progress bar */\r\n      progressBarAdditionalClass: false\r\n    };\r\n  }\r\n\r\n  var introJs = function introJs(targetElm) {\r\n    var instance;\r\n\r\n    if (_typeof(targetElm) === \"object\") {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n    } else if (typeof targetElm === \"string\") {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error(\"There is no element with given selector.\");\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    } // add instance to list of _instances\r\n    // passing group to stamp to increment\r\n    // from 0 onward somewhat reliably\r\n\r\n\r\n    introJs.instances[stamp(instance, \"introjs-instance\")] = instance;\r\n    return instance;\r\n  };\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n\r\n\r\n  introJs.version = version;\r\n  /**\r\n   * key-val object helper for introJs instances\r\n   *\r\n   * @property instances\r\n   * @type Object\r\n   */\r\n\r\n  introJs.instances = {}; //Prototype\r\n\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function clone() {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function setOption(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function setOptions(options) {\r\n      this._options = mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function start() {\r\n      introForElement.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    goToStep: function goToStep$1(step) {\r\n      goToStep.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    addStep: function addStep(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function addSteps(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for (var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function goToStepNumber$1(step) {\r\n      goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function nextStep$1() {\r\n      nextStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    previousStep: function previousStep$1() {\r\n      previousStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    currentStep: function currentStep$1() {\r\n      return currentStep.call(this);\r\n    },\r\n    exit: function exit(force) {\r\n      exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function refresh$1(refreshSteps) {\r\n      refresh.call(this, refreshSteps);\r\n\r\n      return this;\r\n    },\r\n    onbeforechange: function onbeforechange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforechange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onchange: function onchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onchange was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onafterchange: function onafterchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onafterchange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    oncomplete: function oncomplete(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for oncomplete was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintsadded: function onhintsadded(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintsadded was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclick: function onhintclick(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclick was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclose: function onhintclose(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclose was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onexit: function onexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onskip: function onskip(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onskip was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onbeforeexit: function onbeforeexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforeexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    addHints: function addHints() {\r\n      populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function hideHint$1(stepId) {\r\n      hideHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    hideHints: function hideHints$1() {\r\n      hideHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    showHint: function showHint$1(stepId) {\r\n      showHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHints: function showHints$1() {\r\n      showHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHints: function removeHints$1() {\r\n      removeHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHint: function removeHint$1(stepId) {\r\n      removeHint().call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHintDialog: function showHintDialog$1(stepId) {\r\n      showHintDialog.call(this, stepId);\r\n\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n\r\n})));\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep and done\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welcti = loc.TOUR_welcti || \"<span class='tgreeting'> Welcome to our guided tour! </span>\";\r\n  loc.TOUR_welc = loc.TOUR_welc || \"This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example.\";\r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";\r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";\r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.5,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,  \r\n      'tooltipClass': 'customTooltip',\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {  \r\n          element: '#link-guided-tour',\r\n          title: loc.TOUR_welcti,\r\n          intro: loc.TOUR_welc,\r\n          position: 'right',\r\n        },\r\n        {\r\n          title: loc.TOUR_sear1ti,\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_searAnnotti,\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_annotAssti,\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          },\r\n        {\r\n          title:loc.TOUR_vccho1ti,\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vccho2ti,\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_vcStat1ti,\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vcStat2ti,\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_qlfieldti,\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          title: loc.TOUR_glimpseti,\r\n          element: doe.querySelector('#glimpse').parentNode,\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_helpti,\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_seargoti,\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions().add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (values) {\r\n      return Object.create(this)._init(values);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a default value.\r\n     * This will only be set, if no other value is set yet.\r\n     */\r\n    setIfNotYet : function (value) {\r\n      if (this.value == undefined) {\r\n        this.set(value);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      if (this.value == undefined) {\r\n        this.value = this.values[0];\r\n      };\r\n\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.get() == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions().add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to a plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          if (onClick[\"default\"] !== undefined) {\r\n            state.setIfNotYet(onClick[\"default\"]);\r\n          };\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions().addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\r\n      \r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from form\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"search\"] = window.location.search; // readonly\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        }\r\n\r\n        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\r\n        };\r\n\r\n        // data needs to be mirrored\r\n        if (d._id) {\r\n          service.sendMsg(d);\r\n        };\r\n\r\n        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    console.log(arguments);\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onload = function () {\r\n      console.log(req.responseText); //TODO this needs to be done also\r\n    }\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText +\" - \"+ JSON.parse(this.responseText).errors[0].message\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      console.log(\"JSON: \\n\",JSON.stringify(jsObj));\r\n      console.log(req);\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * CAUTION: Currently not supported by the QueryReference Plugin.\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'panel/pagination',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             paginationPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (e._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    });\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n   \r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions().element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Add pagination panel\r\n     */\r\n    const paginationPanel = paginationPanelClass.create();\r\n\r\n    if (paginationPanel) {\r\n      paginationPanel.addRandomPage();\r\n      KorAP.Panel['pagination'] = paginationPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.1-en.js b/public/js/kalamar-0.43.1-en.js
new file mode 100644
index 0000000..2bc5179
--- /dev/null
+++ b/public/js/kalamar-0.43.1-en.js
@@ -0,0 +1,22 @@
+!function(){
+/**
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
+ */
+var t,e,n;!function(i){var r,o,s,a,c={},l={},u={},h={},d=Object.prototype.hasOwnProperty,f=[].slice,p=/\.js$/;function v(t,e){return d.call(t,e)}function g(t,e){var n,i,r,o,s,a,c,l,h,d,f,v=e&&e.split("/"),g=u.map,m=g&&g["*"]||{};if(t){for(s=(t=t.split("/")).length-1,u.nodeIdCompat&&p.test(t[s])&&(t[s]=t[s].replace(p,"")),"."===t[0].charAt(0)&&v&&(t=v.slice(0,v.length-1).concat(t)),h=0;h<t.length;h++)if("."===(f=t[h]))t.splice(h,1),h-=1;else if(".."===f){if(0===h||1===h&&".."===t[2]||".."===t[h-1])continue;h>0&&(t.splice(h-1,2),h-=2)}t=t.join("/")}if((v||m)&&g){for(h=(n=t.split("/")).length;h>0;h-=1){if(i=n.slice(0,h).join("/"),v)for(d=v.length;d>0;d-=1)if((r=g[v.slice(0,d).join("/")])&&(r=r[i])){o=r,a=h;break}if(o)break;!c&&m&&m[i]&&(c=m[i],l=h)}!o&&c&&(o=c,a=l),o&&(n.splice(0,a,o),t=n.join("/"))}return t}function m(t,e){return function(){var n=f.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),o.apply(void 0,n.concat([t,e]))}}function _(t){return function(e){c[t]=e}}function y(t){if(v(l,t)){var e=l[t];delete l[t],h[t]=!0,r.apply(void 0,e)}if(!v(c,t)&&!v(h,t))throw new Error("No "+t);return c[t]}function b(t){var e,n=t?t.indexOf("!"):-1;return n>-1&&(e=t.substring(0,n),t=t.substring(n+1,t.length)),[e,t]}function w(t){return t?b(t):[]}function E(t){return function(){return u&&u.config&&u.config[t]||{}}}s=function(t,e){var n,i,r=b(t),o=r[0],s=e[1];return t=r[1],o&&(n=y(o=g(o,s))),o?t=n&&n.normalize?n.normalize(t,(i=s,function(t){return g(t,i)})):g(t,s):(o=(r=b(t=g(t,s)))[0],t=r[1],o&&(n=y(o))),{f:o?o+"!"+t:t,n:t,pr:o,p:n}},a={require:function(t){return m(t)},exports:function(t){var e=c[t];return void 0!==e?e:c[t]={}},module:function(t){return{id:t,uri:"",exports:c[t],config:E(t)}}},r=function(t,e,n,i){var r,o,u,d,f,p,g,b=[],E=typeof n;if(p=w(i=i||t),"undefined"===E||"function"===E){for(e=!e.length&&n.length?["require","exports","module"]:e,f=0;f<e.length;f+=1)if("require"===(o=(d=s(e[f],p)).f))b[f]=a.require(t);else if("exports"===o)b[f]=a.exports(t),g=!0;else if("module"===o)r=b[f]=a.module(t);else if(v(c,o)||v(l,o)||v(h,o))b[f]=y(o);else{if(!d.p)throw new Error(t+" missing "+o);d.p.load(d.n,m(i,!0),_(o),{}),b[f]=c[o]}u=n?n.apply(c[t],b):void 0,t&&(r&&void 0!==r.exports&&r.exports!==c[t]?c[t]=r.exports:void 0===u&&g||(c[t]=u))}else t&&(c[t]=n)},t=e=o=function(t,e,n,i,c){if("string"==typeof t)return a[t]?a[t](e):y(s(t,w(e)).f);if(!t.splice){if((u=t).deps&&o(u.deps,u.callback),!e)return;e.splice?(t=e,e=n,n=null):t=void 0}return e=e||function(){},"function"==typeof n&&(n=i,i=c),i?r(void 0,t,e,n):setTimeout((function(){r(void 0,t,e,n)}),4),o},o.config=function(t){return o(t)},t._defined=c,(n=function(t,e,n){if("string"!=typeof t)throw new Error("See almond README: incorrect module build, no module name");e.splice||(n=e,e=[]),v(c,t)||v(l,t)||(l[t]=[t,e,n])}).amd={jQuery:!0}}(),n("lib/almond",(function(){})),window.KorAP=window.KorAP||{},void 0===Event.halt&&(Event.prototype.halt=function(){this.stopPropagation(),this.preventDefault()});const o=new RegExp('(["\\\\])',"g");String.prototype.quote=function(){return'"'+this.replace(o,"\\$1")+'"'};const s=new RegExp("([/\\\\])","g");String.prototype.escapeRegex=function(){return this.replace(s,"\\$1")};const a=new RegExp("[^-a-zA-Z0-9_\\s]+","g"),c=new RegExp("[-\\s]+","g");function u(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function h(t){return t.charCode&&0==t.keyCode?t.charCode:t.keyCode}function f(t){return("0"+t.toString(16)).substr(-2)}String.prototype.slugify=function(){return this.toLowerCase().replace(a,"").replace(c,"-")},Object.prototype.upgradeTo=function(t){for(let e in t)this[e]=t[e];return this},HTMLElement.prototype.toggleClass=function(t,e){const n=this.classList;n.contains(t)?(n.add(e),n.remove(t)):(n.remove(e),n.add(t))},HTMLElement.prototype.addE=function(t){return this.appendChild(document.createElement(t))},HTMLElement.prototype.addT=function(t){return this.appendChild(document.createTextNode(t))},n("util",[],(function(){KorAP.API=KorAP.API||{},KorAP.Locale=KorAP.Locale||{};const t=KorAP.Locale;return t.OR=t.OR||"or",t.AND=t.AND||"and",KorAP.newStyleSheet=function(){if(void 0===KorAP._sheet){const t=document.createElement("style");document.head.appendChild(t),KorAP._sheet=t.sheet}return KorAP._sheet},KorAP.log=KorAP.log||function(t,e,n){n&&(e+=" from "+n),console.log(t+": "+e)},KorAP})),window.KorAP=window.KorAP||{},KorAP.annotationHelper=KorAP.annotationHelper||{"-":[]},n("hint/foundries",["util"],(function(){const t=KorAP.annotationHelper;return t.getDesc=function(t,e){if(!t)return;let n=this[t];if(n){if(e.includes(":")){{const i=e.split(":");let r=i[0]+":",o=i[1]+" ",s="";for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==r){n[t][2]?s+=n[t][2]:s+=n[t][0];break}if(0===s.length)return;if(n=this[t+r],!n)return;for(let t=0;t<n.length;t++)if(n[t]&&n[t][1]==o)return n[t][2]&&(s+=": "+n[t][2]),s}return""}e+=" ";for(var i=0;i<n.length;i++)if(n[i]&&n[i][1]==e)return n[i][2]?n[i][2]:void 0}},t})),n("hint/foundries/base",["hint/foundries"],(function(t){t["-"].push(["Base Annotation","base/s=","Structure"]),t["base/s="]=[["s","s","Sentence"],["p","p","Paragraph"],["t","t","Text"]]})),n("hint/foundries/dereko",["hint/foundries"],(function(t){t["-"].push(["DeReKo","dereko/s=","Structure"])})),e(["hint/foundries/base","hint/foundries/dereko"]),n("default",(function(){})),n("menu/item",{create:function(t){return Object.create(this)._init(t)},content:function(t){return 1===arguments.length&&(this._content=document.createTextNode(t)),this._content},action:function(t){return 1===arguments.length&&(this._action=t),this._action},lcField:function(){return this._lcField},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},noMore:function(t){const e=this.element().classList;if(void 0===t)return e.contains("no-more");t?e.add("no-more"):e.remove("no-more")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),t.appendChild(this.content()),this._el=t},highlight:function(t){if(this._prefix===t)return;null!==this._prefix&&this.lowlight();const e=this.element().childNodes;for(let n=e.length-1;n>=0;n--)this._highlight(e[n],t);this._prefix=t},lowlight:function(){if(null===this._prefix)return;const t=this.element(),e=t.getElementsByTagName("mark");for(let t=e.length-1;t>=0;t--)e[t].parentNode.replaceChild(document.createTextNode(e[t].firstChild.nodeValue),e[t]);t.normalize(),this._prefix=null},_highlight:function(t,e){if(3===t.nodeType){const n=t.nodeValue,i=n.toLowerCase();if(e){const r=(e=e.trim()).split(" ");let o,s=-1,a=0;if(r.forEach((function(t){o=i.indexOf(t),o<0||(-1===s||o<s?(s=o,a=t.length):o===s&&t.length>a&&(a=t.length))})),s>=0){s>0&&t.parentNode.insertBefore(document.createTextNode(n.substr(0,s)),t);const i=document.createElement("mark");i.appendChild(document.createTextNode(n.substr(s,a))),t.parentNode.insertBefore(i,t);const r=n.substr(s+a);if(r.length>0){const n=document.createTextNode(r);t.parentNode.insertBefore(n,t),this._highlight(n,e)}t.parentNode.removeChild(t)}}}else{const n=t.childNodes;for(let t=n.length-1;t>=0;t--)this._highlight(n[t],e)}},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e.content(t[0]),t.length>1&&(e._action=t[1],t.length>2&&(e._onclick=t[2])),e._lcField=" "+e.content().textContent.toLowerCase(),e._prefix=null,this},onclick:function(t){const e=this.menu();e.prefix(""),this._onclick&&this._onclick.apply(this,t),e.hide()},menu:function(){return this._menu}}),n("menu/prefix",{create:function(){return Object.create(this)._init()},_init:function(){const t=this;return t._string="",t._el=document.createElement("span"),t._el.classList.add("non-item"),t._el.classList.add("pref"),void 0!==t.onclick&&(t._el.onclick=t.onclick.bind(t)),t},_update:function(){return this._el.innerHTML=this._string},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},isSet:function(){return this._string.length>0},value:function(t){return 1===arguments.length?(this._string=t,this._update()):this._string},add:function(t){return this._string+=t,this._update()},clear:function(){return this._string="",this._update()},onclick:function(){},chop:function(){const t=this;return t._string.length>1?t._string=t._string.substring(0,t._string.length-1):t._string="",t._update()},element:function(){return this._el},menu:function(){return this._menu}}),n("menu/lengthField",{create:function(){return Object.create(this)._init()},_init:function(){return this._el=document.createElement("div"),this._el.classList.add("lengthField"),this},element:function(){return this._el},add:function(t){this._el.appendChild(document.createElement("span")).appendChild(document.createTextNode(t[0]+"--"))},reset:function(){for(;this._el.firstChild;)this._el.firstChild.remove()}}),n("menu/slider",{create:function(t){return Object.create(this)._init(t)},length:function(t){return 0===arguments.length?this._length:(t==this._length||(this._length=t),this)},limit:function(t){return 0===arguments.length?this._limit:(t==this._limit||(this._limit=t),this)},active:function(t){return 1===arguments.length&&(t?this._active||(this._el.classList.add("active"),this._active=!0):this._active&&(this._el.classList.remove("active"),this._active=!1)),this._active},movetoRel:function(t){const e=t/(this._rulerHeight-this._sliderHeight),n=this.offset(parseInt(e*this._screens)+this._event.initOffset);void 0!==n&&this._menu.screen(n)},movetoAbs:function(t){const e=t/this._rulerHeight,n=this.offset(parseInt(e*(this._screens+1)));void 0!==n&&this._menu.screen(n)},offset:function(t){return 0===arguments.length?this._offset:(t>this._screens?t=this._screens:t<0&&(t=0),t!==this._offset?(this._offset=t,this._slider.style.top=this._step*t+"%",t):void 0)},element:function(){return this._el},reInit:function(){const t=this,e=t._el.style;t._length<=t._limit?e.display="none":(e.display="block",t._height=t._limit/t._length*100,t._screens=t._length-t._limit,t._step=(100-t._height)/t._screens,t._slider.style.height=t._height+"%")},_init:function(t){const e=this;e._menu=t,e._offset=0,e._event={},e._active=!1;const n=e._el=document.createElement("div");return n.setAttribute("class","ruler"),e._slider=n.appendChild(document.createElement("span")),e._ruler=n.appendChild(document.createElement("div")),e._ruler.addEventListener("mousedown",(function(t){t.halt()}),!1),e._ruler.addEventListener("click",e._mouseclick.bind(e),!1),e._slider.addEventListener("mousedown",e._mousedown.bind(e),!1),e},_initClientHeight:function(){this._rulerHeight=this._el.clientHeight,this._sliderHeight=this._slider.clientHeight},_mousemove:function(t){this.movetoRel(t.clientY-this._event.init),t.halt()},_mouseup:function(t){this.active(!1),window.removeEventListener("mousemove",this._event.mov),window.removeEventListener("mouseup",this._event.up),this._menu.focus()},_mousedown:function(t){const e=this._event;e.init=t.clientY,e.initOffset=this._offset,e.mov=this._mousemove.bind(this),e.up=this._mouseup.bind(this),this._initClientHeight(),this.active(!0),window.addEventListener("mousemove",e.mov),window.addEventListener("mouseup",e.up),t.halt()},_mouseclick:function(t){this._initClientHeight(),this.movetoAbs(t.clientY-this._ruler.getClientRects()[0].top),t.halt()}}),n("menu",["menu/item","menu/prefix","menu/lengthField","menu/slider","util"],(function(t,e,n,i){return{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(r,o){void 0===o&&(o={});const s=this;s._notItemElements=3,s._itemClass=o.itemClass||t,void 0!==o.prefixClass?s._prefix=o.prefixClass.create():s._prefix=e.create(),s._prefix._menu=s,void 0!==o.lengthFieldClass?s._lengthField=o.lengthFieldClass.create():s._lengthField=n.create(),s._lengthField._menu=s,s._slider=i.create(s);var a=document.createElement("ul");return a.style.outline=0,a.setAttribute("tabindex",0),a.classList.add("menu","roll"),a.appendChild(s._prefix.element()),a.appendChild(s._lengthField.element()),a.appendChild(s._slider.element()),a.menu=s,a.addEventListener("keydown",s._keydown.bind(s),!1),a.addEventListener("keypress",s._keypress.bind(s),!1),a.addEventListener("wheel",s._mousewheel.bind(s),!1),["touchstart","touchend","touchmove"].forEach(t=>a.addEventListener(t,s._touch.bind(s),!1)),s._el=a,s._limit=8,s._items=new Array,s.readItems(r),s.dontHide=!1,s},readItems:function(t){const e=this;e._list=void 0;for(let t=0;t<e._items.length;t++)delete e._items[t]._menu,delete e._items[t];e._items=new Array,e.removeItems(),e._lengthField.reset(),t.forEach((function(t){const e=this._itemClass.create(t);e._menu=this,this._lengthField.add(t),this._items.push(e)}),e),e._slider.length(e.liveLength()).limit(e._limit).reInit(),e._firstActive=!1,e.offset=0,e.position=0},append:function(t){const e=this;t._menu=e,e._list=void 0,e.removeItems(),e._items.push(t),e._lengthField.add([t.content().data]),e._slider.length(e.liveLength()).reInit(),e._firstActive=!1,e.offset=0,e.position=0},_initList:function(){const t=this;if(void 0===t._list?t._list=[]:0!==t._list.length&&(t._boundary(!1),t._list.length=0),t.offset=0,t.prefix().length<=0){let e=0;for(;e<t._items.length;e++)t._list.push(e),t._items[e].lowlight();return t._slider.length(e).reInit(),!0}const e=t.prefix().toLowerCase().split(" ");let n=1;return t._items.forEach((function(t,i){let r=0;e.forEach((function(e){t.lcField().includes(" "+e)?r+=5:t.lcField().includes(e)&&(r+=1)})),r>n?(this._list=[i],n=r):r==n&&this._list.push(i)}),t),t._slider.length(t._list.length).reInit(),t._list.length>0},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu},focus:function(){this._el.focus()},_mousewheel:function(t){const e=t.deltaY/120;e>0?this.next():e<0&&this.prev(),t.halt()},_touch:function(t){this.slider();if("touchstart"===t.type)this._lastTouch=t.touches[0].clientY;else if("touchend"===t.type)this._lastTouch=void 0;else if("touchmove"===t.type){const e=t.touches[0];this._lastTouch+26<e.clientY?(this.viewDown(),this._lastTouch=e.clientY):this._lastTouch-26>e.clientY&&(this.viewUp(),this._lastTouch=e.clientY),t.halt()}},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e._prefix.active())break;const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e._prefix.active()?e._prefix.onclick(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e._prefix.chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this._prefix.add(String.fromCharCode(h(t))),this.show())},screen:function(t){const e=this;if(t<0)t=0;else{if(e.liveLength()<e.limit())return!1;t>e.liveLength()-e.limit()&&(t=e.liveLength()-e.limit())}return e.offset!==t&&(e._showItems(t),!0)},element:function(){return this._el},itemClass:function(){return this._itemClass},limit:function(t){return 1===arguments.length?(this._limit!==t&&(this._limit=t,this._slider.limit(t).reInit()),this):this._limit},show:function(t){const e=this;if(e._unmark(),e.removeItems(),!e._initList())return e._prefix.active(!0),e._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"))},onHide:function(){},prefix:function(t){return 1===arguments.length?(this._prefix.value(t),this):this._prefix.value()},lengthField:function(){return this._lengthField},slider:function(){return this._slider},removeItems:function(){const t=this._el.getElementsByTagName("LI");for(var e=0;t.length>e;)t[e].parentNode===this._el?this._el.removeChild(t[e]):e++},item:function(t){return this._items[t]},liveItem:function(t){if(void 0!==this._list||this._initList())return this._items[this._list[t]]},shownItem:function(t){if(!(t>=this.limit()))return this.liveItem(this.offset+t)},length:function(){return this._items.length},liveLength:function(){return void 0===this._list&&this._initList(),this._list.length},next:function(){const t=this;if(0===t.liveLength())return;-1===t.position||t._prefix.active()||t.liveItem(t.position).active(!1),t.position++;let e=t.liveItem(t.position);if(void 0===e){const n=this._prefix;if(n.isSet()&&!n.active())return t.position--,void n.active(!0);e=t.liveItem(0),t.position=0,t._showItems(0)}else t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position);t._prefix.active(!1),e.active(!0)},prev:function(){const t=this;if(0===t.liveLength())return;t._prefix.active()||(-1===t.position?t.position=t.liveLength():t.liveItem(t.position--).active(!1));let e=t.liveItem(t.position);if(void 0===e){const n=t._prefix;let i=t.liveLength()-t.limit();if(i=i<0?0:i,t.position=t.liveLength()-1,n.isSet()&&!n.active())return t.position++,n.active(!0),void(t.offset=i);e=t.liveItem(t.position),t._showItems(i)}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);t._prefix.active(!1),e.active(!0)},pageUp:function(){this.screen(this.offset-this.limit())},pageDown:function(){this.screen(this.offset+this.limit())},viewUp:function(){this.screen(this.offset-1)},viewDown:function(){this.screen(this.offset+1)},_unmark:function(){this._list.forEach((function(t){const e=this._items[t];e.lowlight(),e.active(!1)}),this)},_boundary:function(t){0!==this._list.length&&(this.item(this._list[0]).noMore(t),this.item(this._list[this._list.length-1]).noMore(t))},_showItems:function(t){const e=this;if(e.offset===t-1)e.offset=t,e._el.removeChild(e._el.children[this._notItemElements]),e._append(e._list[e.offset+e.limit()-1]);else if(e.offset===t+1)e.offset=t,e._el.removeChild(e._el.lastChild),e._prepend(e._list[e.offset]);else{e.offset=t,e.removeItems();let n=0;for(let i=0;i<e._list.length&&(n++,n<=t||(e._append(e._list[i]),!(n>=e.limit()+t)));i++);}e._slider.offset(e.offset)},_append:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase()),this.element().appendChild(e.element())},_prepend:function(t){const e=this.item(t);this.prefix().length>0&&e.highlight(this.prefix().toLowerCase());const n=this.element();n.insertBefore(e.element(),n.children[this._notItemElements])}}})),n("buttongroup/menu",["menu"],(function(t){return{create:function(e,n){const i=Object.create(t).upgradeTo(this)._init(e,{itemClass:n});i.limit(6);const r=i.element();return r.addEventListener("blur",(function(t){this.menu.hide()})),r.classList.add("button-group-list"),document.getElementsByTagName("body")[0].appendChild(r),this._left=!1,this._below=!1,this._outside=!1,i},openAt:function(t,e,n){this._left=!!t,this._below=!!e,this._outside=!!n},panel:function(t){return void 0!==t&&(this._panel=t),this._panel},button:function(t){this._button=t,this._repos(this._button),this.slider().reInit(),void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this._onscroll=function(){this._repos(this._button)}.bind(this),window.addEventListener("scroll",this._onscroll)},add:function(t,e,n){let i=this;const r=this.itemClass().create([t,t,function(t){let e=i._bind||this;e.button=r,n.apply(e)}]);return this.append(r),r},onHide:function(){void 0!==this._onscroll&&window.removeEventListener("scroll",this._onscroll),this.element().blur()},_repos:function(t){const e=t.getBoundingClientRect(),n=this._el.style;let i=window.pageXOffset,r=0;n.right="auto",n.bottom="auto",i+=e.left,this._left&&(i+=e.width-this._el.clientWidth),this._below?(r+=e.bottom,this._outside||(r-=e.height)):(r-=this._el.clientHeight,this._outside?r+=e.top:r+=e.bottom),n.left=i+"px",n.top=r+"px"}}})),n("buttongroup",["buttongroup/menu","menu/item","util"],(function(t,e){return{create:function(t){return Object.create(this)._init(t)},adopt:function(t){const e=Object.create(this);return e._el=t,e},_init:function(t){const e=document.createElement("div"),n=e.classList;return t&&(n.add.apply(n,t),t.forEach(t=>{switch(t){case"open-menu-below":this._omBelow=!0;break;case"open-menu-outside":this._omOutside=!0;break;case"open-menu-left":this._omLeft=!0}})),n.add("button-group"),this._el=e,this},element:function(){return this._el},anchor:function(t){return null!==t&&t.parentNode==this._el&&(this._anchor=t,!0)},_insert:function(t="span"){const e=document.createElement(t);return this._anchor?(this._el.insertBefore(e,this._anchor),e):this._el.appendChild(e)},add:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),void 0!==e&&(void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls),void 0!==e.icon&&i.setAttribute("data-icon",e.icon),void 0!==e.state&&(i.state=e.state)),i.addE("span").addT(t);let r=this;return i.addEventListener("click",(function(t){t.halt();let e=r._bind||this;e.button=i,n.apply(e,t)})),i},addList:function(n,i,r=e){const o=t.create([],r);o.openAt(!!this._omLeft,!!this._omBelow,!!this._omOutside);let s=this.add(n,i,(function(t){o.show(),o.button(this.button),o.focus()}));return s.list=o,s},addToggle:function(t,e,n){const i=this._insert("span");i.setAttribute("title",t),null!=e&&void 0!==e.cls&&i.classList.add.apply(i.classList,e.cls);const r=i.addE("span");r.classList.add("check","button-icon"),r.addE("span"),r.setState=function(t){t?this.classList.add("checked"):this.classList.remove("checked")},n.associate(r),i.addE("span").addT(t);return i.addEventListener("click",(function(t){t.halt(),n.roll()})),i},bind:function(t){return void 0!==t?(this._bind=t,this):this._bind||this},clear:function(){return u(this._el),this}}})),n("vc/operators",["buttongroup"],(function(t){const e=KorAP.Locale;function n(t){return null!=t&&!1!==t}function i(t,e){const n=t.parent();if("docGroup"===t.ldType()){if(t.operation()===e)return;return null!==n.ldType()?n.newAfter(t):t.wrapOnRoot()}if("doc"===t.ldType()||"docGroupRef"===t.ldType())return null===n.ldType()?t.wrapOnRoot(e):n.operation()===e?n.newAfter(t):t.wrap(e)}return e.DEL=e.DEL||"×",KorAP._and=function(){return i(this,"and")},KorAP._or=function(){return i(this,"or")},KorAP._delete=function(){if(null!==this.parent().ldType())return this.parent().delOperand(this).update();this.parent().clean()},{create:function(e,n,i){var r=Object(t).create(["operators"]).upgradeTo(this);return r.and(e),r.or(n),r.del(i),r.update(),r},update:function(){const t=this;return t.clear(),!0===t._and&&t.add(e.AND,{cls:["and"]},KorAP._and),!0===t._or&&t.add(e.OR,{cls:["or"]},KorAP._or),!0===t._del&&t.add(e.DEL,{cls:["delete"]},KorAP._delete),t.element()},parent:function(t){return 1===arguments.length&&(this._parent=t,this.bind(t)),this._parent},and:function(t){return 1===arguments.length&&(this._and=n(t)),this._and},or:function(t){return 1===arguments.length&&(this._or=n(t)),this._or},del:function(t){return 1===arguments.length&&(this._del=n(t)),this._del}}})),n("vc/jsonld",["vc/operators"],(function(t){return{__changed:!1,create:function(){return Object.create(this)},ldType:function(t){return 1===arguments.length&&(this._ldType=t),this._ldType},parent:function(t){return 1===arguments.length&&(this._parent=t,this.__changed=!0),this._parent},destroy:function(){const t=this;null!=t._ops&&(t._ops._parent=void 0,void 0!==t._ops._el&&(t._ops._el.refTo=void 0),t._ops=void 0),void 0!==t._el&&(t._el=void 0),void 0!==t._operands&&(t._operands.forEach(t=>t.destroy()),t._operands=[])},wrapOnRoot:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return 1===arguments.length?i.operation(t):i.operation("and"===this.operation()?"or":"and"),i.append(this),this.parent(i),i.append(),i.element(),n.root(i),this.parent()},operators:function(e,n,i){return 0===arguments||(this._ops=t.create(e,n,i),this._ops.parent(this)),this._ops},toJson:function(){return{"@type":"koral:"+this.ldType()}},rewrites:function(){return null},incomplete:function(){return!1},toQuery:function(){return""}}})),n("vc/rewrite",["vc/jsonld","util"],(function(t){const e=new RegExp("^(operation:)?(?:injec|inser|modifica|dele)tion|override$");return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},src:function(t){return 1===arguments.length&&(this._src=t),this._src},operation:function(t){if(1===arguments.length){if(!e.test(t))return void KorAP.log(814,"Unknown rewrite operation");this._op=t}return this._op||"injection"},scope:function(t){return 1===arguments.length&&(this._scope=t),this._scope},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.src&&"string"==typeof t.src)return this.src(t.src),void 0!==t.operation&&this.operation(t.operation.replace(/^operation:/,"")),void 0!==t.scope&&"string"==typeof t.scope&&this.scope(t.scope),this;KorAP.log(815,"Rewrite expects source")}else KorAP.log(701,"JSON-LD group has no @type attribute")},toString:function(){let t="";const e=this.operation();return t+=e.charAt(0).toUpperCase()+e.slice(1),t+=" of "+(null===this._scope?"object":this.scope().quote()),t+=" by "+this.src().quote(),t}}})),n("vc/rewritelist",["vc/jsonld","vc/rewrite","util"],(function(t,e){return{create:function(e){return Object(t).create().upgradeTo(this).fromJson(e)},fromJson:function(t){return this._list=new Array,t.forEach(t=>this._list.push(e.create(t))),this},length:function(){return this._list.length},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("class","rewrite");const e=[];let n,i;return this._list.forEach((function(t){n=document.createElement("span"),n.setAttribute("class",t.operation()),i=t.src(),void 0!==t.scope()&&(i+=": "+t.scope()),n.addT(i),e.push(i+" ("+t.operation()+")"),this._el.appendChild(n)}),this),t.setAttribute("title",e.join("\n")),t}}})),n("vc/stringval",["util"],(function(){const t=KorAP.Locale;return t.REGEX=t.REGEX||"RegEx",t.REGEX_DESC=t.REGEX_DESC||"Use a regular expression",{create:function(){const t=arguments;let e=!0,n=!1,i="";return t.length>=1&&void 0!==t[0]&&(i=t[0]),t.length>=2&&void 0!==t[1]&&(n=t[1]),t.length>=3&&(e=t[2],!1===e&&(n=!1)),Object.create(this)._init(i,n,e)},_init:function(t,e,n){return this.value(t),this.regex(e),this._regexOp(n),this},regex:function(t){return 1===arguments.length&&(this._regex=!!t,this._update()),this._regex},_regexOp:function(t){return 1===arguments.length&&(this.__regexOp=!!t,this._update()),this.__regexOp},toggleRegex:function(){this.regex(!1===this._regex)},value:function(t){return 1===arguments.length&&(this._value=t,this._update()),this._value},_update:function(){if(void 0===this._el)return;this._value=this._input.value;const t=this._el.classList;this._regexOp()&&this._regex?t.add("regex"):t.remove("regex")},store:function(t,e){},focus:function(){this._el.children[0].focus()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");t.setAttribute("tabindex",0),t.style.outline=0;const e=t.classList;if(e.add("value"),!0===this.regex()&&e.add("regex"),this._input=t.addE("input"),void 0!==this.value()&&(this._input.value=this.value()),this._regexOp()){const e=t.addE("div");e.addEventListener("click",function(){this.toggleRegex()}.bind(this),!0),e.setAttribute("title","Use as regular expression"),e.addT("RegEx")}return this._input.addEventListener("blur",function(t){const e=this;e._inField||(e.value(e._input.value),e.store(e.value(),e.regex())),t.halt()}.bind(this)),t.addEventListener("mousedown",function(){this._inField=!0}.bind(this)),t.addEventListener("mouseup",function(){this._inField=!1,this._input.focus()}.bind(this)),this._input.addEventListener("keypress",function(t){const e=this;if(13==t.keyCode)return e.value(e._input.value),e.store(e.value(),e.regex()),!1}.bind(this)),t}}})),n("vc/docgroupref",["vc/jsonld","vc/rewritelist","vc/stringval","util"],(function(t,n,i){const r=KorAP.Locale;return r.EMPTY=r.EMPTY||"⋯",{_ldType:"docGroupRef",create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);return void 0===i&&console.log(n),void 0!==e&&(i._parent=e),i.__changed=!0,i},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=document.createElement("span");n.classList.add("key","fixed","ref"),n.addT("referTo");const i=t._refE=document.createElement("span");return i.setAttribute("data-type","string"),i.setAttribute("class","value"),this.ref()?i.addT(t.ref()):(i.addT(r.EMPTY),i.classList.add("unspecified")),i.addEventListener("click",t._changeRef.bind(t)),u(e),e.appendChild(n),e.appendChild(i),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),void 0!==KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t.element()},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.setAttribute("class","doc groupref"),this.update(),t},ref:function(t){return 1===arguments.length?(this._ref=t,this._changed(),this):this._ref},_changeRef:function(t){const e=this,n=i.create(this.ref(),!1,!1),r=n.element();n.store=function(t,n){e.ref(t),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._refE),n.focus()},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},fromJson:function(t){if(void 0===t)return this;if(void 0!==t["@type"]){if(void 0!==t.ref&&"string"==typeof t.ref)return this.ref(t.ref),void 0!==t.rewrites&&this.rewrite(t.rewrites),this;KorAP.log(821,"Reference is missing")}else KorAP.log(701,"JSON-LD group has no @type attribute")},onclick:function(){console.log("Do not support click on this")},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){return this.ref?{"@type":"koral:"+this.ldType(),ref:this.ref()}:{}},incomplete:function(){return!this.ref()},toQuery:function(){return this.incomplete()?"":"referTo "+this.ref().quote()}}})),n("vc/doc",["vc/jsonld","vc/rewritelist","vc/stringval","vc/docgroupref","util"],(function(t,n,i,r){const o="Match type is not supported by value type",s=KorAP.Locale;return s.EMPTY=s.EMPTY||"⋯",{_ldType:"doc",_obj:function(){return"???"},create:function(e,n){const i=Object(t).create().upgradeTo(this).fromJson(n);if(void 0!==i)return void 0!==e&&(i._parent=e),i.__changed=!0,i;console.log(n)},update:function(){const t=this;if(void 0===t._el)return t.element();const e=t._el;if(!t.__changed)return e;e.refTo=t,void 0!==t.rewrites()&&e.classList.add("rewritten");const n=t._keyE=document.createElement("span");if(n.setAttribute("class","key"),n.addEventListener("click",t._changeKey.bind(t)),t.key()){const e=t.key();void 0!==s["VC_"+e]&&(e=s["VC_"+e]),n.addT(e)}const i=t._matchopE=document.createElement("span");i.setAttribute("data-type",t.type()),i.setAttribute("class","match"),i.addT(t.matchop()),t._matchopE.addEventListener("click",t._changeMatchop.bind(t));const r=t._valueE=document.createElement("span");return r.setAttribute("data-type",t.type()),r.setAttribute("class","value"),t.value()?r.addT(t.value()):(r.addT(s.EMPTY),r.classList.add("unspecified")),r.addEventListener("click",t._changeValue.bind(t)),u(e),e.appendChild(n),e.appendChild(i),e.appendChild(r),t.__changed=!1,void 0!==t._rewrites&&e.appendChild(t._rewrites.element()),void 0!==t._parent&&e.appendChild(t.operators(!0,!0,!0).element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),e},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc"),t.update()),t._el},wrap:function(t){const n=this.parent(),i=e("vc/docgroup").create(n);return i.operation(t),i.append(this),i.append(),n.replaceOperand(this,i).update()},replaceWith:function(t){const e=this.parent();"docGroup"===e.ldType()?e.replaceOperand(this,t):null==e.ldType()&&e.root(t),e.update(),this.destroy()},fromJson:function(t){const e=this;if(void 0===t)return e;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.value||"string"!=typeof t.value)return void KorAP.log(805,"Value is invalid");let n;if(void 0!==t.key&&"string"==typeof t.key){if(e.key(t.key),void 0!==t.match){if("string"!=typeof t.match)return void KorAP.log(802,o);e.matchop(t.match)}if(void 0===t.type&&KorAP._vcKeyMenu){const n=KorAP._vcKeyMenu.typeOf(e.key());null!=n&&(t.type="type:"+n)}if(void 0===t.type)KorAP._validUnspecMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:string"==t.type)e.type("string"),KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:text"==t.type)e.type("text"),KorAP._validTextMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value);else if("type:date"===t.type){if(e.type("date"),void 0===t.value||!KorAP._validDateRE.test(t.value))return void KorAP.log(806,"Value is not a valid date string");KorAP._validDateMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}else{if("type:regex"!==t.type)throw KorAP.log(804,"Unknown value type: "+e.type()),new Error("Unknown value type: "+e.type());e.type("regex");try{new RegExp(t.value);KorAP._validStringMatchRE.test(e.matchop())||(KorAP.log(802,o),e.matchop("eq"),n="modification"),e.value(t.value)}catch(t){return void KorAP.log(807,"Value is not a valid regular expression")}e.type("regex")}}return void 0!==t.rewrites?e.rewrite(t.rewrites):void 0!==n&&e.rewrite(n),e},key:function(t){return 1===arguments.length?(this._key=t,this._changed(),this):this._key},_changeKey:function(t){const e=KorAP._vcKeyMenu;this._el.insertBefore(e.element(),this._keyE);const n=this;e.released((function(t,e){if("ref"===e)n.replaceWith(r.create(n.parent()));else{const i=n.key(t).type(e);i.matchop(i.matchop()),i.value(i.value()),i.update()}this.hide()})),e.show(),e.focus()},matchop:function(t){const e=this;if(1===arguments.length){const n=t.replace(/^match:/,"");return null==e._type||("string"===e._type||"regex"===e._type)&&KorAP._validStringMatchRE.test(n)||"text"===e._type&&KorAP._validTextMatchRE.test(n)||"date"===e._type&&KorAP._validDateMatchRE.test(n)?e._matchop=n:e._matchop="eq",e._changed(),e}return e._matchop||"eq"},_changeMatchop:function(t){const e=KorAP._vcMatchopMenu[this.type()];if(void 0===e)return void KorAP.log(0,"Unable to init menu for "+this.type());this._el.insertBefore(e.element(),this._matchopE);const n=this;e.released((function(t){n.matchop(t).update(),this.hide()})),e.show(),e.focus()},type:function(t){return 1===arguments.length?(this._type=t,this._changed(),this):this._type||"string"},value:function(t){const e=this;return 1===arguments.length?("date"!==e._type||KorAP._validDateRE.test(t)?e._value=t:delete e._value,e._changed(),e):e._value},_changeValue:function(t){const e=this;if("date"===this.type()){const t=KorAP._vcDatePicker;t.fromString(this.value()),t.onclick((function(n){if(n.year)return e.value(this.toString()),void e.update();e._el.removeChild(t.element())})),this._el.insertBefore(t.show(),this._valueE),t.input().focus()}else{const t="regex"===this.type(),n=i.create(this.value(),t),r=n.element();n.store=function(t,n){e.value(t),!0===n?e.type("regex"):e.type("string"),e._el.removeChild(this._el),e.update()},this._el.insertBefore(r,this._valueE),n.focus()}},rewrites:function(){return this._rewrites},rewrite:function(t){"string"==typeof t&&(t=[{"@type":"koral:rewrite",operation:"operation:"+t,src:"Kalamar"}]),this._rewrites=n.create(t)},_changed:function(){this.__changed=!0,void 0!==this._rewrites&&(delete this._rewrites,void 0!==this._el&&this._el.classList.remove("rewritten"))},toJson:function(){const t=this;return t.matchop()&&t.key()?{"@type":"koral:"+t.ldType(),key:t.key(),match:"match:"+t.matchop(),value:t.value()||"",type:"type:"+t.type()}:{}},incomplete:function(){return!(this.matchop()&&this.key()&&this.value())},toQuery:function(){if(this.incomplete())return"";let t=this.key()+" ";switch(this.matchop()){case"ne":t+="!=";break;case"contains":t+="~";break;case"excludes":case"containsnot":t+="!~";break;case"geq":t+="since";break;case"leq":t+="until";break;default:t+="date"==this.type()?"in":"="}switch(t+=" ",this.type()){case"date":return t+this.value();case"regex":return t+"/"+this.value().escapeRegex()+"/";case"string":case"text":return t+this.value().quote()}return""}}})),n("vc/unspecified",["vc/jsonld","vc/doc","vc/docgroupref","util"],(function(t,e,n){const i=KorAP.Locale;return i.EMPTY=i.EMPTY||"⋯",{_ldType:"non",create:function(e){const n=Object.create(t).upgradeTo(this);return void 0!==e&&(n._parent=e),n},key:function(t){if(void 0===this._parent)return null;let i;const r=KorAP._vcKeyMenu.typeOf(t);return r&&"ref"===r?i=n.create(this._parent):(i=e.create(this._parent),i.key(t),i.type(r)),null===this._parent.ldType()?(this._parent.root(i),this.destroy()):this._parent.replaceOperand(this,i),this._parent.update(),i},update:function(){const t=this;if(void 0===t._el)return t.element();u(t._el);const e=document.createElement("span");return e.addT(i.EMPTY),e.addEventListener("click",t.onclick.bind(t)),t._el.appendChild(e),t._el.refTo=t,void 0!==t._parent&&null!==t.parent().ldType()&&t._el.appendChild(t.operators(!1,!1,!0).element()),t.element()},element:function(){const t=this;return void 0!==t._el||(t._el=document.createElement("div"),t._el.setAttribute("class","doc unspecified"),t.update()),t._el},incomplete:function(){return!0},onclick:function(){const t=KorAP._vcKeyMenu;this._el.insertBefore(t.element(),this._el.firstChild);const e=this;t.released((function(t){e.key(t).update(),this.hide()})),t.show(),t.focus()}}})),n("vc/docgroup",["vc/jsonld","vc/unspecified","vc/doc","vc/docgroupref","util"],(function(t,e,n,i){const r=new RegExp("^(?:and|or)$"),o={_ldType:"docGroup",create:function(e,n){const i=Object.create(t).upgradeTo(this);return i._operands=[],i.fromJson(n),void 0!==e&&(i._parent=e),i},newAfter:function(t){this._operands.forEach((function(n,i){if(n===t){const t=e.create(this);return this._operands.splice(i+1,0,t),this.update()}}),this)},_duplicate:function(t){if("doc"!==t.ldType())return null;const e=this._operands.find(e=>"doc"===e.ldType()&&t.key()===e.key()&&t.matchop()===e.matchop()&&t.value()===e.value());return e||null},append:function(t){if(void 0===t)return t=e.create(this),this._operands.push(t),t;switch(t["@type"]){case void 0:if(void 0!==t.ldType){if("doc"!==t.ldType()&&"docGroup"!==t.ldType()&&"docGroupRef"!==t.ldType())return void KorAP.log(812,"Operand not supported in document group");t.parent(this);const e=this._duplicate(t);return null===e?(this._operands.push(t),t):e}return void KorAP.log(701,"JSON-LD group has no @type attribute");case"koral:doc":const e=n.create(this,t);if(void 0===e)return;const r=this._duplicate(e);return null===r?(this._operands.push(e),e):r;case"koral:docGroup":const s=o.create(this,t);if(void 0===s)return;return s.operation()===this.operation()?(s.operands().forEach((function(t){null===this._duplicate(t)&&(this._operands.push(t),t.parent(this))}),this),s._operands=[],s.destroy(),this):(this._operands.push(s),s);case"koral:docGroupRef":const a=i.create(this,t);if(void 0===a)return;return this._operands.push(a),a;default:return void KorAP.log(812,"Operand not supported in document group")}},update:function(){const t=this;if(1===t._operands.length){const e=t.parent(),n=t.getOperand(0);return t._operands=[],null!==e.ldType()?e.replaceOperand(t,n).update():(t.destroy(),e.root(n),n.parent(e),e.root())}if(void 0===t._el)return t;const e=t._el;e.setAttribute("data-operation",t.operation()),u(e),t._operands.forEach(t=>e.appendChild(t.element()));var n=t.operators("and"!=t.operation(),"or"!=t.operation(),!0);return e.appendChild(n.element()),KorAP.vc&&KorAP.vc.element().dispatchEvent(new CustomEvent("vcChange",{detail:t})),t},element:function(){const t=this;if(void 0!==t._el)return t._el;const e=t._el=document.createElement("div");return e.setAttribute("class","docGroup"),t.update(),e},operation:function(t){if(1===arguments.length){if(!r.test(t))return void KorAP.log(810,"Unknown operation type");this._op=t}return this._op||"and"},operands:function(){return this._operands},getOperand:function(t){return this._operands[t]},replaceOperand:function(t,e){for(let n=0;n<this._operands.length;n++)if(this._operands[n]===t)return"doc"===e.ldType()||"non"===e.ldType()||"docGroupRef"===e.ldType()||e.operation()!=this.operation()?(this._operands[n]=e,e.parent(this)):(this._operands.splice(n,1),e.operands().reverse().forEach((function(t){this._operands.splice(n,0,t),t.parent(this)}),this),e._operands=[],e.destroy()),t.destroy(),this;return!1},delOperand:function(t){for(let e=0;e<this._operands.length;e++)if(this._operands[e]===t)return this._operands.splice(e,1),t.destroy(),this},fromJson:function(t){if(void 0===t)return this;if(void 0===t["@type"])return void KorAP.log(701,"JSON-LD group has no @type attribute");if(void 0===t.operation||"string"!=typeof t.operation)return void KorAP.log(811,"Document group expects operation");const e=t.operation;if(this.operation(e.replace(/^operation:/,"")),void 0!==t.operands&&t.operands instanceof Array)return t.operands.forEach(t=>this.append(t)),this;KorAP.log(704,"Operation needs operand list")},toJson:function(){const t=new Array;return this._operands.forEach((function(e){"non"!==e.ldType()&&t.push(e.toJson())})),{"@type":"koral:"+this.ldType(),operation:"operation:"+this.operation(),operands:t}},toQuery:function(t){var e=this._operands.filter((function(t){return!t.incomplete()})).map((function(t){return"docGroup"===t.ldType()?t.toQuery(!0):t.toQuery()}));if(1===e.length)return e.join("");{const n=e.join("or"===this.operation()?" | ":" & ");return t?"("+n+")":n}}};return o})),n("vc/item",["menu/item","util"],(function(t){const e=KorAP.Locale;return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){const n=this;if(void 0===t[0])throw new Error("Missing parameters");n._key=t[0],n._type=t[1];const i=n._key;return n._name=e["VC_"+i]?e["VC_"+i]:i,n._lcField=" "+n._name.toLowerCase(),n},onclick:function(t){this.menu().release(this._key,this._type),t.halt()},name:function(){return this._name},type:function(){return this._type},key:function(){return this._key},element:function(){const t=this;if(void 0!==t._el)return t._el;var e=document.createElement("li");return t._type&&e.setAttribute("data-type",t._type),e.setAttribute("data-key",t._key),e.onclick=t.onclick.bind(t),e.addT(t._name),t._el=e}}})),n("vc/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu(),n=this.value();e.release(n,"string")}}})),n("vc/menu",["menu","vc/item","vc/prefix"],(function(t,e,n){return{create:function(i){const r=Object.create(t).upgradeTo(this)._init(i,{itemClass:e,prefixClass:n});return r.limit(6),r.element().addEventListener("blur",(function(t){this.menu.hide()})),r},released:function(t){this._cb=t},release:function(t,e){void 0!==this._cb&&this._cb(t,e)},typeOf:function(t){const e=this._items.find(e=>e.key()===t);if(e)return e.type()}}})),n("vc/statistic",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){if(void 0===t)throw new Error("Missing parameter");return this._statistic=t,this},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("dl");t.classList.add("flex");const e=this._statistic;let n,i,r;return Object.keys(e).forEach((function(o){n=t.addE("div"),i=n.addE("dt"),i.addT(o),i.setAttribute("title",o),r=n.addE("dd"),r.addT(new Number(e[o]).toLocaleString())})),this._el=t,this._el}}})),n("datepicker",["util"],(function(){KorAP._validDateMatchRE=new RegExp("^(?:[lg]?eq|ne)$"),KorAP._validDateRE=new RegExp("^(?:\\d{4})(?:-\\d\\d(?:-\\d\\d)?)?$");const t=KorAP.Locale;t.WDAY=t.WDAY||["Mo","Tu","We","Th","Fr","Sa","Su"],t.MONTH=t.MONTH||["January","February","March","April","May","June","July","August","September","October","November","December"];const e=document;return{create:function(){return Object.create(this)._init()},_init:function(){return this._selected=[],this},select:function(t,e,n){const i=this;return arguments.length>=1?(i._selected={year:t},i._showYear=t,arguments.length>=2&&(i._selected.month=e,i._showMonth=e,arguments.length>=3&&(i._selected.day=n,i._showDay=n)),i):i._selected},set:function(t,e,n){this.select(t,e,n),this._store()},_store:function(){void 0!==this._click?this._click(this._selected):console.dir(this._selected)},onclick:function(t){this._click=t},input:function(){return this._input},show:function(t,n){const i=this._el=e.createElement("div");i.setAttribute("tabindex",0),i.style.outline=0,i.classList.add("datepicker");const r=new Date,o=this;return o._showYear=void 0!==t?t:o._selected.year?this._selected.year:r.getYear()+1900,o._showMonth=n||(o._selected.month?o._selected.month:r.getMonth()+1),i.appendChild(o._monthHelper()),i.appendChild(o._yearHelper()),i.appendChild(o._dayHelper()),o._input=i.appendChild(o._stringHelper()),i.addEventListener("mousedown",function(t){this._inField=!0}.bind(o)),i.addEventListener("mouseup",function(t){this._inField=!1,this._input.focus()}.bind(o)),o._input.addEventListener("blur",function(t){this._inField||this.fromString(this._input.value)&&this._store(),t.halt()}.bind(o)),o._input.focus(),o._el},_stringHelper:function(){const t=e.createElement("input");return t.value=this.toString(),t.setAttribute("tabindex",0),t.addEventListener("keyup",function(e){this.fromString(t.value)&&(this._updateYear(),this._updateMonth(),this._updateDay())}.bind(this)),t.addEventListener("keypress",function(e){if(13==e.keyCode)return this.fromString(t.value)&&this._store(),e.halt(),!1}.bind(this)),t},element:function(){return this._el},today:function(){const t=new Date;let e=t.getYear()+1900;const n=t.getMonth()+1,i=t.getDate();return e+="-"+(n<10?"0"+n:n),e+="-"+(i<10?"0"+i:i),e},toString:function(){let t="";const e=this._selected;return e.year&&(t+=e.year,e.month&&(t+="-",t+=e.month<10?"0"+e.month:e.month,e.day&&(t+="-",t+=e.day<10?"0"+e.day:e.day))),t},incrYear:function(){const t=this;if(t._showYear<9999)return t._showYear++,t._updateYear(),t._updateMonth(),t._updateDay(),t},decrYear:function(){const t=this;if(t._showYear>0)return t._showYear--,t._updateYear(),t._updateMonth(),t._updateDay(),t},incrMonth:function(){const t=this;return t._showMonth++,t._showMonth>12?(t._showMonth=1,t.incrYear()):(t._updateMonth(),t._updateDay()),t},decrMonth:function(){const t=this;return t._showMonth--,t._showMonth<1?(t._showMonth=12,t.decrYear()):(t._updateMonth(),t._updateDay()),t},_yearHelper:function(){const t=this,n=e.createElement("div");return n.classList.add("year"),n.addE("span").onclick=t.decrYear.bind(t),t._yElement=n.addE("span"),t._yElement.addT(t._showYear),t._yElement.onclick=function(){t.set(t._showYear)}.bind(t),t._selectYear(),n.addE("span").onclick=t.incrYear.bind(t),n},_updateYear:function(){this._yElement.firstChild.data=this._showYear,this._selectYear()},_selectYear:function(){this._showYear===this.select().year?this._yElement.classList.add("selected"):this._yElement.classList.remove("selected")},_monthHelper:function(){const n=this,i=e.createElement("div");return i.classList.add("month"),i.addE("span").onclick=n.decrMonth.bind(n),n._mElement=i.addE("span"),n._mElement.addT(t.MONTH[n._showMonth-1]),n._mElement.onclick=function(){this.set(this._showYear,this._showMonth)}.bind(n),n._selectMonth(),i.addE("span").onclick=n.incrMonth.bind(n),i},_updateMonth:function(){(void 0===this._showMonth||this._showMonth>12)&&(this._showMonth=1),this._mElement.firstChild.data=t.MONTH[this._showMonth-1],this._selectMonth()},_selectMonth:function(){const t=this;t._showYear===t.select().year&&t._showMonth===t.select().month?t._mElement.classList.add("selected"):t._mElement.classList.remove("selected")},_dayHelper:function(){const n=e.createElement("table"),i=n.addE("thead").addE("tr");for(let e=0;e<7;e++)i.addE("th").addT(t.WDAY[e]);return this._dBElement=this._dayBody(),n.appendChild(this._dBElement),n},_dayBody:function(){const t=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),n=new Date(this._showYear,this._showMonth-1,1,0,0,0,0),i=new Date,r=this,o=function(){r.set(r._showYear,r._showMonth,parseInt(this.firstChild.data))};n.setDate(n.getDate()-(n.getDay()+6)%7);const s=e.createElement("tbody"),a=this.select();let c,l,u;for(;;){for(c=s.addE("tr"),l=0;l<7;l++)u=c.addE("td"),n.getMonth()!==t.getMonth()?u.classList.add("out"):u.onclick=o,n.getDate()===i.getDate()&&n.getMonth()===i.getMonth()&&n.getFullYear()===i.getFullYear()&&u.classList.add("today"),a&&a.day&&n.getDate()===a.day&&n.getMonth()===a.month-1&&n.getFullYear()===a.year&&u.classList.add("selected"),u.addT(n.getDate()),n.setDate(n.getDate()+1);if(n.getMonth()!==t.getMonth())break}return s},_updateDay:function(){const t=this._dayBody();this._dBElement.parentNode.replaceChild(t,this._dBElement),this._dBElement=t},fromString:function(t){if(void 0===t)return!1;if(!KorAP._validDateRE.test(t))return!1;const e=t.split("-",3);return e[0]=parseInt(e[0]),e[1]&&(e[1]=parseInt(e[1])),e[2]&&(e[2]=parseInt(e[2])),this.select(e[0],e[1],e[2]),!0}}})),n("panel",["buttongroup","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;n.views=[],n._classes=e;const i=["action","button-panel"];return e&&i.push.apply(i,e),n._actions=t.create(i).bind(this),n.prepend=!1,n._actions.panel=n,n},actions:function(){return this._actions},element:function(){if(this._el)return this._el;const t=document.createElement("div"),e=t.classList;e.add("panel"),this._classes&&e.add.apply(e,this._classes),this._viewE=t.addE("div");const n=this.actions().element();return n.parentNode||t.appendChild(n),this._el=t},_viewElement:function(){return this.element(),this._viewE},add:function(t){this.views.push(t),this.prepend?this._viewElement().prepend(t.element()):this._viewElement().appendChild(t.element()),t.afterEmbed&&t.afterEmbed(),t.panel=this},delView:function(t){this.views.forEach((function(e,n,i){e===t&&(i[n]=void 0)}))}}})),n("view",["buttongroup","util"],(function(t){const e=KorAP.Locale;return e.CLOSE=e.CLOSE||"Close",{create:function(t){return Object.create(this)._init(t)},_init:function(n){this.panel=void 0,this._classes=n,this._shown=!1;const i=["action","button-view"];return n&&i.push.apply(i,n),this._actions=t.create(i).bind(this),this._actions.add(e.CLOSE,{cls:["button-icon","close"]},(function(t){this.close()})),this._actions.view=this,this},element:function(){if(this._el)return this._el.classList.add("show"),this._el;const t=document.createElement("div"),e=t.classList;if(e.add("view","show"),this._classes&&e.add.apply(e,this._classes),void 0!==this.show){const e=this.show();if(!e)return t;t.appendChild(e)}return this._shown=!0,t.appendChild(this.actions().element()),this._el=t},actions:function(){return this._actions},shown:function(){return this._shown},minimize:function(){this._el&&this._el.classList.remove("show")},close:function(){this.onClose&&this.onClose();const t=this.element();t.parentNode&&t.parentNode.removeChild(t),this.panel.delView(this),this._shown=!1}}})),n("view/vc/corpstatv",["view","vc/statistic","buttongroup"],(function(t,e,n){const i=KorAP.Locale;return i.REFRESH=i.REFRESH||"Refresh",{create:function(e,n){return Object.create(t)._init(["vcstatistic"]).upgradeTo(this)._init(e,n)},_init:function(t,e){return this.vc=t,this.panel=e,this},getvc:function(){return this.vc},getStatistic:function(t){const e=this.vc;try{KorAP.API.getCorpStat(e.toQuery(),(function(e){if(null!==e)if(void 0!==e){if(null!==e.notifications&&void 0!==e.notifications){const n=e.notifications;return KorAP.log(0,n[0][1]),void t(null)}t(e)}else t(null);else t(null)}))}catch(e){KorAP.log(0,e),t(null)}},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("stattable","loading"),this.getStatistic((function(n){t.classList.remove("loading"),null!==n&&t.appendChild(e.create(n).element())})),this._show=t},checkStatActive:function(){let t=KorAP.vc.toQuery();const e=this.vc.oldvcQuery;(t||""===t)&&(t.startsWith("(")&&(t=t.slice(1,t.length-1)),t!=e&&this.disableStat())},disableStat:function(){const t=this._show;if(0==t.getElementsByClassName("reloadStatB").length){const e=n.create(["reloadStatB","button-panel"]);e.add(i.REFRESH,{cls:["refresh","button-icon"]},function(e){t.classList.remove("stdisabled"),this.panel.reloadCorpStat()}.bind(this)),t.appendChild(e.element()),t.classList.add("stdisabled")}},onClose:function(){this.vc=void 0}}})),n("panel/vc",["panel","view/vc/corpstatv"],(function(t,e){document;const n=KorAP.Locale;return n.SHOW_STAT=n.SHOW_STAT||"Statistics",n.VERB_SHOWSTAT=n.VERB_SHOWSTAT||"Corpus Statistics",{create:function(e){return Object.create(t)._init(["vcinfo"]).upgradeTo(this)._init(e)},_init:function(t){this.vc=t;return this.actions().add(n.SHOW_STAT,{cls:["statistic"]},function(){this.addCorpStat()}.bind(this)),this},addCorpStat:function(){const t=this;if(void 0!==t.statView&&t.statView.shown()){let e=t.statView.show();e.classList.contains("stdisabled")&&(t.reloadCorpStat(),e.classList.remove("stdisabled"))}void 0!==t.statView&&t.statView.shown()||(t.statView=e.create(t.vc,t),t.add(t.statView),t.vc.oldvcQuery=KorAP.vc.toQuery())},reloadCorpStat:function(){this.statView.close(),this.addCorpStat()}}})),n("vc",["vc/unspecified","vc/doc","vc/docgroup","vc/docgroupref","vc/menu","vc/statistic","datepicker","buttongroup","panel/vc","view/vc/corpstatv","buttongroup","util"],(function(t,n,i,r,o,s,a,c,l,u,h){KorAP._validUnspecMatchRE=new RegExp("^(?:eq|ne|contains(?:not)?|excludes)$"),KorAP._validStringMatchRE=new RegExp("^(?:eq|ne)$"),KorAP._validTextMatchRE=KorAP._validUnspecMatchRE,KorAP._validTextOnlyMatchRE=new RegExp("^(?:contains(?:not)?|excludes)$"),KorAP._overrideStyles=!1;const d=KorAP.Locale;return d.SHOW_STAT=d.SHOW_STAT||"Statistics",d.VERB_SHOWSTAT=d.VERB_SHOWSTAT||"Corpus Statistics",d.VC_allCorpora=d.VC_allCorpora||"all corpora",d.VC_oneCollection=d.VC_oneCollection||"a virtual corpus",d.MINIMIZE=d.MINIMIZE||"Minimize",KorAP._vcKeyMenu=void 0,KorAP._vcDatePicker=a.create(),KorAP._vcMatchopMenu={string:o.create([["eq",null],["ne",null]]),text:o.create([["eq",null],["ne",null],["contains",null],["containsnot",null]]),date:o.create([["eq",null],["ne",null],["geq",null],["leq",null]]),regex:o.create([["eq",null],["ne",null]])},{ldType:function(){return null},_init:function(t){if(!KorAP._overrideStyles){const t=KorAP.newStyleSheet();t.insertRule('.vc .docGroup[data-operation=or] > .doc::before,.vc .docGroup[data-operation=or] > .docGroup::before { content: "'+d.OR+'" }',0),t.insertRule('.vc .docGroup[data-operation=and] > .doc::before,.vc .docGroup[data-operation=and] > .docGroup::before { content: "'+d.AND+'" }',1),KorAP._overrideStyles=!0}let e;return t?(e=t.slice(),e.unshift(["referTo","ref"])):e=[["referTo","ref"]],KorAP._vcKeyMenu=o.create(e),KorAP._vcKeyMenu.limit(6),this},create:function(e){const n=Object.create(this)._init(e);return n._root=t.create(n),n},fromJson:function(e){let o;if(void 0!==e)if("koral:doc"==e["@type"])o=n.create(this,e);else if("koral:docGroup"==e["@type"])o=i.create(this,e);else{if("koral:docGroupRef"!=e["@type"])return void KorAP.log(813,"Collection type is not supported");o=r.create(this,e)}else o=t.create(this);return this.root(o),this},wasRewritten:function(t){return 1!==arguments.length&&(t=this._root),!!(t.rewrites()&&t.rewrites().length()>0)||"docGroup"===t.ldType()&&void 0!==t.operands().find(t=>this.wasRewritten(t))},clean:function(){const e=this;return"non"!==e._root.ldType()&&(e._root.destroy(),e.root(t.create(e))),e.update(),e},root:function(t){if(1===arguments.length){const e=this.builder();null!==e.firstChild?e.firstChild!==t.element()&&e.replaceChild(t.element(),e.firstChild):e.appendChild(t.element()),this._root=t,t.parent(this),this.update()}return this._root},builder:function(){const t=this;return void 0!==t._builder||t.element(),t._builder},element:function(){const t=this;let e=t._el;if(void 0!==e)return e;e=t._el=document.createElement("div"),e.classList.add("vc"),t._builder=e.addE("div"),t._builder.setAttribute("class","builder");const n=h.create(["action","button-view"]);return n.add(d.MINIMIZE,{cls:["button-icon","minimize"]},function(){this.minimize()}.bind(t)),e.appendChild(n.element()),t._builder.appendChild(t._root.element()),t.addVcInfPanel(),t._el.addEventListener("vcChange",function(t){this.checkStatActive(t.detail)}.bind(t),!1),e},isOpen:function(){return!!this._el&&this._el.classList.contains("active")},open:function(){this.element().classList.add("active"),this.onOpen&&this.onOpen()},minimize:function(){this.element().classList.remove("active"),this.onMinimize&&this.onMinimize()},update:function(){return this._root.update(),KorAP.vc&&this.element().dispatchEvent(new CustomEvent("vcChange",{detail:this})),this},getName:function(){return"non"===this._root.ldType()?d.VC_allCorpora:"docGroupRef"===this._root.ldType()?this._root.ref():d.VC_oneCollection},addRequired:function(t){const n=this.root(),i=n.ldType(),r=n.parent();if("non"===i)r.root(t);else if("doc"===i||"docGroupRef"===i||"docGroup"===i&&"or"===n.operation()){const i=e("vc/docgroup").create(r);i.operation("and"),i.append(n),i.append(t),i.element(),r.root(i)}else"docGroup"===i?n.append(t):console.log("Unknown root object");this.update()},toJson:function(){return this._root.toJson()},toQuery:function(){return this._root.toQuery()},addVcInfPanel:function(){this.panel=l.create(this),this._el.addE("div").appendChild(this.panel.element())},checkStatActive:function(){void 0!==this.panel&&void 0!==this.panel.statView&&this.panel.statView.checkStatActive()}}})),n("loc/dereko",["vc","vc/doc"],(function(t,e){const n=KorAP.Locale;n.TOUR_Qexample="laufen",n.TOUR_vcQuery={"@type":"koral:doc",key:"docSigle",match:"match:eq",value:"WPD17/D01"},n.TOUR_Relations="corenlp/c"})),n("match/treeitem",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},content:function(t){return 1===arguments.length&&(this._content=t),this._content},foundry:function(){return this._foundry},layer:function(){return this._layer},type:function(){return this._type},onclick:function(t){const e=this.menu();e.hide(),t.halt(),void 0!==e.panel()&&e.panel().addTree(this._foundry,this._layer,this._type)},_init:function(t){if(void 0===t[0])throw new Error("Missing parameters");const e=this;return e._name=t[0],e._foundry=t[1],e._layer=t[2],e._type=t[3],e._content=document.createTextNode(e._name),e._lcField=" "+e.content().textContent.toLowerCase(),e}}})),n("match/querycreator",["util"],(function(){const t=KorAP.Locale;t.NEW_QUERY=t.NEW_QUERY||"New Query";const e=RegExp("^(?:[^ :.'\\\\|&]+:)?[^ :.'\\\\|&]+$");function n(t){return null===t.match(e)?"'"+t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'":t}function i(t,e){if(e.childNodes.length>1){let i=[];return e.childNodes.forEach((function(e){3===e.nodeType&&i.push(t+n(e.data))})),"("+i.sort().join(" | ")+")"}return""==e.innerText?"":t+n(e.innerText)}return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");const n=this;n._query=[],n._matchTable=e,n._matchTable.addEventListener("click",n.clickOnAnno.bind(n),!1);const i=n._el=document.createElement("p");return i.classList.add("query","fragment"),i.addE("span").addT(t.NEW_QUERY+":"),n._queryFragment=i.addE("span"),i.addEventListener("click",n.toQueryBar.bind(n),1),n._ql=document.getElementById("ql-field"),n._q=document.getElementById("q-field"),n._shown=!1,n},clickOnAnno:function(t){if(t.target!==t.currentTarget){const e=t.target;let n,r,o,s,a,c;if("TD"==e.tagName){if(""==e.innerText)return;if(e.classList.contains("matchkeyvalues"))return;for(n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("SPAN"==e.tagName||"DIV"==e.tagName){if(""==e.innerText)return;"SPAN"==e.tagName&&(e=e.parentNode);const t=e.parentNode;for(n=t.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText,s=-2,a=t;null!=(a=a.previousSibling);)1===a.nodeType&&s++;c=i(r+"/"+o+"=",e),""!==c&&this.toggleInToken(e,s,c)}else if("TH"==e.tagName)if("THEAD"==e.parentNode.parentNode.tagName){if(e.classList.contains("cutted"))return;for(s=-2,a=e;null!=(a=a.previousSibling);)1===a.nodeType&&s++;s>=0&&this.toggleInToken(e,s,i("orth=",e))}else{n=e.parentNode.getElementsByTagName("th"),r=n[0].innerText,o=n[1].innerText;const t=r+"/"+o+"=";for(s=0,a=e;null!=(a=a.nextSibling);)1===a.nodeType&&"TH"!==a.tagName&&(a.classList.contains("matchkeyvalues")?Array.from(a.getElementsByTagName("div")).forEach((function(e){c=i(t,e),""!==c&&(this._addToToken(s,c),e.classList.add("chosen"))}),this):(c=i(t,a),""!==c&&(this._addToToken(s,c),a.classList.add("chosen"))),s++)}}t.stopPropagation()},_addToToken:function(t,e){let n=this._query[t];void 0===n&&(n=this._query[t]=[]),n.push(e),this._query[t]=n.filter((function(t,e,n){return n.lastIndexOf(t)===e})),this.show()},_removeFromToken:function(t,e){let n=this._query[t];void 0!==n&&(n.splice(n.indexOf(e),1),this._query[t]=n.length>0?n:void 0,this.show())},element:function(){return this._el},shown:function(){return this._shown},show:function(){const t=this,e=t.toString(),n=t._matchTable;""===e?!0===t._shown&&(n.parentNode.removeChild(t._el),t._shown=!1):(!1===t._shown&&(n.parentNode.insertBefore(t._el,n.nextSibling),t._shown=!0),t._queryFragment.innerText=e)},toggleInToken:function(t,e,n){const i=t.classList;i.contains("chosen")?(this._removeFromToken(e,n),i.remove("chosen")):(this._addToToken(e,n),i.add("chosen"))},toString:function(){let t,e="",n=0;for(let i=0;i<this._query.length;i++)t=this._query[i],void 0!==t?(n>0&&(e+="[]",n>1&&(e+="{"+n+"}"),n=0),e+="["+t.sort().join(" & ")+"]"):""!==e&&n++;return e},toQueryBar:function(t){const e=this;if(void 0===e._ql||void 0===e._q||null===e._ql)return void console.log("No query language object defined");const n=Array.from(e._ql.options).find(t=>"poliqarp"==t.value);n&&(n.selected=!0),e._q.value=e.toString(),window.scrollTo(0,0)}}})),n("match/table",["match/querycreator","util"],(function(t){const e=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),n=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=n.createElement("div"),i=this;return e.innerHTML=t,i._pos=0,i._token=[],i._mark=[],i._markE=void 0,i._cutted=[],i._info=[],i._foundry={},i._layer={},i._parse(e.childNodes,!1),e.innerHTML="",i},destroy:function(){this._matchCreator=void 0},length:function(){return this._pos},toMark:function(){void 0!==this._markE&&this._markE.scrollIntoView({inline:"start",block:"nearest"})},getToken:function(t){return void 0===t?this._token:this._token[t]},getValue:function(t,e,n){return this._info[t][e+"/"+n]},_parse:function(t,n){t.forEach((function(t){const i=this;void 0===i._info[i._pos]&&(i._info[i._pos]={});const r=i._info[i._pos];if(1===t.nodeType){let o=n;if("MARK"===t.tagName)o=!0;else if(t.hasAttribute("title")&&e.exec(t.getAttribute("title"))){let t,e,n;RegExp.$2?(t=RegExp.$1,e=RegExp.$2):(t="base",e=RegExp.$1),n=RegExp.$3,void 0===r[t+"/"+e]?r[t+"/"+e]=[n]:r[t+"/"+e].includes(n)||r[t+"/"+e].push(n),void 0===i._foundry[t]&&(i._foundry[t]={}),i._foundry[t][e]=1,void 0===i._layer[e]&&(i._layer[e]={}),i._layer[e][t]=1}else t.hasAttribute("class")&&"cutted"==t.getAttribute("class")&&(i._cutted.push(i._pos),i._token[i._pos++]="");t.hasChildNodes()&&i._parse(t.childNodes,o)}else 3===t.nodeType&&t.nodeValue.match(/[a-z0-9\u25ae]/iu)&&(i._mark[i._pos]=!!n,i._token[i._pos++]=t.nodeValue)}),this),delete this._info[this._pos]},element:function(){if(void 0!==this._el)return this._el;const e=n.createElement("div"),i=e.addE("table");this._el=e;let r=i.addE("thead").addE("tr");const o=KorAP.annotationHelper||{getDesc:function(){}},s=function(t,e,n){const i=this.addE(t);if(void 0===n)return i;if(e&&n instanceof Array&&void 0!==n[1]){let t,r;i.classList.add("matchkeyvalues"),n.forEach((function(n){t=i.addE("div"),t.addT(n),r=o.getDesc(e,n),r&&t.setAttribute("title",r)}))}else{n instanceof Array&&(n=n[0]),i.addT(n);const t=o.getDesc(e,n);t&&i.setAttribute("title",t)}return i};r.addCell=s,r.addCell("th",void 0,"Foundry"),r.addCell("th",void 0,"Layer"),Object.keys(this._token).forEach((function(t){const e=this.getToken(t),n=r.addCell("th",void 0,e);this._mark[t]?(n.classList.add("mark"),void 0===this._markE&&(this._markE=n)):this._cutted[0]!=t&&this._cutted[1]!=t||n.classList.add("cutted"),e.length>20&&n.setAttribute("title",e)}),this);const a=i.addE("tbody");let c,l,u,h;return Object.keys(this._foundry).sort().forEach((function(t){Object.keys(this._foundry[t]).sort().forEach((function(e){for(r=a.addE("tr"),r.setAttribute("tabindex",0),r.addCell=s,r.addCell("th",void 0,t),r.addCell("th",void 0,e),c=t+"/"+e+"=",l=0;l<this.length();l++)u=this.getValue(l,t,e),h=r.addCell("td",c,u),this._mark[l]&&h.classList.add("mark")}),this)}),this),this._matchCreator=t.create(this._el),this._el}}})),n("match/infolayer",[],(function(){const t=new RegExp("^([^/]+?)/([^=]+?)(?:=(spans|rels|tokens))?$");return{create:function(t,e,n){return Object.create(this)._init(t,e,n)},_init:function(e,n,i){if(void 0===e)throw new Error("Missing parameters");const r=this;if(void 0===n){if(!t.exec(e))throw new Error("Missing parameters");r.foundry=RegExp.$1,r.layer=RegExp.$2,r.type=RegExp.$3}else r.foundry=e,r.layer=n,r.type=i;return void 0===r.type&&(r.type="tokens"),r}}})),n("view/match/tokentable",["view","match/table","match/infolayer"],(function(t,e,n){const i=document;return{create:function(e){return Object.create(t)._init(["tokentable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");return t.classList.add("matchtable","loading"),this._show=t,t},afterEmbed:function(){const t=this._show;this.getData(void 0,(function(e){null!==e&&(t.appendChild(e.element()),e.toMark())})),t.classList.remove("loading")},match:function(){return this._match},getData:function(t,i){let r=[];void 0===t?r=this._match.getTokens():t.forEach((function(t){try{const e=n.create(t);e.type="tokens",r.push(e)}catch(t){return}})),0==r.length&&i(null);try{KorAP.API.getMatchInfo(this._match,{spans:!1,layer:r},function(t){void 0===t&&i(null),void 0!==t.snippet&&i(this._table=e.create(t.snippet))}.bind(this))}catch(t){KorAP.log(0,t),i(null)}},onClose:function(){this._match=void 0}}})),n("vc/fragment",["vc/doc","util"],(function(t){const e=KorAP.Locale;function n(t){const e=document.createElement("div");e.setAttribute("class","doc");const n=e.addE("span");n.setAttribute("class","key"),n.addT(t[0]);const i=e.addE("span");i.setAttribute("class","match"),i.addT("eq");const r=e.addE("span");return r.setAttribute("class","value"),r.addT(t[1]),e}return e.NEW_CONSTRAINT=e.NEW_CONSTRAINT||"New Constraint",{create:function(){const t=Object.create(this);return t._operands=[],t},add:function(t,e,n){this._operands.forEach((function(n,i,r){n[0]===t&&n[1]===e&&r.splice(i,1)})),this._operands.push([t,e,n]),this.update()},remove:function(t,e){for(let n=0;n<this._operands.length;n++){let i=this._operands[n];if(i[0]===t&&i[1]===e)return this._operands.splice(n,1),void this.update()}},isEmpty:function(){return!(this._operands.length>0)},element:function(){if(void 0!==this._el)return this._el;const t=this._el=document.createElement("div");return t.classList.add("vc","fragment"),t.addE("span").addT(e.NEW_CONSTRAINT+":"),this._frag=t.addE("div"),t},documents:function(){return this._operands.map((function(e){const n=t.create();return n.key(e[0]),n.matchop("eq"),n.value(e[1]),n.type("date"===e[2]?"date":"string"),n}))},update:function(){let t;const e=this._operands.length;e>1?(t=document.createElement("div"),t.setAttribute("class","docGroup"),t.setAttribute("data-operation","and"),this._operands.forEach(e=>t.appendChild(n(e)))):1==e&&(t=n(this._operands[0])),this.element();const i=this._frag;return 0===e?u(i):i.firstChild?i.replaceChild(t,i.firstChild):i.appendChild(t),this},toQuery:function(){return 0===this._operands.length?"":this._operands.map((function(t){return"date"===t[2]?t[0]+" in "+t[1]:t[0]+" = "+new String(t[1]).quote()})).join(" & ")}}})),n("match/corpusByMatch",["vc/fragment","util"],(function(t){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){const n=this;if(void 0===e)throw new Error("Missing parameters");if(!(e instanceof Node))throw new Error("Requires element");return n._vc={},n._meta=e,KorAP.Conf&&KorAP.Conf.CorpusByMatchDisabled?(n._meta.classList.add("cbm-disabled"),n):(n._meta.addEventListener("click",n.clickOnMeta.bind(n),!1),n._fragment=t.create(),n._fragment.element().addEventListener("click",n.toVcBuilder.bind(n),!0),n)},toVcBuilder:function(t){if(t&&t.stopPropagation(),this._fragment.isEmpty())return;const e=KorAP.vc;if(e){for(const t of this._fragment.documents())e.addRequired(t);e.isOpen()||e.open(),window.scrollTo(0,0)}else console.log("Global VC not established")},clickOnMeta:function(t){if(t.stopPropagation(),t.target===t.currentTarget)return;const e=t.target;let n,i,r;if("DD"===e.tagName?(r=e.getAttribute("data-type"),n=e.previousElementSibling.innerText,i=e.innerText):"DIV"===e.tagName&&(r=e.parentNode.getAttribute("data-type"),n=e.parentNode.previousElementSibling.innerText,i=e.innerText),"type:store"!==r&&"type:attachement"!==r&&(r=r||"type:string",n&&i)){const t=this;e.classList.contains("chosen")?(e.classList.remove("chosen"),t.remove(n,i)):(e.classList.add("chosen"),t.add(n,i,r)),t._fragment.isEmpty()?t._meta.parentNode.removeChild(t._fragment.element()):t._meta.parentNode.insertBefore(t._fragment.element(),t._meta.nextSibling)}},add:function(t,e,n){n=n.replace(/^type:/,""),this._fragment.add(t,e,n)},remove:function(t,e){this._fragment.remove(t,e)},toQuery:function(){return this._fragment.toQuery()}}})),n("match/attachement",[],(function(){const t=new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"),e=new RegExp("^ *([^=]+?) *= *(.+?) *$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){const i=this;if(n=decodeURIComponent(n),!t.exec(n))return;i.payload=RegExp.$2;let r={},o=0;return i.base64=!1,i.isLink=!1,i.contentType="text/plain",RegExp.$1.split(/ *; */).map(function(t){const n=this;!o++&&t.match(/^[-a-z0-9]+?\/.+$/)?(n.contentType=t,"application/x.korap-link"===t&&(n.isLink=!0)):"base64"==t.toLowerCase()?(n.base64=!0,n.payload=window.atob(n.payload)):e.exec(t)&&(r[RegExp.$1]=RegExp.$2)}.bind(i)),i.param=r,i},inline:function(){if(this.isLink){const t=this.param.title||this.payload,e=document.createElement("a");return e.setAttribute("href",this.payload),e.setAttribute("rel","noopener noreferrer"),e.addT(t),e}return document.createTextNode(this.payload)}}})),n("match/meta",["match/corpusByMatch","match/attachement","util"],(function(t,e){const n=KorAP.Locale;return n.METADATA=n.METADATA||"Metadata",{create:function(t,e){return Object.create(this)._init(t,e)},_init:function(t,e){return this._match=t,this._fields=e,this},match:function(){return this._match},element:function(){if(void 0!==this._el)return this._el;if(null===this._fields)return;const n=document.createElement("dl");n.classList.add("flex"),this._el=n;const i=this._fields,r={};return i.forEach((t,e)=>r[t.key]=e),Object.keys(r).sort().forEach((function(t){let o,s,a,c,l,u=i[r[t]];"UID"!==t&&"corpusID"!==t&&"docID"!==t&&"textID"!==t&&"layerInfos"!==t&&(o=document.createElement("div"),s=o.addE("dt"),s.addT(t),s.setAttribute("title",t),a=u.value,c=o.addE("dd"),c.setAttribute("data-type",u.type),a instanceof Array?(c.classList.add("metakeyvalues"),a.forEach((function(t){"type:attachement"===u.type?(l=e.create(t),l&&c.addE("div").appendChild(l.inline())):c.addE("div").addT(t)}))):"type:attachement"===u.type?(l=e.create(u.value),l&&c.appendChild(l.inline())):c.addT(u.value),n.appendChild(o))})),this._corpusByMatch=t.create(this._el),this._el}}})),n("view/match/meta",["view","match/meta"],(function(t,e){document;return{create:function(e){return Object.create(t)._init(["metatable"]).upgradeTo(this)._init(e)},_init:function(t){return this._match=t,this},show:function(){if(this._show)return this._show;const t=document.createElement("div");return t.classList.add("metatable","loading"),this.getData((function(e){null!==e&&(t.classList.remove("loading"),t.appendChild(e.element()))})),this._show=t},match:function(){return this._match},getData:function(t){const n=this._match;try{KorAP.API.getTextInfo(n,{},(function(i){if(void 0===i)return void t(null);const r=i.document;if(void 0===r)return void t(null);const o=r.fields;t(void 0!==o?e.create(n,o):null)}))}catch(e){KorAP.log(0,e),t(null)}},onClose:function(){this._match=void 0}}})),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof n&&n.amd)n("lib/dagre",[],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.dagre=t()}}((function(){return function t(n,i,r){function o(a,c){if(!i[a]){if(!n[a]){var l="function"==typeof e&&e;if(!c&&l)return l(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=i[a]={exports:{}};n[a][0].call(h.exports,(function(t){var e=n[a][1][t];return o(e||t)}),h,h.exports,t,n,i,r)}return i[a].exports}for(var s="function"==typeof e&&e,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){e.exports={graphlib:t("./lib/graphlib"),layout:t("./lib/layout"),debug:t("./lib/debug"),util:{time:t("./lib/util").time,notime:t("./lib/util").notime},version:t("./lib/version")}},{"./lib/debug":6,"./lib/graphlib":7,"./lib/layout":9,"./lib/util":29,"./lib/version":30}],2:[function(t,e,n){var i=t("./lodash"),r=t("./greedy-fas");e.exports={run:function(t){var e="greedy"===t.graph().acyclicer?r(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function o(s){i.has(r,s)||(r[s]=!0,n[s]=!0,i.each(t.outEdges(s),(function(t){i.has(n,t.w)?e.push(t):o(t.w)})),delete n[s])}return i.each(t.nodes(),o),e}(t);i.each(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,i.uniqueId("rev"))}))},undo:function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}}},{"./greedy-fas":8,"./lodash":10}],3:[function(t,e,n){var i=t("./lodash"),r=t("./util");function o(t,e,n,i,o,s){var a={width:0,height:0,rank:s},c=o[e][s-1],l=r.addDummyNode(t,"border",a,n);o[e][s]=l,t.setParent(l,i),c&&t.setEdge(c,l,{weight:1})}e.exports=function(t){i.each(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.each(r,e),i.has(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var a=s.minRank,c=s.maxRank+1;a<c;++a)o(t,"borderLeft","_bl",n,s,a),o(t,"borderRight","_br",n,s,a)}}))}},{"./lodash":10,"./util":29}],4:[function(t,e,n){var i=t("./lodash");function r(t){i.each(t.nodes(),(function(e){o(t.node(e))})),i.each(t.edges(),(function(e){o(t.edge(e))}))}function o(t){var e=t.width;t.width=t.height,t.height=e}function s(t){t.y=-t.y}function a(t){var e=t.x;t.x=t.y,t.y=e}e.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||r(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.each(t.nodes(),(function(e){s(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,s),i.has(n,"y")&&s(n)}))}(t);"lr"!==e&&"rl"!==e||(!function(t){i.each(t.nodes(),(function(e){a(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.each(n.points,a),i.has(n,"x")&&a(n)}))}(t),r(t))}}},{"./lodash":10}],5:[function(t,e,n){function i(){var t={};t._next=t._prev=t,this._sentinel=t}function r(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function o(t,e){if("_next"!==t&&"_prev"!==t)return e}e.exports=i,i.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return r(e),e},i.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&r(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},i.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,o)),n=n._prev;return"["+t.join(", ")+"]"}},{}],6:[function(t,e,n){var i=t("./lodash"),r=t("./util"),o=t("./graphlib").Graph;e.exports={debugOrdering:function(t){var e=r.buildLayerMatrix(t),n=new o({compound:!0,multigraph:!0}).setGraph({});return i.each(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),i.each(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),i.each(e,(function(t,e){var r="layer"+e;n.setNode(r,{rank:"same"}),i.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},{"./graphlib":7,"./lodash":10,"./util":29}],7:[function(t,e,n){var i;if(t)try{i=t("graphlib")}catch(t){}i||(i=window.graphlib),e.exports=i},{graphlib:31}],8:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph,o=t("./data/list");e.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new r,s=0,a=0;i.each(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.each(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,r=e(t),o=i+r;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=r),s=Math.max(s,n.node(t.w).in+=r)}));var l=i.range(a+s+3).map((function(){return new o})),u=s+1;return i.each(n.nodes(),(function(t){c(l,u,n.node(t))})),{graph:n,buckets:l,zeroIdx:u}}(t,e||s),l=function(t,e,n){var i,r=[],o=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)a(t,e,n,i);for(;i=o.dequeue();)a(t,e,n,i);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(i=e[c].dequeue()){r=r.concat(a(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return i.flatten(i.map(l,(function(e){return t.outEdges(e.v,e.w)})),!0)};var s=i.constant(1);function a(t,e,n,r,o){var s=o?[]:void 0;return i.each(t.inEdges(r.v),(function(i){var r=t.edge(i),a=t.node(i.v);o&&s.push({v:i.v,w:i.w}),a.out-=r,c(e,n,a)})),i.each(t.outEdges(r.v),(function(i){var r=t.edge(i),o=i.w,s=t.node(o);s.in-=r,c(e,n,s)})),t.removeNode(r.v),s}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},{"./data/list":5,"./graphlib":7,"./lodash":10}],9:[function(t,e,n){var i=t("./lodash"),r=t("./acyclic"),o=t("./normalize"),s=t("./rank"),a=t("./util").normalizeRanks,c=t("./parent-dummy-chains"),l=t("./util").removeEmptyRanks,u=t("./nesting-graph"),h=t("./add-border-segments"),d=t("./coordinate-system"),f=t("./order"),p=t("./position"),v=t("./util"),g=t("./graphlib").Graph;e.exports=function(t,e){var n=e&&e.debugTiming?v.time:v.notime;n("layout",(function(){var e=n("  buildLayoutGraph",(function(){return function(t){var e=new g({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(i.merge({},_,k(n,m),i.pick(n,y))),i.each(t.nodes(),(function(n){var r=C(t.node(n));e.setNode(n,i.defaults(k(r,b),w)),e.setParent(n,t.parent(n))})),i.each(t.edges(),(function(n){var r=C(t.edge(n));e.setEdge(n,i.merge({},x,k(r,E),i.pick(r,A)))})),e}(t)}));n("  runLayout",(function(){!function(t,e){e("    makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.each(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e("    removeSelfEdges",(function(){!function(t){i.each(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e("    acyclic",(function(){r.run(t)})),e("    nestingGraph.run",(function(){u.run(t)})),e("    rank",(function(){s(v.asNonCompoundGraph(t))})),e("    injectEdgeLabelProxies",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};v.addDummyNode(t,"edge-proxy",r,"_ep")}}))}(t)})),e("    removeEmptyRanks",(function(){l(t)})),e("    nestingGraph.cleanup",(function(){u.cleanup(t)})),e("    normalizeRanks",(function(){a(t)})),e("    assignRankMinMax",(function(){!function(t){var e=0;i.each(t.nodes(),(function(n){var r=t.node(n);r.borderTop&&(r.minRank=t.node(r.borderTop).rank,r.maxRank=t.node(r.borderBottom).rank,e=i.max(e,r.maxRank))})),t.graph().maxRank=e}(t)})),e("    removeEdgeLabelProxies",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e("    normalize.run",(function(){o.run(t)})),e("    parentDummyChains",(function(){c(t)})),e("    addBorderSegments",(function(){h(t)})),e("    order",(function(){f(t)})),e("    insertSelfEdges",(function(){!function(t){var e=v.buildLayerMatrix(t);i.each(e,(function(e){var n=0;i.each(e,(function(e,r){var o=t.node(e);o.order=r+n,i.each(o.selfEdges,(function(e){v.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:o.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete o.selfEdges}))}))}(t)})),e("    adjustCoordinateSystem",(function(){d.adjust(t)})),e("    position",(function(){p(t)})),e("    positionSelfEdges",(function(){!function(t){i.each(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,o=i.y,s=n.x-r,a=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:o-a},{x:r+5*s/6,y:o-a},{x:r+s,y:o},{x:r+5*s/6,y:o+a},{x:r+2*s/3,y:o+a}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e("    removeBorderNodes",(function(){!function(t){i.each(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),r=t.node(n.borderTop),o=t.node(n.borderBottom),s=t.node(i.last(n.borderLeft)),a=t.node(i.last(n.borderRight));n.width=Math.abs(a.x-s.x),n.height=Math.abs(o.y-r.y),n.x=s.x+n.width/2,n.y=r.y+n.height/2}})),i.each(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e("    normalize.undo",(function(){o.undo(t)})),e("    fixupEdgeLabelCoords",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);if(i.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e("    undoCoordinateSystem",(function(){d.undo(t)})),e("    translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,o=0,s=t.graph(),a=s.marginx||0,c=s.marginy||0;function l(t){var i=t.x,s=t.y,a=t.width,c=t.height;e=Math.min(e,i-a/2),n=Math.max(n,i+a/2),r=Math.min(r,s-c/2),o=Math.max(o,s+c/2)}i.each(t.nodes(),(function(e){l(t.node(e))})),i.each(t.edges(),(function(e){var n=t.edge(e);i.has(n,"x")&&l(n)})),e-=a,r-=c,i.each(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.each(t.edges(),(function(n){var o=t.edge(n);i.each(o.points,(function(t){t.x-=e,t.y-=r})),i.has(o,"x")&&(o.x-=e),i.has(o,"y")&&(o.y-=r)})),s.width=n-e+a,s.height=o-r+c}(t)})),e("    assignNodeIntersects",(function(){!function(t){i.each(t.edges(),(function(e){var n,i,r=t.edge(e),o=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=o),r.points.unshift(v.intersectRect(o,n)),r.points.push(v.intersectRect(s,i))}))}(t)})),e("    reversePoints",(function(){!function(t){i.each(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e("    acyclic.undo",(function(){r.undo(t)}))}(e,n)})),n("  updateInputGraph",(function(){!function(t,e){i.each(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.each(t.edges(),(function(n){var r=t.edge(n),o=e.edge(n);r.points=o.points,i.has(o,"x")&&(r.x=o.x,r.y=o.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var m=["nodesep","edgesep","ranksep","marginx","marginy"],_={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},y=["acyclicer","ranker","rankdir","align"],b=["width","height"],w={width:0,height:0},E=["minlen","weight","width","height","labeloffset"],x={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},A=["labelpos"];function k(t,e){return i.mapValues(i.pick(t,e),Number)}function C(t){var e={};return i.each(t,(function(t,n){e[n.toLowerCase()]=t})),e}},{"./acyclic":2,"./add-border-segments":3,"./coordinate-system":4,"./graphlib":7,"./lodash":10,"./nesting-graph":11,"./normalize":12,"./order":17,"./parent-dummy-chains":22,"./position":24,"./rank":26,"./util":29}],10:[function(t,e,n){var i;if(t)try{i=t("lodash")}catch(t){}i||(i=window._),e.exports=i},{lodash:51}],11:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){var e=r.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};return i.each(t.children(),(function(n){!function n(r,o){var s=t.children(r);s&&s.length&&i.each(s,(function(t){n(t,o+1)}));e[r]=o}(n,1)})),e}(t),o=i.max(n)-1,s=2*o+1;t.graph().nestingRoot=e,i.each(t.edges(),(function(e){t.edge(e).minlen*=s}));var a=function(t){return i.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.each(t.children(),(function(c){!function t(e,n,o,s,a,c,l){var u=e.children(l);if(!u.length)return void(l!==n&&e.setEdge(n,l,{weight:0,minlen:o}));var h=r.addBorderNode(e,"_bt"),d=r.addBorderNode(e,"_bb"),f=e.node(l);e.setParent(h,l),f.borderTop=h,e.setParent(d,l),f.borderBottom=d,i.each(u,(function(i){t(e,n,o,s,a,c,i);var r=e.node(i),u=r.borderTop?r.borderTop:i,f=r.borderBottom?r.borderBottom:i,p=r.borderTop?s:2*s,v=u!==f?1:a-c[l]+1;e.setEdge(h,u,{weight:p,minlen:v,nestingEdge:!0}),e.setEdge(f,d,{weight:p,minlen:v,nestingEdge:!0})})),e.parent(l)||e.setEdge(n,h,{weight:0,minlen:a+c[l]})}(t,e,s,a,o,n,c)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.each(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},{"./lodash":10,"./util":29}],12:[function(t,e,n){var i=t("./lodash"),r=t("./util");e.exports={run:function(t){t.graph().dummyChains=[],i.each(t.edges(),(function(e){!function(t,e){var n,i,o,s=e.v,a=t.node(s).rank,c=e.w,l=t.node(c).rank,u=e.name,h=t.edge(e),d=h.labelRank;if(l===a+1)return;for(t.removeEdge(e),o=0,++a;a<l;++o,++a)h.points=[],i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:a},n=r.addDummyNode(t,"edge",i,"_d"),a===d&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(s,n,{weight:h.weight},u),0===o&&t.graph().dummyChains.push(n),s=n;t.setEdge(s,c,{weight:h.weight},u)}(t,e)}))},undo:function(t){i.each(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}}},{"./lodash":10,"./util":29}],13:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){var r,o={};i.each(n,(function(n){for(var i,s,a=t.parent(n);a;){if((i=t.parent(a))?(s=o[i],o[i]=a):(s=r,r=a),s&&s!==a)return void e.setEdge(s,a);a=i}}))}},{"../lodash":10}],14:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){return i.map(e,(function(e){var n=t.inEdges(e);if(n.length){var r=i.reduce(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:r.sum/r.weight,weight:r.weight}}return{v:e}}))}},{"../lodash":10}],15:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph;e.exports=function(t,e,n){var o=function(t){var e;for(;t.hasNode(e=i.uniqueId("_root")););return e}(t),s=new r({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.each(t.nodes(),(function(r){var a=t.node(r),c=t.parent(r);(a.rank===e||a.minRank<=e&&e<=a.maxRank)&&(s.setNode(r),s.setParent(r,c||o),i.each(t[n](r),(function(e){var n=e.v===r?e.w:e.v,o=s.edge(n,r),a=i.isUndefined(o)?0:o.weight;s.setEdge(n,r,{weight:t.edge(e).weight+a})})),i.has(a,"minRank")&&s.setNode(r,{borderLeft:a.borderLeft[e],borderRight:a.borderRight[e]}))})),s}},{"../graphlib":7,"../lodash":10}],16:[function(t,e,n){var i=t("../lodash");function r(t,e,n){for(var r=i.zipObject(n,i.map(n,(function(t,e){return e}))),o=i.flatten(i.map(e,(function(e){return i.chain(t.outEdges(e)).map((function(e){return{pos:r[e.w],weight:t.edge(e).weight}})).sortBy("pos").value()})),!0),s=1;s<n.length;)s<<=1;var a=2*s-1;s-=1;var c=i.map(new Array(a),(function(){return 0})),l=0;return i.each(o.forEach((function(t){var e=t.pos+s;c[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;l+=t.weight*n}))),l}e.exports=function(t,e){for(var n=0,i=1;i<e.length;++i)n+=r(t,e[i-1],e[i]);return n}},{"../lodash":10}],17:[function(t,e,n){var i=t("../lodash"),r=t("./init-order"),o=t("./cross-count"),s=t("./sort-subgraph"),a=t("./build-layer-graph"),c=t("./add-subgraph-constraints"),l=t("../graphlib").Graph,u=t("../util");function h(t,e,n){return i.map(e,(function(e){return a(t,e,n)}))}function d(t,e){var n=new l;i.each(t,(function(t){var r=t.graph().root,o=s(t,r,n,e);i.each(o.vs,(function(e,n){t.node(e).order=n})),c(t,n,o.vs)}))}function f(t,e){i.each(e,(function(e){i.each(e,(function(e,n){t.node(e).order=n}))}))}e.exports=function(t){var e=u.maxRank(t),n=h(t,i.range(1,e+1),"inEdges"),s=h(t,i.range(e-1,-1,-1),"outEdges"),a=r(t);f(t,a);for(var c,l=Number.POSITIVE_INFINITY,p=0,v=0;v<4;++p,++v){d(p%2?n:s,p%4>=2),a=u.buildLayerMatrix(t);var g=o(t,a);g<l&&(v=0,c=i.cloneDeep(a),l=g)}f(t,c)}},{"../graphlib":7,"../lodash":10,"../util":29,"./add-subgraph-constraints":13,"./build-layer-graph":15,"./cross-count":16,"./init-order":18,"./sort-subgraph":20}],18:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e={},n=i.filter(t.nodes(),(function(e){return!t.children(e).length})),r=i.max(i.map(n,(function(e){return t.node(e).rank}))),o=i.map(i.range(r+1),(function(){return[]}));var s=i.sortBy(n,(function(e){return t.node(e).rank}));return i.each(s,(function n(r){if(i.has(e,r))return;e[r]=!0;var s=t.node(r);o[s.rank].push(r),i.each(t.successors(r),n)})),o}},{"../lodash":10}],19:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e){var n={};return i.each(t,(function(t,e){var r=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};i.isUndefined(t.barycenter)||(r.barycenter=t.barycenter,r.weight=t.weight)})),i.each(e.edges(),(function(t){var e=n[t.v],r=n[t.w];i.isUndefined(e)||i.isUndefined(r)||(r.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(i.isUndefined(e.barycenter)||i.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var o=t.pop();e.push(o),i.each(o.in.reverse(),n(o)),i.each(o.out,r(o))}return i.chain(e).filter((function(t){return!t.merged})).map((function(t){return i.pick(t,["vs","i","barycenter","weight"])})).value()}(i.filter(n,(function(t){return!t.indegree})))}},{"../lodash":10}],20:[function(t,e,n){var i=t("../lodash"),r=t("./barycenter"),o=t("./resolve-conflicts"),s=t("./sort");e.exports=function t(e,n,a,c){var l=e.children(n),u=e.node(n),h=u?u.borderLeft:void 0,d=u?u.borderRight:void 0,f={};h&&(l=i.filter(l,(function(t){return t!==h&&t!==d})));var p=r(e,l);i.each(p,(function(n){if(e.children(n.v).length){var r=t(e,n.v,a,c);f[n.v]=r,i.has(r,"barycenter")&&(o=n,s=r,i.isUndefined(o.barycenter)?(o.barycenter=s.barycenter,o.weight=s.weight):(o.barycenter=(o.barycenter*o.weight+s.barycenter*s.weight)/(o.weight+s.weight),o.weight+=s.weight))}var o,s}));var v=o(p,a);!function(t,e){i.each(t,(function(t){t.vs=i.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(v,f);var g=s(v,c);if(h&&(g.vs=i.flatten([h,g.vs,d],!0),e.predecessors(h).length)){var m=e.node(e.predecessors(h)[0]),_=e.node(e.predecessors(d)[0]);i.has(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+m.order+_.order)/(g.weight+2),g.weight+=2}return g}},{"../lodash":10,"./barycenter":14,"./resolve-conflicts":19,"./sort":21}],21:[function(t,e,n){var i=t("../lodash"),r=t("../util");function o(t,e,n){for(var r;e.length&&(r=i.last(e)).i<=n;)e.pop(),t.push(r.vs),n++;return n}e.exports=function(t,e){var n=r.partition(t,(function(t){return i.has(t,"barycenter")})),s=n.lhs,a=i.sortBy(n.rhs,(function(t){return-t.i})),c=[],l=0,u=0,h=0;s.sort((d=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:d?e.i-t.i:t.i-e.i})),h=o(c,a,h),i.each(s,(function(t){h+=t.vs.length,c.push(t.vs),l+=t.barycenter*t.weight,u+=t.weight,h=o(c,a,h)}));var d;var f={vs:i.flatten(c,!0)};u&&(f.barycenter=l/u,f.weight=u);return f}},{"../lodash":10,"../util":29}],22:[function(t,e,n){var i=t("./lodash");e.exports=function(t){var e=function(t){var e={},n=0;function r(o){var s=n;i.each(t.children(o),r),e[o]={low:s,lim:n++}}return i.each(t.children(),r),e}(t);i.each(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,o=function(t,e,n,i){var r,o,s=[],a=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));o=r,r=i;for(;(r=t.parent(r))!==o;)a.push(r);return{path:s.concat(a.reverse()),lca:o}}(t,e,r.v,r.w),s=o.path,a=o.lca,c=0,l=s[c],u=!0;n!==r.w;){if(i=t.node(n),u){for(;(l=s[c])!==a&&t.node(l).maxRank<i.rank;)c++;l===a&&(u=!1)}if(!u){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}},{"./lodash":10}],23:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("../util");function s(t,e){var n={};return i.reduce(e,(function(e,r){var o=0,s=0,a=e.length,l=i.last(r);return i.each(r,(function(e,u){var h=function(t,e){if(t.node(e).dummy)return i.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),d=h?t.node(h).order:a;(h||e===l)&&(i.each(r.slice(s,u+1),(function(e){i.each(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<o||d<s)||r.dummy&&t.node(e).dummy||c(n,i,e)}))})),s=u+1,o=d)})),r})),n}function a(t,e){var n={};function r(e,r,o,s,a){var l;i.each(i.range(r,o),(function(r){l=e[r],t.node(l).dummy&&i.each(t.predecessors(l),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>a)&&c(n,e,l)}))}))}return i.reduce(e,(function(e,n){var o,s=-1,a=0;return i.each(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(o=t.node(l[0]).order,r(n,a,c,s,o),a=c,s=o)}r(n,a,n.length,o,e.length)})),n})),n}function c(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function l(t,e,n){if(e>n){var r=e;e=n,n=r}return i.has(t[e],n)}function u(t,e,n,r){var o={},s={},a={};return i.each(e,(function(t){i.each(t,(function(t,e){o[t]=t,s[t]=t,a[t]=e}))})),i.each(e,(function(t){var e=-1;i.each(t,(function(t){var c=r(t);if(c.length)for(var u=((c=i.sortBy(c,(function(t){return a[t]}))).length-1)/2,h=Math.floor(u),d=Math.ceil(u);h<=d;++h){var f=c[h];s[t]===t&&e<a[f]&&!l(n,t,f)&&(s[f]=t,s[t]=o[t]=o[f],e=a[f])}}))})),{root:o,align:s}}function h(t,e,n,o,s){var a={},c=function(t,e,n,o){var s=new r,a=t.graph(),c=function(t,e,n){return function(r,o,s){var a,c=r.node(o),l=r.node(s),u=0;if(u+=c.width/2,i.has(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":a=-c.width/2;break;case"r":a=c.width/2}if(a&&(u+=n?a:-a),a=0,u+=(c.dummy?e:t)/2,u+=(l.dummy?e:t)/2,u+=l.width/2,i.has(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":a=l.width/2;break;case"r":a=-l.width/2}return a&&(u+=n?a:-a),a=0,u}}(a.nodesep,a.edgesep,o);return i.each(e,(function(e){var r;i.each(e,(function(e){var i=n[e];if(s.setNode(i),r){var o=n[r],a=s.edge(o,i);s.setEdge(o,i,Math.max(c(t,e,r),a||0))}r=e}))})),s}(t,e,n,s),l={};return i.each(c.nodes(),(function t(e){i.has(l,e)||(l[e]=!0,a[e]=i.reduce(c.inEdges(e),(function(e,n){return t(n.v),Math.max(e,a[n.v]+c.edge(n))}),0))})),i.each(c.nodes(),(function t(e){if(2!==l[e]){l[e]++;var n=i.reduce(c.outEdges(e),(function(e,n){return t(n.w),Math.min(e,a[n.w]-c.edge(n))}),Number.POSITIVE_INFINITY);n!==Number.POSITIVE_INFINITY&&(a[e]=Math.max(a[e],n))}})),i.each(o,(function(t){a[t]=a[n[t]]})),a}function d(t,e){return i.min(e,(function(e){var n=i.min(e,(function(e,n){return e-v(t,n)/2}));return i.max(e,(function(e,n){return e+v(t,n)/2}))-n}))}function f(t,e){var n=i.min(e),r=i.max(e);i.each(["u","d"],(function(o){i.each(["l","r"],(function(s){var a,c=o+s,l=t[c];l!==e&&(a="l"===s?n-i.min(l):r-i.max(l))&&(t[c]=i.mapValues(l,(function(t){return t+a})))}))}))}function p(t,e){return i.mapValues(t.ul,(function(n,r){if(e)return t[e.toLowerCase()][r];var o=i.sortBy(i.pluck(t,r));return(o[1]+o[2])/2}))}function v(t,e){return t.node(e).width}e.exports={positionX:function(t){var e,n=o.buildLayerMatrix(t),r=i.merge(s(t,n),a(t,n)),c={};i.each(["u","d"],(function(o){e="u"===o?n:i.values(n).reverse(),i.each(["l","r"],(function(n){"r"===n&&(e=i.map(e,(function(t){return i.values(t).reverse()})));var s=i.bind("u"===o?t.predecessors:t.successors,t),a=u(t,e,r,s),l=h(t,e,a.root,a.align,"r"===n);"r"===n&&(l=i.mapValues(l,(function(t){return-t}))),c[o+n]=l}))}));var l=d(t,c);return f(c,l),p(c,t.graph().align)},findType1Conflicts:s,findType2Conflicts:a,addConflict:c,hasConflict:l,verticalAlignment:u,horizontalCompaction:h,alignCoordinates:f,findSmallestWidthAlignment:d,balance:p}},{"../graphlib":7,"../lodash":10,"../util":29}],24:[function(t,e,n){var i=t("../lodash"),r=t("../util"),o=t("./bk").positionX;e.exports=function(t){(function(t){var e=r.buildLayerMatrix(t),n=t.graph().ranksep,o=0;i.each(e,(function(e){var r=i.max(i.map(e,(function(e){return t.node(e).height})));i.each(e,(function(e){t.node(e).y=o+r/2})),o+=r+n}))})(t=r.asNonCompoundGraph(t)),i.each(o(t),(function(e,n){t.node(n).x=e}))}},{"../lodash":10,"../util":29,"./bk":23}],25:[function(t,e,n){var i=t("../lodash"),r=t("../graphlib").Graph,o=t("./util").slack;function s(t,e){return i.each(t.nodes(),(function n(r){i.each(e.nodeEdges(r),(function(i){var s=i.v,a=r===s?i.w:s;t.hasNode(a)||o(e,i)||(t.setNode(a,{}),t.setEdge(r,a,{}),n(a))}))})),t.nodeCount()}function a(t,e){return i.min(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return o(e,n)}))}function c(t,e,n){i.each(t.nodes(),(function(t){e.node(t).rank+=n}))}e.exports=function(t){var e,n,i=new r({directed:!1}),l=t.nodes()[0],u=t.nodeCount();i.setNode(l,{});for(;s(i,t)<u;)e=a(i,t),n=i.hasNode(e.v)?o(t,e):-o(t,e),c(i,t,n);return i}},{"../graphlib":7,"../lodash":10,"./util":28}],26:[function(t,e,n){var i=t("./util").longestPath,r=t("./feasible-tree"),o=t("./network-simplex");e.exports=function(t){switch(t.graph().ranker){case"network-simplex":a(t);break;case"tight-tree":!function(t){i(t),r(t)}(t);break;case"longest-path":s(t);break;default:a(t)}};var s=i;function a(t){o(t)}},{"./feasible-tree":25,"./network-simplex":27,"./util":28}],27:[function(t,e,n){var i=t("../lodash"),r=t("./feasible-tree"),o=t("./util").slack,s=t("./util").longestPath,a=t("../graphlib").alg.preorder,c=t("../graphlib").alg.postorder,l=t("../util").simplify;function u(t){t=l(t),s(t);var e,n=r(t);for(f(n),h(n,t);e=v(n);)m(n,t,e,g(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),i.each(n,(function(n){!function(t,e,n){var i=t.node(n).parent;t.edge(n,i).cutvalue=d(t,e,n)}(t,e,n)}))}function d(t,e,n){var r=t.node(n).parent,o=!0,s=e.edge(n,r),a=0;return s||(o=!1,s=e.edge(r,n)),a=s.weight,i.each(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,u=l?i.w:i.v;if(u!==r){var h=l===o,d=e.edge(i).weight;if(a+=h?d:-d,s=n,c=u,t.hasEdge(s,c)){var f=t.edge(n,u).cutvalue;a+=h?-f:f}}})),a}function f(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,r,o){var s=n,a=t.node(r);return e[r]=!0,i.each(t.neighbors(r),(function(o){i.has(e,o)||(n=p(t,e,n,o,r))})),a.low=s,a.lim=n++,o?a.parent=o:delete a.parent,n}function v(t){return i.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function g(t,e,n){var r=n.v,s=n.w;e.hasEdge(r,s)||(r=n.w,s=n.v);var a=t.node(r),c=t.node(s),l=a,u=!1;a.lim>c.lim&&(l=c,u=!0);var h=i.filter(e.edges(),(function(e){return u===_(t,t.node(e.v),l)&&u!==_(t,t.node(e.w),l)}));return i.min(h,(function(t){return o(e,t)}))}function m(t,e,n,r){var o=n.v,s=n.w;t.removeEdge(o,s),t.setEdge(r.v,r.w,{}),f(t),h(t,e),function(t,e){var n=i.find(t.nodes(),(function(t){return!e.node(t).parent})),r=a(t,n);r=r.slice(1),i.each(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),o=!1;r||(r=e.edge(i,n),o=!0),e.node(n).rank=e.node(i).rank+(o?r.minlen:-r.minlen)}))}(t,e)}function _(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}e.exports=u,u.initLowLimValues=f,u.initCutValues=h,u.calcCutValue=d,u.leaveEdge=v,u.enterEdge=g,u.exchangeEdges=m},{"../graphlib":7,"../lodash":10,"../util":29,"./feasible-tree":25,"./util":28}],28:[function(t,e,n){var i=t("../lodash");e.exports={longestPath:function(t){var e={};i.each(t.sources(),(function n(r){var o=t.node(r);if(i.has(e,r))return o.rank;e[r]=!0;var s=i.min(i.map(t.outEdges(r),(function(e){return n(e.w)-t.edge(e).minlen})));return s===Number.POSITIVE_INFINITY&&(s=0),o.rank=s}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},{"../lodash":10}],29:[function(t,e,n){var i=t("./lodash"),r=t("./graphlib").Graph;function o(t,e,n,r){var o;do{o=i.uniqueId(r)}while(t.hasNode(o));return n.dummy=e,t.setNode(o,n),o}function s(t){return i.max(i.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!i.isUndefined(n))return n})))}e.exports={addDummyNode:o,simplify:function(t){var e=(new r).setGraph(t.graph());return i.each(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e},asNonCompoundGraph:function(t){var e=new r({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.each(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.each(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=i.map(t.nodes(),(function(e){var n={};return i.each(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return i.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,i,r=t.x,o=t.y,s=e.x-r,a=e.y-o,c=t.width/2,l=t.height/2;if(!s&&!a)throw new Error("Not possible to find intersection inside of the rectangle");Math.abs(a)*c>Math.abs(s)*l?(a<0&&(l=-l),n=l*s/a,i=l):(s<0&&(c=-c),n=c,i=c*a/s);return{x:r+n,y:o+i}},buildLayerMatrix:function(t){var e=i.map(i.range(s(t)+1),(function(){return[]}));return i.each(t.nodes(),(function(n){var r=t.node(n),o=r.rank;i.isUndefined(o)||(e[o][r.order]=n)})),e},normalizeRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank})));i.each(t.nodes(),(function(n){var r=t.node(n);i.has(r,"rank")&&(r.rank-=e)}))},removeEmptyRanks:function(t){var e=i.min(i.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.each(t.nodes(),(function(r){var o=t.node(r).rank-e;i.has(n,o)||(n[o]=[]),n[o].push(r)}));var r=0,o=t.graph().nodeRankFactor;i.each(n,(function(e,n){i.isUndefined(e)&&n%o!=0?--r:r&&i.each(e,(function(e){t.node(e).rank+=r}))}))},addBorderNode:function(t,e,n,i){var r={width:0,height:0};arguments.length>=4&&(r.rank=n,r.order=i);return o(t,"border",r,e)},maxRank:s,partition:function(t,e){var n={lhs:[],rhs:[]};return i.each(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=i.now();try{return e()}finally{console.log(t+" time: "+(i.now()-n)+"ms")}},notime:function(t,e){return e()}}},{"./graphlib":7,"./lodash":10}],30:[function(t,e,n){e.exports="0.7.1"},{}],31:[function(t,e,n){var i=t("./lib");e.exports={Graph:i.Graph,json:t("./lib/json"),alg:t("./lib/alg"),version:i.version}},{"./lib":47,"./lib/alg":38,"./lib/json":48}],32:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e,n={},r=[];function o(r){i.has(n,r)||(n[r]=!0,e.push(r),i.each(t.successors(r),o),i.each(t.predecessors(r),o))}return i.each(t.nodes(),(function(t){e=[],o(t),e.length&&r.push(e)})),r}},{"../lodash":49}],33:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){i.isArray(e)||(e=[e]);var r=[],o={};return i.each(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);!function t(e,n,r,o,s){i.has(o,n)||(o[n]=!0,r||s.push(n),i.each(e.neighbors(n),(function(n){t(e,n,r,o,s)})),r&&s.push(n))}(t,e,"post"===n,o,r)})),r}},{"../lodash":49}],34:[function(t,e,n){var i=t("./dijkstra"),r=t("../lodash");e.exports=function(t,e,n){return r.transform(t.nodes(),(function(r,o){r[o]=i(t,o,e,n)}),{})}},{"../lodash":49,"./dijkstra":35}],35:[function(t,e,n){var i=t("../lodash"),r=t("../data/priority-queue");e.exports=function(t,e,n,i){return function(t,e,n,i){var o,s,a={},c=new r,l=function(t){var e=t.v!==o?t.v:t.w,i=a[e],r=n(t),l=s.distance+r;if(r<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+t+" Weight: "+r);l<i.distance&&(i.distance=l,i.predecessor=o,c.decrease(e,l))};t.nodes().forEach((function(t){var n=t===e?0:Number.POSITIVE_INFINITY;a[t]={distance:n},c.add(t,n)}));for(;c.size()>0&&(o=c.removeMin(),(s=a[o]).distance!==Number.POSITIVE_INFINITY);)i(o).forEach(l);return a}(t,String(e),n||o,i||function(e){return t.outEdges(e)})};var o=i.constant(1)},{"../data/priority-queue":45,"../lodash":49}],36:[function(t,e,n){var i=t("../lodash"),r=t("./tarjan");e.exports=function(t){return i.filter(r(t),(function(t){return t.length>1}))}},{"../lodash":49,"./tarjan":43}],37:[function(t,e,n){var i=t("../lodash");e.exports=function(t,e,n){return function(t,e,n){var i={},r=t.nodes();return r.forEach((function(t){i[t]={},i[t][t]={distance:0},r.forEach((function(e){t!==e&&(i[t][e]={distance:Number.POSITIVE_INFINITY})})),n(t).forEach((function(n){var r=n.v===t?n.w:n.v,o=e(n);i[t][r]={distance:o,predecessor:t}}))})),r.forEach((function(t){var e=i[t];r.forEach((function(n){var o=i[n];r.forEach((function(n){var i=o[t],r=e[n],s=o[n],a=i.distance+r.distance;a<s.distance&&(s.distance=a,s.predecessor=r.predecessor)}))}))})),i}(t,e||r,n||function(e){return t.outEdges(e)})};var r=i.constant(1)},{"../lodash":49}],38:[function(t,e,n){e.exports={components:t("./components"),dijkstra:t("./dijkstra"),dijkstraAll:t("./dijkstra-all"),findCycles:t("./find-cycles"),floydWarshall:t("./floyd-warshall"),isAcyclic:t("./is-acyclic"),postorder:t("./postorder"),preorder:t("./preorder"),prim:t("./prim"),tarjan:t("./tarjan"),topsort:t("./topsort")}},{"./components":32,"./dijkstra":35,"./dijkstra-all":34,"./find-cycles":36,"./floyd-warshall":37,"./is-acyclic":39,"./postorder":40,"./preorder":41,"./prim":42,"./tarjan":43,"./topsort":44}],39:[function(t,e,n){var i=t("./topsort");e.exports=function(t){try{i(t)}catch(t){if(t instanceof i.CycleException)return!1;throw t}return!0}},{"./topsort":44}],40:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"post")}},{"./dfs":33}],41:[function(t,e,n){var i=t("./dfs");e.exports=function(t,e){return i(t,e,"pre")}},{"./dfs":33}],42:[function(t,e,n){var i=t("../lodash"),r=t("../graph"),o=t("../data/priority-queue");e.exports=function(t,e){var n,s=new r,a={},c=new o;function l(t){var i=t.v===n?t.w:t.v,r=c.priority(i);if(void 0!==r){var o=e(t);o<r&&(a[i]=n,c.decrease(i,o))}}if(0===t.nodeCount())return s;i.each(t.nodes(),(function(t){c.add(t,Number.POSITIVE_INFINITY),s.setNode(t)})),c.decrease(t.nodes()[0],0);var u=!1;for(;c.size()>0;){if(n=c.removeMin(),i.has(a,n))s.setEdge(n,a[n]);else{if(u)throw new Error("Input graph is not connected: "+t);u=!0}t.nodeEdges(n).forEach(l)}return s}},{"../data/priority-queue":45,"../graph":46,"../lodash":49}],43:[function(t,e,n){var i=t("../lodash");e.exports=function(t){var e=0,n=[],r={},o=[];return t.nodes().forEach((function(s){i.has(r,s)||function s(a){var c=r[a]={onStack:!0,lowlink:e,index:e++};if(n.push(a),t.successors(a).forEach((function(t){i.has(r,t)?r[t].onStack&&(c.lowlink=Math.min(c.lowlink,r[t].index)):(s(t),c.lowlink=Math.min(c.lowlink,r[t].lowlink))})),c.lowlink===c.index){var l,u=[];do{l=n.pop(),r[l].onStack=!1,u.push(l)}while(a!==l);o.push(u)}}(s)})),o}},{"../lodash":49}],44:[function(t,e,n){var i=t("../lodash");function r(t){var e={},n={},r=[];if(i.each(t.sinks(),(function s(a){if(i.has(n,a))throw new o;i.has(e,a)||(n[a]=!0,e[a]=!0,i.each(t.predecessors(a),s),delete n[a],r.push(a))})),i.size(e)!==t.nodeCount())throw new o;return r}function o(){}e.exports=r,r.CycleException=o},{"../lodash":49}],45:[function(t,e,n){var i=t("../lodash");function r(){this._arr=[],this._keyIndices={}}e.exports=r,r.prototype.size=function(){return this._arr.length},r.prototype.keys=function(){return this._arr.map((function(t){return t.key}))},r.prototype.has=function(t){return i.has(this._keyIndices,t)},r.prototype.priority=function(t){var e=this._keyIndices[t];if(void 0!==e)return this._arr[e].priority},r.prototype.min=function(){if(0===this.size())throw new Error("Queue underflow");return this._arr[0].key},r.prototype.add=function(t,e){var n=this._keyIndices;if(t=String(t),!i.has(n,t)){var r=this._arr,o=r.length;return n[t]=o,r.push({key:t,priority:e}),this._decrease(o),!0}return!1},r.prototype.removeMin=function(){this._swap(0,this._arr.length-1);var t=this._arr.pop();return delete this._keyIndices[t.key],this._heapify(0),t.key},r.prototype.decrease=function(t,e){var n=this._keyIndices[t];if(e>this._arr[n].priority)throw new Error("New priority is greater than current priority. Key: "+t+" Old: "+this._arr[n].priority+" New: "+e);this._arr[n].priority=e,this._decrease(n)},r.prototype._heapify=function(t){var e=this._arr,n=2*t,i=n+1,r=t;n<e.length&&(r=e[n].priority<e[r].priority?n:r,i<e.length&&(r=e[i].priority<e[r].priority?i:r),r!==t&&(this._swap(t,r),this._heapify(r)))},r.prototype._decrease=function(t){for(var e,n=this._arr,i=n[t].priority;0!==t&&!(n[e=t>>1].priority<i);)this._swap(t,e),t=e},r.prototype._swap=function(t,e){var n=this._arr,i=this._keyIndices,r=n[t],o=n[e];n[t]=o,n[e]=r,i[o.key]=t,i[r.key]=e}},{"../lodash":49}],46:[function(t,e,n){var i=t("./lodash");e.exports=r;function r(t){this._isDirected=!i.has(t,"directed")||t.directed,this._isMultigraph=!!i.has(t,"multigraph")&&t.multigraph,this._isCompound=!!i.has(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=i.constant(void 0),this._defaultEdgeLabelFn=i.constant(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children["\0"]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}function o(t,e){i.has(t,e)?t[e]++:t[e]=1}function s(t,e){--t[e]||delete t[e]}function a(t,e,n,r){if(!t&&e>n){var o=e;e=n,n=o}return e+""+n+""+(i.isUndefined(r)?"\0":r)}function c(t,e,n,i){if(!t&&e>n){var r=e;e=n,n=r}var o={v:e,w:n};return i&&(o.name=i),o}function l(t,e){return a(t,e.v,e.w,e.name)}r.prototype._nodeCount=0,r.prototype._edgeCount=0,r.prototype.isDirected=function(){return this._isDirected},r.prototype.isMultigraph=function(){return this._isMultigraph},r.prototype.isCompound=function(){return this._isCompound},r.prototype.setGraph=function(t){return this._label=t,this},r.prototype.graph=function(){return this._label},r.prototype.setDefaultNodeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultNodeLabelFn=t,this},r.prototype.nodeCount=function(){return this._nodeCount},r.prototype.nodes=function(){return i.keys(this._nodes)},r.prototype.sources=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._in[t])}),this)},r.prototype.sinks=function(){return i.filter(this.nodes(),(function(t){return i.isEmpty(this._out[t])}),this)},r.prototype.setNodes=function(t,e){var n=arguments;return i.each(t,(function(t){n.length>1?this.setNode(t,e):this.setNode(t)}),this),this},r.prototype.setNode=function(t,e){return i.has(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]="\0",this._children[t]={},this._children["\0"][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)},r.prototype.node=function(t){return this._nodes[t]},r.prototype.hasNode=function(t){return i.has(this._nodes,t)},r.prototype.removeNode=function(t){var e=this;if(i.has(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],i.each(this.children(t),(function(t){this.setParent(t)}),this),delete this._children[t]),i.each(i.keys(this._in[t]),n),delete this._in[t],delete this._preds[t],i.each(i.keys(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this},r.prototype.setParent=function(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(i.isUndefined(e))e="\0";else{for(var n=e;!i.isUndefined(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this},r.prototype._removeFromParentsChildList=function(t){delete this._children[this._parent[t]][t]},r.prototype.parent=function(t){if(this._isCompound){var e=this._parent[t];if("\0"!==e)return e}},r.prototype.children=function(t){if(i.isUndefined(t)&&(t="\0"),this._isCompound){var e=this._children[t];if(e)return i.keys(e)}else{if("\0"===t)return this.nodes();if(this.hasNode(t))return[]}},r.prototype.predecessors=function(t){var e=this._preds[t];if(e)return i.keys(e)},r.prototype.successors=function(t){var e=this._sucs[t];if(e)return i.keys(e)},r.prototype.neighbors=function(t){var e=this.predecessors(t);if(e)return i.union(e,this.successors(t))},r.prototype.setDefaultEdgeLabel=function(t){return i.isFunction(t)||(t=i.constant(t)),this._defaultEdgeLabelFn=t,this},r.prototype.edgeCount=function(){return this._edgeCount},r.prototype.edges=function(){return i.values(this._edgeObjs)},r.prototype.setPath=function(t,e){var n=this,r=arguments;return i.reduce(t,(function(t,i){return r.length>1?n.setEdge(t,i,e):n.setEdge(t,i),i})),this},r.prototype.setEdge=function(){var t,e,n,r,s=!1;i.isPlainObject(arguments[0])?(t=arguments[0].v,e=arguments[0].w,n=arguments[0].name,2===arguments.length&&(r=arguments[1],s=!0)):(t=arguments[0],e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],s=!0)),t=""+t,e=""+e,i.isUndefined(n)||(n=""+n);var l=a(this._isDirected,t,e,n);if(i.has(this._edgeLabels,l))return s&&(this._edgeLabels[l]=r),this;if(!i.isUndefined(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[l]=s?r:this._defaultEdgeLabelFn(t,e,n);var u=c(this._isDirected,t,e,n);return t=u.v,e=u.w,Object.freeze(u),this._edgeObjs[l]=u,o(this._preds[e],t),o(this._sucs[t],e),this._in[e][l]=u,this._out[t][l]=u,this._edgeCount++,this},r.prototype.edge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return this._edgeLabels[i]},r.prototype.hasEdge=function(t,e,n){var r=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n);return i.has(this._edgeLabels,r)},r.prototype.removeEdge=function(t,e,n){var i=1===arguments.length?l(this._isDirected,arguments[0]):a(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],s(this._preds[e],t),s(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this},r.prototype.inEdges=function(t,e){var n=this._in[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.v===e})):r}},r.prototype.outEdges=function(t,e){var n=this._out[t];if(n){var r=i.values(n);return e?i.filter(r,(function(t){return t.w===e})):r}},r.prototype.nodeEdges=function(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}},{"./lodash":49}],47:[function(t,e,n){e.exports={Graph:t("./graph"),version:t("./version")}},{"./graph":46,"./version":50}],48:[function(t,e,n){var i=t("./lodash"),r=t("./graph");function o(t){return i.map(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),o={v:e};return i.isUndefined(n)||(o.value=n),i.isUndefined(r)||(o.parent=r),o}))}function s(t){return i.map(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.isUndefined(e.name)||(r.name=e.name),i.isUndefined(n)||(r.value=n),r}))}e.exports={write:function(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:o(t),edges:s(t)};i.isUndefined(t.graph())||(e.value=i.clone(t.graph()));return e},read:function(t){var e=new r(t.options).setGraph(t.value);return i.each(t.nodes,(function(t){e.setNode(t.v,t.value),t.parent&&e.setParent(t.v,t.parent)})),i.each(t.edges,(function(t){e.setEdge({v:t.v,w:t.w,name:t.name},t.value)})),e}}},{"./graph":46,"./lodash":49}],49:[function(t,e,n){e.exports=t(10)},{"/Users/cpettitt/projects/dagre/lib/lodash.js":10,lodash:51}],50:[function(t,e,n){e.exports="1.0.1"},{}],51:[function(t,e,n){(function(t){(function(){var i=[],r=[],o=0,s=+new Date+"",a=/\b__p \+= '';/g,c=/\b(__p \+=) '' \+/g,l=/(__e\(.*?\)|\b__t\)) \+\n'';/g,u=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,h=/\w*$/,d=/^\s*function[ \n\r\t]+\w/,f=/<%=([\s\S]+?)%>/g,p=RegExp("^[ \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　]*0+(?=.$)"),v=/($^)/,g=/\bthis\b/,m=/['\n\r\t\u2028\u2029\\]/g,_=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],y=0,b="[object Arguments]",w="[object Array]",E="[object Boolean]",x="[object Date]",A="[object Object]",k="[object String]",C={"[object Function]":!1};C[b]=C[w]=C[E]=C[x]=C["[object Number]"]=C[A]=C["[object RegExp]"]=C[k]=!0;var T={leading:!1,maxWait:0,trailing:!1},P={configurable:!1,enumerable:!1,value:null,writable:!1},L={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},S={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},N=L[typeof window]&&window||this,O=L[typeof n]&&n&&!n.nodeType&&n,I=L[typeof e]&&e&&!e.nodeType&&e,R=I&&I.exports===O&&O,j=L[typeof t]&&t;function K(t,e,n){for(var i=(n||0)-1,r=t?t.length:0;++i<r;)if(t[i]===e)return i;return-1}function M(t,e){var n=typeof e;if(t=t.cache,"boolean"==n||null==e)return t[e]?0:-1;"number"!=n&&"string"!=n&&(n="object");var i="number"==n?e:s+e;return t=(t=t[n])&&t[i],"object"==n?t&&K(t,e)>-1?0:-1:t?0:-1}function q(t){var e=this.cache,n=typeof t;if("boolean"==n||null==t)e[t]=!0;else{"number"!=n&&"string"!=n&&(n="object");var i="number"==n?t:s+t,r=e[n]||(e[n]={});"object"==n?(r[i]||(r[i]=[])).push(t):r[i]=!0}}function B(t){return t.charCodeAt(0)}function U(t,e){for(var n=t.criteria,i=e.criteria,r=-1,o=n.length;++r<o;){var s=n[r],a=i[r];if(s!==a){if(s>a||void 0===s)return 1;if(s<a||void 0===a)return-1}}return t.index-e.index}function D(t){var e=-1,n=t.length,i=t[0],r=t[n/2|0],o=t[n-1];if(i&&"object"==typeof i&&r&&"object"==typeof r&&o&&"object"==typeof o)return!1;var s=V();s.false=s.null=s.true=s[void 0]=!1;var a=V();for(a.array=t,a.cache=s,a.push=q;++e<n;)a.push(t[e]);return a}function F(t){return"\\"+S[t]}function H(){return i.pop()||[]}function V(){return r.pop()||{array:null,cache:null,criteria:null,false:!1,index:0,null:!1,number:null,object:null,push:null,string:null,true:!1,undefined:!1,value:null}}function G(t){t.length=0,i.length<40&&i.push(t)}function z(t){var e=t.cache;e&&z(e),t.array=t.cache=t.criteria=t.object=t.number=t.string=t.value=null,r.length<40&&r.push(t)}function Y(t,e,n){e||(e=0),void 0===n&&(n=t?t.length:0);for(var i=-1,r=n-e||0,o=Array(r<0?0:r);++i<r;)o[i]=t[e+i];return o}!j||j.global!==j&&j.window!==j||(N=j);var W=function t(e){var n=(e=e?W.defaults(N.Object(),e,W.pick(N,_)):N).Array,i=e.Boolean,r=e.Date,S=e.Function,O=e.Math,I=e.Number,R=e.Object,j=e.RegExp,q=e.String,$=e.TypeError,Q=[],J=R.prototype,X=e._,Z=J.toString,tt=j("^"+q(Z).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),et=O.ceil,nt=e.clearTimeout,it=O.floor,rt=S.prototype.toString,ot=Ut(ot=R.getPrototypeOf)&&ot,st=J.hasOwnProperty,at=Q.push,ct=e.setTimeout,lt=Q.splice,ut=Q.unshift,ht=function(){try{var t={},e=Ut(e=R.defineProperty)&&e,n=e(t,t,t)&&e}catch(t){}return n}(),dt=Ut(dt=R.create)&&dt,ft=Ut(ft=n.isArray)&&ft,pt=e.isFinite,vt=e.isNaN,gt=Ut(gt=R.keys)&&gt,mt=O.max,_t=O.min,yt=e.parseInt,bt=O.random,wt={};function Et(t){return t&&"object"==typeof t&&!Gt(t)&&st.call(t,"__wrapped__")?t:new xt(t)}function xt(t,e){this.__chain__=!!e,this.__wrapped__=t}wt[w]=n,wt[E]=i,wt[x]=r,wt["[object Function]"]=S,wt[A]=R,wt["[object Number]"]=I,wt["[object RegExp]"]=j,wt[k]=q,xt.prototype=Et.prototype;var At=Et.support={};function kt(t){var e=t[0],n=t[2],i=t[4];function r(){if(n){var t=Y(n);at.apply(t,arguments)}if(this instanceof r){var o=Tt(e.prototype),s=e.apply(o,t||arguments);return oe(s)?s:o}return e.apply(i,t||arguments)}return Dt(r,t),r}function Ct(t,e,n,i,r){if(n){var o=n(t);if(void 0!==o)return o}if(!oe(t))return t;var s=Z.call(t);if(!C[s])return t;var a=wt[s];switch(s){case E:case x:return new a(+t);case"[object Number]":case k:return new a(t);case"[object RegExp]":return(o=a(t.source,h.exec(t))).lastIndex=t.lastIndex,o}var c=Gt(t);if(e){var l=!i;i||(i=H()),r||(r=H());for(var u=i.length;u--;)if(i[u]==t)return r[u];o=c?a(t.length):{}}else o=c?Y(t):Jt({},t);return c&&(st.call(t,"index")&&(o.index=t.index),st.call(t,"input")&&(o.input=t.input)),e?(i.push(t),r.push(o),(c?ve:te)(t,(function(t,s){o[s]=Ct(t,e,n,i,r)})),l&&(G(i),G(r)),o):o}function Tt(t,e){return oe(t)?dt(t):{}}function Pt(t,e,n){if("function"!=typeof t)return Ke;if(void 0===e||!("prototype"in t))return t;var i=t.__bindData__;if(void 0===i&&(At.funcNames&&(i=!t.name),!(i=i||!At.funcDecomp))){var r=rt.call(t);At.funcNames||(i=!d.test(r)),i||(i=g.test(r),Dt(t,i))}if(!1===i||!0!==i&&1&i[1])return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)};case 4:return function(n,i,r,o){return t.call(e,n,i,r,o)}}return Re(t,e)}function Lt(t){var e=t[0],n=t[1],i=t[2],r=t[3],o=t[4],s=t[5],a=1&n,c=2&n,l=4&n,u=8&n,h=e;function d(){var t=a?o:this;if(i){var f=Y(i);at.apply(f,arguments)}if((r||l)&&(f||(f=Y(arguments)),r&&at.apply(f,r),l&&f.length<s))return n|=16,Lt([e,u?n:-4&n,f,null,o,s]);if(f||(f=arguments),c&&(e=t[h]),this instanceof d){t=Tt(e.prototype);var p=e.apply(t,f);return oe(p)?p:t}return e.apply(t,f)}return Dt(d,t),d}function St(t,e){var n=-1,i=Bt(),r=t?t.length:0,o=r>=75&&i===K,s=[];if(o){var a=D(e);a?(i=M,e=a):o=!1}for(;++n<r;){var c=t[n];i(e,c)<0&&s.push(c)}return o&&z(e),s}function Nt(t,e,n,i){for(var r=(i||0)-1,o=t?t.length:0,s=[];++r<o;){var a=t[r];if(a&&"object"==typeof a&&"number"==typeof a.length&&(Gt(a)||Vt(a))){e||(a=Nt(a,e,n));var c=-1,l=a.length,u=s.length;for(s.length+=l;++c<l;)s[u++]=a[c]}else n||s.push(a)}return s}function Ot(t,e,n,i,r,o){if(n){var s=n(t,e);if(void 0!==s)return!!s}if(t===e)return 0!==t||1/t==1/e;if(!(t!=t||t&&L[typeof t]||e&&L[typeof e]))return!1;if(null==t||null==e)return t===e;var a=Z.call(t),c=Z.call(e);if(a==b&&(a=A),c==b&&(c=A),a!=c)return!1;switch(a){case E:case x:return+t==+e;case"[object Number]":return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case"[object RegExp]":case k:return t==q(e)}var l=a==w;if(!l){var u=st.call(t,"__wrapped__"),h=st.call(e,"__wrapped__");if(u||h)return Ot(u?t.__wrapped__:t,h?e.__wrapped__:e,n,i,r,o);if(a!=A)return!1;var d=t.constructor,f=e.constructor;if(d!=f&&!(re(d)&&d instanceof d&&re(f)&&f instanceof f)&&"constructor"in t&&"constructor"in e)return!1}var p=!r;r||(r=H()),o||(o=H());for(var v=r.length;v--;)if(r[v]==t)return o[v]==e;var g=0;if(s=!0,r.push(t),o.push(e),l){if(v=t.length,g=e.length,(s=g==v)||i)for(;g--;){var m=v,_=e[g];if(i)for(;m--&&!(s=Ot(t[m],_,n,i,r,o)););else if(!(s=Ot(t[g],_,n,i,r,o)))break}}else Zt(e,(function(e,a,c){if(st.call(c,a))return g++,s=st.call(t,a)&&Ot(t[a],e,n,i,r,o)})),s&&!i&&Zt(t,(function(t,e,n){if(st.call(n,e))return s=--g>-1}));return r.pop(),o.pop(),p&&(G(r),G(o)),s}function It(t,e,n,i,r){(Gt(e)?ve:te)(e,(function(e,o){var s,a,c=e,l=t[o];if(e&&((a=Gt(e))||ae(e))){for(var u,h=i.length;h--;)if(s=i[h]==e){l=r[h];break}if(!s)n&&(u=void 0!==(c=n(l,e)))&&(l=c),u||(l=a?Gt(l)?l:[]:ae(l)?l:{}),i.push(e),r.push(l),u||It(l,e,n,i,r)}else n&&void 0===(c=n(l,e))&&(c=e),void 0!==c&&(l=c);t[o]=l}))}function Rt(t,e){return t+it(bt()*(e-t+1))}function jt(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=[],a=!e&&o>=75&&r===K,c=n||a?H():s;a&&(r=M,c=D(c));for(;++i<o;){var l=t[i],u=n?n(l,i,t):l;(e?!i||c[c.length-1]!==u:r(c,u)<0)&&((n||a)&&c.push(u),s.push(l))}return a?(G(c.array),z(c)):n&&G(c),s}function Kt(t){return function(e,n,i){var r={};n=Et.createCallback(n,i,3);var o=-1,s=e?e.length:0;if("number"==typeof s)for(;++o<s;){var a=e[o];t(r,a,n(a,o,e),e)}else te(e,(function(e,i,o){t(r,e,n(e,i,o),o)}));return r}}function Mt(t,e,n,i,r,o){var s=1&e,a=4&e,c=16&e,l=32&e;if(!(2&e)&&!re(t))throw new $;c&&!n.length&&(e&=-17,c=n=!1),l&&!i.length&&(e&=-33,l=i=!1);var u=t&&t.__bindData__;return u&&!0!==u?((u=Y(u))[2]&&(u[2]=Y(u[2])),u[3]&&(u[3]=Y(u[3])),!s||1&u[1]||(u[4]=r),!s&&1&u[1]&&(e|=8),!a||4&u[1]||(u[5]=o),c&&at.apply(u[2]||(u[2]=[]),n),l&&ut.apply(u[3]||(u[3]=[]),i),u[1]|=e,Mt.apply(null,u)):(1==e||17===e?kt:Lt)([t,e,n,i,r,o])}function qt(t){return Yt[t]}function Bt(){var t=(t=Et.indexOf)===Pe?K:t;return t}function Ut(t){return"function"==typeof t&&tt.test(t)}At.funcDecomp=!Ut(e.WinRTError)&&g.test(t),At.funcNames="string"==typeof S.name,Et.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:f,variable:"",imports:{_:Et}},dt||(Tt=function(){function t(){}return function(n){if(oe(n)){t.prototype=n;var i=new t;t.prototype=null}return i||e.Object()}}());var Dt=ht?function(t,e){P.value=e,ht(t,"__bindData__",P)}:qe;function Ft(t){var e,n;return!(!t||Z.call(t)!=A||re(e=t.constructor)&&!(e instanceof e))&&(Zt(t,(function(t,e){n=e})),void 0===n||st.call(t,n))}function Ht(t){return Wt[t]}function Vt(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==b||!1}var Gt=ft||function(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Z.call(t)==w||!1},zt=gt?function(t){return oe(t)?gt(t):[]}:function(t){var e,n=t,i=[];if(!n)return i;if(!L[typeof t])return i;for(e in n)st.call(n,e)&&i.push(e);return i},Yt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Wt=ie(Yt),$t=j("("+zt(Wt).join("|")+")","g"),Qt=j("["+zt(Yt).join("")+"]","g"),Jt=function(t,e,n){var i,r=t,o=r;if(!r)return o;var s=arguments,a=0,c="number"==typeof n?2:s.length;if(c>3&&"function"==typeof s[c-2])var l=Pt(s[--c-1],s[c--],2);else c>2&&"function"==typeof s[c-1]&&(l=s[--c]);for(;++a<c;)if((r=s[a])&&L[typeof r])for(var u=-1,h=L[typeof r]&&zt(r),d=h?h.length:0;++u<d;)o[i=h[u]]=l?l(o[i],r[i]):r[i];return o},Xt=function(t,e,n){var i,r=t,o=r;if(!r)return o;for(var s=arguments,a=0,c="number"==typeof n?2:s.length;++a<c;)if((r=s[a])&&L[typeof r])for(var l=-1,u=L[typeof r]&&zt(r),h=u?u.length:0;++l<h;)void 0===o[i=u[l]]&&(o[i]=r[i]);return o},Zt=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;for(i in e=e&&void 0===n?e:Pt(e,n,3),r)if(!1===e(r[i],i,t))return o;return o},te=function(t,e,n){var i,r=t,o=r;if(!r)return o;if(!L[typeof r])return o;e=e&&void 0===n?e:Pt(e,n,3);for(var s=-1,a=L[typeof r]&&zt(r),c=a?a.length:0;++s<c;)if(!1===e(r[i=a[s]],i,t))return o;return o};function ee(t,e,n){var i=zt(t),r=i.length;for(e=Pt(e,n,3);r--;){var o=i[r];if(!1===e(t[o],o,t))break}return t}function ne(t){var e=[];return Zt(t,(function(t,n){re(t)&&e.push(n)})),e.sort()}function ie(t){for(var e=-1,n=zt(t),i=n.length,r={};++e<i;){var o=n[e];r[t[o]]=o}return r}function re(t){return"function"==typeof t}function oe(t){return!(!t||!L[typeof t])}function se(t){return"number"==typeof t||t&&"object"==typeof t&&"[object Number]"==Z.call(t)||!1}var ae=ot?function(t){if(!t||Z.call(t)!=A)return!1;var e=t.valueOf,n=Ut(e)&&(n=ot(e))&&ot(n);return n?t==n||ot(t)==n:Ft(t)}:Ft;function ce(t){return"string"==typeof t||t&&"object"==typeof t&&Z.call(t)==k||!1}function le(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;)o[e]=t[i[e]];return o}function ue(t,e,n){var i=-1,r=Bt(),o=t?t.length:0,s=!1;return n=(n<0?mt(0,o+n):n)||0,Gt(t)?s=r(t,e,n)>-1:"number"==typeof o?s=(ce(t)?t.indexOf(e,n):r(t,e,n))>-1:te(t,(function(t){if(++i>=n)return!(s=t===e)})),s}var he=Kt((function(t,e,n){st.call(t,n)?t[n]++:t[n]=1}));function de(t,e,n){var i=!0;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&(i=!!e(t[r],r,t)););else te(t,(function(t,n,r){return i=!!e(t,n,r)}));return i}function fe(t,e,n){var i=[];e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o;){var s=t[r];e(s,r,t)&&i.push(s)}else te(t,(function(t,n,r){e(t,n,r)&&i.push(t)}));return i}function pe(t,e,n){e=Et.createCallback(e,n,3);var i,r=-1,o=t?t.length:0;if("number"!=typeof o)return te(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i;for(;++r<o;){var s=t[r];if(e(s,r,t))return s}}function ve(t,e,n){var i=-1,r=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof r)for(;++i<r&&!1!==e(t[i],i,t););else te(t,e);return t}function ge(t,e,n){var i=t?t.length:0;if(e=e&&void 0===n?e:Pt(e,n,3),"number"==typeof i)for(;i--&&!1!==e(t[i],i,t););else{var r=zt(t);i=r.length,te(t,(function(t,n,o){return n=r?r[--i]:--i,e(o[n],n,o)}))}return t}var me=Kt((function(t,e,n){(st.call(t,n)?t[n]:t[n]=[]).push(e)})),_e=Kt((function(t,e,n){t[n]=e}));function ye(t,e,i){var r=-1,o=t?t.length:0;if(e=Et.createCallback(e,i,3),"number"==typeof o)for(var s=n(o);++r<o;)s[r]=e(t[r],r,t);else s=[],te(t,(function(t,n,i){s[++r]=e(t,n,i)}));return s}function be(t,e,n){var i=-1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a>r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),ve(t,(function(t,n,o){var s=e(t,n,o);s>i&&(i=s,r=t)}));return r}var we=ye;function Ee(t,e,n,i){if(!t)return n;var r=arguments.length<3;e=Et.createCallback(e,i,4);var o=-1,s=t.length;if("number"==typeof s)for(r&&(n=t[++o]);++o<s;)n=e(n,t[o],o,t);else te(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}));return n}function xe(t,e,n,i){var r=arguments.length<3;return e=Et.createCallback(e,i,4),ge(t,(function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)})),n}function Ae(t){var e=-1,i=t?t.length:0,r=n("number"==typeof i?i:0);return ve(t,(function(t){var n=Rt(0,++e);r[e]=r[n],r[n]=t})),r}function ke(t,e,n){var i;e=Et.createCallback(e,n,3);var r=-1,o=t?t.length:0;if("number"==typeof o)for(;++r<o&&!(i=e(t[r],r,t)););else te(t,(function(t,n,r){return!(i=e(t,n,r))}));return!!i}var Ce=fe;function Te(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=-1;for(e=Et.createCallback(e,n,3);++o<r&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[0]:void 0;return Y(t,0,_t(mt(0,i),r))}function Pe(t,e,n){if("number"==typeof n){var i=t?t.length:0;n=n<0?mt(0,i+n):n||0}else if(n){var r=Se(t,e);return t[r]===e?r:-1}return K(t,e,n)}function Le(t,e,n){if("number"!=typeof e&&null!=e){var i=0,r=-1,o=t?t.length:0;for(e=Et.createCallback(e,n,3);++r<o&&e(t[r],r,t);)i++}else i=null==e||n?1:mt(0,e);return Y(t,i)}function Se(t,e,n,i){var r=0,o=t?t.length:r;for(e=(n=n?Et.createCallback(n,i,1):Ke)(e);r<o;){var s=r+o>>>1;n(t[s])<e?r=s+1:o=s}return r}function Ne(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(n=Et.createCallback(n,i,3)),jt(t,e,n)}function Oe(){for(var t=arguments.length>1?arguments:arguments[0],e=-1,i=t?be(we(t,"length")):0,r=n(i<0?0:i);++e<i;)r[e]=we(t,e);return r}function Ie(t,e){var n=-1,i=t?t.length:0,r={};for(e||!i||Gt(t[0])||(e=[]);++n<i;){var o=t[n];e?r[o]=e[n]:o&&(r[o[0]]=o[1])}return r}function Re(t,e){return arguments.length>2?Mt(t,17,Y(arguments,2),null,e):Mt(t,1,null,null,e)}function je(t,e,n){var i,r,o,s,a,c,l,u=0,h=!1,d=!0;if(!re(t))throw new $;if(e=mt(0,e)||0,!0===n){var f=!0;d=!1}else oe(n)&&(f=n.leading,h="maxWait"in n&&(mt(e,n.maxWait)||0),d="trailing"in n?n.trailing:d);var p=function(){var n=e-(Ue()-s);if(n<=0){r&&nt(r);var h=l;r=c=l=void 0,h&&(u=Ue(),o=t.apply(a,i),c||r||(i=a=null))}else c=ct(p,n)},v=function(){c&&nt(c),r=c=l=void 0,(d||h!==e)&&(u=Ue(),o=t.apply(a,i),c||r||(i=a=null))};return function(){if(i=arguments,s=Ue(),a=this,l=d&&(c||!f),!1===h)var n=f&&!c;else{r||f||(u=s);var g=h-(s-u),m=g<=0;m?(r&&(r=nt(r)),u=s,o=t.apply(a,i)):r||(r=ct(v,g))}return m&&c?c=nt(c):c||e===h||(c=ct(p,e)),n&&(m=!0,o=t.apply(a,i)),!m||c||r||(i=a=null),o}}function Ke(t){return t}function Me(t,e,n){var i=!0,r=e&&ne(e);e&&(n||r.length)||(null==n&&(n=e),o=xt,e=t,t=Et,r=ne(e)),!1===n?i=!1:oe(n)&&"chain"in n&&(i=n.chain);var o=t,s=re(o);ve(r,(function(n){var r=t[n]=e[n];s&&(o.prototype[n]=function(){var e=this.__chain__,n=this.__wrapped__,s=[n];at.apply(s,arguments);var a=r.apply(t,s);if(i||e){if(n===a&&oe(a))return this;(a=new o(a)).__chain__=e}return a})}))}function qe(){}var Be,Ue=Ut(Ue=r.now)&&Ue||function(){return(new r).getTime()},De=8==yt(" \t\v\f \ufeff\n\r\u2028\u2029 ᠎             　08")?yt:function(t,e){return yt(ce(t)?t.replace(p,""):t,e||0)};function Fe(t){return function(e){return e[t]}}function He(){return this.__wrapped__}return Et.after=function(t,e){if(!re(e))throw new $;return function(){if(--t<1)return e.apply(this,arguments)}},Et.assign=Jt,Et.at=function(t){for(var e=arguments,i=-1,r=Nt(e,!0,!1,1),o=e[2]&&e[2][e[1]]===t?1:r.length,s=n(o);++i<o;)s[i]=t[r[i]];return s},Et.bind=Re,Et.bindAll=function(t){for(var e=arguments.length>1?Nt(arguments,!0,!1,1):ne(t),n=-1,i=e.length;++n<i;){var r=e[n];t[r]=Mt(t[r],1,null,null,t)}return t},Et.bindKey=function(t,e){return arguments.length>2?Mt(e,19,Y(arguments,2),null,t):Mt(e,3,null,null,t)},Et.chain=function(t){return(t=new xt(t)).__chain__=!0,t},Et.compact=function(t){for(var e=-1,n=t?t.length:0,i=[];++e<n;){var r=t[e];r&&i.push(r)}return i},Et.compose=function(){for(var t=arguments,e=t.length;e--;)if(!re(t[e]))throw new $;return function(){for(var e=arguments,n=t.length;n--;)e=[t[n].apply(this,e)];return e[0]}},Et.constant=function(t){return function(){return t}},Et.countBy=he,Et.create=function(t,e){var n=Tt(t);return e?Jt(n,e):n},Et.createCallback=function(t,e,n){var i=typeof t;if(null==t||"function"==i)return Pt(t,e,n);if("object"!=i)return Fe(t);var r=zt(t),o=r[0],s=t[o];return 1!=r.length||s!=s||oe(s)?function(e){for(var n=r.length,i=!1;n--&&(i=Ot(e[r[n]],t[r[n]],null,!0)););return i}:function(t){var e=t[o];return s===e&&(0!==s||1/s==1/e)}},Et.curry=function(t,e){return Mt(t,4,null,null,null,e="number"==typeof e?e:+e||t.length)},Et.debounce=je,Et.defaults=Xt,Et.defer=function(t){if(!re(t))throw new $;var e=Y(arguments,1);return ct((function(){t.apply(void 0,e)}),1)},Et.delay=function(t,e){if(!re(t))throw new $;var n=Y(arguments,2);return ct((function(){t.apply(void 0,n)}),e)},Et.difference=function(t){return St(t,Nt(arguments,!0,!0,1))},Et.filter=fe,Et.flatten=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n="function"!=typeof e&&i&&i[e]===t?null:e,e=!1),null!=n&&(t=ye(t,n,i)),Nt(t,e)},Et.forEach=ve,Et.forEachRight=ge,Et.forIn=Zt,Et.forInRight=function(t,e,n){var i=[];Zt(t,(function(t,e){i.push(e,t)}));var r=i.length;for(e=Pt(e,n,3);r--&&!1!==e(i[r--],i[r],t););return t},Et.forOwn=te,Et.forOwnRight=ee,Et.functions=ne,Et.groupBy=me,Et.indexBy=_e,Et.initial=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else i=null==e||n?1:e||i;return Y(t,0,_t(mt(0,r-i),r))},Et.intersection=function(){for(var t=[],e=-1,n=arguments.length,i=H(),r=Bt(),o=r===K,s=H();++e<n;){var a=arguments[e];(Gt(a)||Vt(a))&&(t.push(a),i.push(o&&a.length>=75&&D(e?t[e]:s)))}var c=t[0],l=-1,u=c?c.length:0,h=[];t:for(;++l<u;){var d=i[0];if(a=c[l],(d?M(d,a):r(s,a))<0){for(e=n,(d||s).push(a);--e;)if(((d=i[e])?M(d,a):r(t[e],a))<0)continue t;h.push(a)}}for(;n--;)(d=i[n])&&z(d);return G(i),G(s),h},Et.invert=ie,Et.invoke=function(t,e){var i=Y(arguments,2),r=-1,o="function"==typeof e,s=t?t.length:0,a=n("number"==typeof s?s:0);return ve(t,(function(t){a[++r]=(o?e:t[e]).apply(t,i)})),a},Et.keys=zt,Et.map=ye,Et.mapValues=function(t,e,n){var i={};return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){i[n]=e(t,n,r)})),i},Et.max=be,Et.memoize=function(t,e){if(!re(t))throw new $;var n=function(){var i=n.cache,r=e?e.apply(this,arguments):s+arguments[0];return st.call(i,r)?i[r]:i[r]=t.apply(this,arguments)};return n.cache={},n},Et.merge=function(t){var e=arguments,n=2;if(!oe(t))return t;if("number"!=typeof e[2]&&(n=e.length),n>3&&"function"==typeof e[n-2])var i=Pt(e[--n-1],e[n--],2);else n>2&&"function"==typeof e[n-1]&&(i=e[--n]);for(var r=Y(arguments,1,n),o=-1,s=H(),a=H();++o<n;)It(t,r[o],i,s,a);return G(s),G(a),t},Et.min=function(t,e,n){var i=1/0,r=i;if("function"!=typeof e&&n&&n[e]===t&&(e=null),null==e&&Gt(t))for(var o=-1,s=t.length;++o<s;){var a=t[o];a<r&&(r=a)}else e=null==e&&ce(t)?B:Et.createCallback(e,n,3),ve(t,(function(t,n,o){var s=e(t,n,o);s<i&&(i=s,r=t)}));return r},Et.omit=function(t,e,n){var i={};if("function"!=typeof e){var r=[];Zt(t,(function(t,e){r.push(e)}));for(var o=-1,s=(r=St(r,Nt(arguments,!0,!1,1))).length;++o<s;){var a=r[o];i[a]=t[a]}}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)||(i[n]=t)}));return i},Et.once=function(t){var e,n;if(!re(t))throw new $;return function(){return e||(e=!0,n=t.apply(this,arguments),t=null),n}},Et.pairs=function(t){for(var e=-1,i=zt(t),r=i.length,o=n(r);++e<r;){var s=i[e];o[e]=[s,t[s]]}return o},Et.partial=function(t){return Mt(t,16,Y(arguments,1))},Et.partialRight=function(t){return Mt(t,32,null,Y(arguments,1))},Et.pick=function(t,e,n){var i={};if("function"!=typeof e)for(var r=-1,o=Nt(arguments,!0,!1,1),s=oe(t)?o.length:0;++r<s;){var a=o[r];a in t&&(i[a]=t[a])}else e=Et.createCallback(e,n,3),Zt(t,(function(t,n,r){e(t,n,r)&&(i[n]=t)}));return i},Et.pluck=we,Et.property=Fe,Et.pull=function(t){for(var e=arguments,n=0,i=e.length,r=t?t.length:0;++n<i;)for(var o=-1,s=e[n];++o<r;)t[o]===s&&(lt.call(t,o--,1),r--);return t},Et.range=function(t,e,i){t=+t||0,null==e&&(e=t,t=0);for(var r=-1,o=mt(0,et((e-t)/((i="number"==typeof i?i:+i||1)||1))),s=n(o);++r<o;)s[r]=t,t+=i;return s},Et.reject=function(t,e,n){return e=Et.createCallback(e,n,3),fe(t,(function(t,n,i){return!e(t,n,i)}))},Et.remove=function(t,e,n){var i=-1,r=t?t.length:0,o=[];for(e=Et.createCallback(e,n,3);++i<r;){var s=t[i];e(s,i,t)&&(o.push(s),lt.call(t,i--,1),r--)}return o},Et.rest=Le,Et.shuffle=Ae,Et.sortBy=function(t,e,i){var r=-1,o=Gt(e),s=t?t.length:0,a=n("number"==typeof s?s:0);for(o||(e=Et.createCallback(e,i,3)),ve(t,(function(t,n,i){var s=a[++r]=V();o?s.criteria=ye(e,(function(e){return t[e]})):(s.criteria=H())[0]=e(t,n,i),s.index=r,s.value=t})),s=a.length,a.sort(U);s--;){var c=a[s];a[s]=c.value,o||G(c.criteria),z(c)}return a},Et.tap=function(t,e){return e(t),t},Et.throttle=function(t,e,n){var i=!0,r=!0;if(!re(t))throw new $;return!1===n?i=!1:oe(n)&&(i="leading"in n?n.leading:i,r="trailing"in n?n.trailing:r),T.leading=i,T.maxWait=e,T.trailing=r,je(t,e,T)},Et.times=function(t,e,i){t=(t=+t)>-1?t:0;var r=-1,o=n(t);for(e=Pt(e,i,1);++r<t;)o[r]=e(r);return o},Et.toArray=function(t){return t&&"number"==typeof t.length?Y(t):le(t)},Et.transform=function(t,e,n,i){var r=Gt(t);if(null==n)if(r)n=[];else{var o=t&&t.constructor,s=o&&o.prototype;n=Tt(s)}return e&&(e=Et.createCallback(e,i,4),(r?ve:te)(t,(function(t,i,r){return e(n,t,i,r)}))),n},Et.union=function(){return jt(Nt(arguments,!0,!0))},Et.uniq=Ne,Et.values=le,Et.where=Ce,Et.without=function(t){return St(t,Y(arguments,1))},Et.wrap=function(t,e){return Mt(e,16,[t])},Et.xor=function(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Gt(n)||Vt(n))var i=i?jt(St(i,n).concat(St(n,i))):n}return i||[]},Et.zip=Oe,Et.zipObject=Ie,Et.collect=ye,Et.drop=Le,Et.each=ve,Et.eachRight=ge,Et.extend=Jt,Et.methods=ne,Et.object=Ie,Et.select=fe,Et.tail=Le,Et.unique=Ne,Et.unzip=Oe,Me(Et),Et.clone=function(t,e,n,i){return"boolean"!=typeof e&&null!=e&&(i=n,n=e,e=!1),Ct(t,e,"function"==typeof n&&Pt(n,i,1))},Et.cloneDeep=function(t,e,n){return Ct(t,!0,"function"==typeof e&&Pt(e,n,1))},Et.contains=ue,Et.escape=function(t){return null==t?"":q(t).replace(Qt,qt)},Et.every=de,Et.find=pe,Et.findIndex=function(t,e,n){var i=-1,r=t?t.length:0;for(e=Et.createCallback(e,n,3);++i<r;)if(e(t[i],i,t))return i;return-1},Et.findKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),te(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.findLast=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ge(t,(function(t,n,r){if(e(t,n,r))return i=t,!1})),i},Et.findLastIndex=function(t,e,n){var i=t?t.length:0;for(e=Et.createCallback(e,n,3);i--;)if(e(t[i],i,t))return i;return-1},Et.findLastKey=function(t,e,n){var i;return e=Et.createCallback(e,n,3),ee(t,(function(t,n,r){if(e(t,n,r))return i=n,!1})),i},Et.has=function(t,e){return!!t&&st.call(t,e)},Et.identity=Ke,Et.indexOf=Pe,Et.isArguments=Vt,Et.isArray=Gt,Et.isBoolean=function(t){return!0===t||!1===t||t&&"object"==typeof t&&Z.call(t)==E||!1},Et.isDate=function(t){return t&&"object"==typeof t&&Z.call(t)==x||!1},Et.isElement=function(t){return t&&1===t.nodeType||!1},Et.isEmpty=function(t){var e=!0;if(!t)return e;var n=Z.call(t),i=t.length;return n==w||n==k||n==b||n==A&&"number"==typeof i&&re(t.splice)?!i:(te(t,(function(){return e=!1})),e)},Et.isEqual=function(t,e,n,i){return Ot(t,e,"function"==typeof n&&Pt(n,i,2))},Et.isFinite=function(t){return pt(t)&&!vt(parseFloat(t))},Et.isFunction=re,Et.isNaN=function(t){return se(t)&&t!=+t},Et.isNull=function(t){return null===t},Et.isNumber=se,Et.isObject=oe,Et.isPlainObject=ae,Et.isRegExp=function(t){return t&&"object"==typeof t&&"[object RegExp]"==Z.call(t)||!1},Et.isString=ce,Et.isUndefined=function(t){return void 0===t},Et.lastIndexOf=function(t,e,n){var i=t?t.length:0;for("number"==typeof n&&(i=(n<0?mt(0,i+n):_t(n,i-1))+1);i--;)if(t[i]===e)return i;return-1},Et.mixin=Me,Et.noConflict=function(){return e._=X,this},Et.noop=qe,Et.now=Ue,Et.parseInt=De,Et.random=function(t,e,n){var i=null==t,r=null==e;if(null==n&&("boolean"==typeof t&&r?(n=t,t=1):r||"boolean"!=typeof e||(n=e,r=!0)),i&&r&&(e=1),t=+t||0,r?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=bt();return _t(t+o*(e-t+parseFloat("1e-"+((o+"").length-1))),e)}return Rt(t,e)},Et.reduce=Ee,Et.reduceRight=xe,Et.result=function(t,e){if(t){var n=t[e];return re(n)?t[e]():n}},Et.runInContext=t,Et.size=function(t){var e=t?t.length:0;return"number"==typeof e?e:zt(t).length},Et.some=ke,Et.sortedIndex=Se,Et.template=function(t,e,n){var i=Et.templateSettings;t=q(t||""),n=Xt({},n,i);var r,o=Xt({},n.imports,i.imports),s=zt(o),h=le(o),d=0,p=n.interpolate||v,g="__p += '",_=j((n.escape||v).source+"|"+p.source+"|"+(p===f?u:v).source+"|"+(n.evaluate||v).source+"|$","g");t.replace(_,(function(e,n,i,o,s,a){return i||(i=o),g+=t.slice(d,a).replace(m,F),n&&(g+="' +\n__e("+n+") +\n'"),s&&(r=!0,g+="';\n"+s+";\n__p += '"),i&&(g+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=a+e.length,e})),g+="';\n";var b=n.variable,w=b;w||(g="with ("+(b="obj")+") {\n"+g+"\n}\n"),g=(r?g.replace(a,""):g).replace(c,"$1").replace(l,"$1;"),g="function("+b+") {\n"+(w?"":b+" || ("+b+" = {});\n")+"var __t, __p = '', __e = _.escape"+(r?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+g+"return __p\n}";var E="\n/*\n//# sourceURL="+(n.sourceURL||"/lodash/template/source["+y+++"]")+"\n*/";try{var x=S(s,"return "+g+E).apply(void 0,h)}catch(t){throw t.source=g,t}return e?x(e):(x.source=g,x)},Et.unescape=function(t){return null==t?"":q(t).replace($t,Ht)},Et.uniqueId=function(t){var e=++o;return q(null==t?"":t)+e},Et.all=de,Et.any=ke,Et.detect=pe,Et.findWhere=pe,Et.foldl=Ee,Et.foldr=xe,Et.include=ue,Et.inject=Ee,Me((Be={},te(Et,(function(t,e){Et.prototype[e]||(Be[e]=t)})),Be),!1),Et.first=Te,Et.last=function(t,e,n){var i=0,r=t?t.length:0;if("number"!=typeof e&&null!=e){var o=r;for(e=Et.createCallback(e,n,3);o--&&e(t[o],o,t);)i++}else if(null==(i=e)||n)return t?t[r-1]:void 0;return Y(t,mt(0,r-i))},Et.sample=function(t,e,n){if(t&&"number"!=typeof t.length&&(t=le(t)),null==e||n)return t?t[Rt(0,t.length-1)]:void 0;var i=Ae(t);return i.length=_t(mt(0,e),i.length),i},Et.take=Te,Et.head=Te,te(Et,(function(t,e){var n="sample"!==e;Et.prototype[e]||(Et.prototype[e]=function(e,i){var r=this.__chain__,o=t(this.__wrapped__,e,i);return r||null!=e&&(!i||n&&"function"==typeof e)?new xt(o,r):o})})),Et.VERSION="2.4.1",Et.prototype.chain=function(){return this.__chain__=!0,this},Et.prototype.toString=function(){return q(this.__wrapped__)},Et.prototype.value=He,Et.prototype.valueOf=He,ve(["join","pop","shift"],(function(t){var e=Q[t];Et.prototype[t]=function(){var t=this.__chain__,n=e.apply(this.__wrapped__,arguments);return t?new xt(n,t):n}})),ve(["push","reverse","sort","unshift"],(function(t){var e=Q[t];Et.prototype[t]=function(){return e.apply(this.__wrapped__,arguments),this}})),ve(["concat","slice","splice"],(function(t){var e=Q[t];Et.prototype[t]=function(){return new xt(e.apply(this.__wrapped__,arguments),this.__chain__)}})),Et}();O&&I?R?(I.exports=W)._=W:O._=W:N._=W}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})),n("match/treehierarchy",["lib/dagre"],(function(t){const e=document,n=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$");return{create:function(t){return Object.create(this)._init(t)},_init:function(n){this._next=new Number(0);let i=e.createElement("div");i.innerHTML=n;const r=new t.graphlib.Graph({directed:!0});return r.setGraph({nodesep:35,ranksep:15,marginx:40,marginy:10}),r.setDefaultEdgeLabel({}),this._graph=r,this._addNode(this._next++,{class:"root"}),this._parse(0,i.childNodes,void 0),1===r.outEdges(0).length&&r.removeNode(0),i=void 0,this},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},nodes:function(){return this._next},_addNode:function(t,e){return e.width=55,e.height=20,this._graph.setNode(t,e),e},_addEdge:function(t,e){this._graph.setEdge(t,e)},_clean:function(t){return t.replace(n,"$3")},_parse:function(t,e,n){return e.forEach((function(e){if(1==e.nodeType)if(e.getAttribute("title")){const i=this._next++,r=this._addNode(i,{class:"middle",label:this._clean(e.getAttribute("title"))});void 0!==n&&(r.class+=" mark"),this._addEdge(t,i),e.hasChildNodes()&&this._parse(i,e.childNodes,n)}else e.hasChildNodes()&&this._parse(t,e.childNodes,"MARK"===e.tagName||n);else if(3==e.nodeType&&e.nodeValue.match(/[-a-z0-9]/i)){const n=this._next++;this._addNode(n,{class:"leaf",label:e.nodeValue}),this._addEdge(t,n)}}),this),this},show:function(){},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);e>n&&(t.scrollLeft=(e-n)/2)},toBase64:function(){const t=e.createElement("div");t.innerHTML=this.element().outerHTML;const n=t.firstChild,i=this._c("style");return n.getElementsByTagName("defs")[0].appendChild(i),i.innerHTML="path.edge { stroke: black; stroke-width: 2pt; fill: none; }g.root rect.empty,g.middle rect{ stroke: black; stroke-width: 2pt; fill: #bbb; }g.leaf > rect { display: none }g > text > tspan { text-anchor: middle; font-size: 9pt }g.leaf > text > tspan { font-size: 10pt; overflow: visible; }",btoa(unescape(encodeURIComponent(n.outerHTML)).replace(/&nbsp;/g," "))},element:function(){if(void 0!==this._el)return this._el;const n=this._graph;t.layout(n);const i=this._c("svg");this._el=i,i.appendChild(this._c("defs"));const r=this;let o,s,a;n.edges().forEach((function(t){o=n.node(t.v),s=n.node(t.w),a=r._c("path"),a.setAttributeNS(null,"d",function(t,e){const n=t.x,i=t.y,r=e.x,o=e.y-e.height/2;return"M "+n+","+i+" C "+n+","+i+" "+r+","+(o-(o-i)/2)+" "+r+","+o}(o,s)),a.classList.add("edge"),i.appendChild(a)}));let c=n.graph().height;return n.nodes().forEach((function(t){t=n.node(t);const o=r._c("g");o.setAttribute("class",t.class);const s=o.appendChild(r._c("rect"));if(s.setAttribute("x",t.x-t.width/2),s.setAttribute("y",t.y-t.height/2),s.setAttribute("rx",5),s.setAttribute("ry",5),s.setAttribute("width",t.width),s.setAttribute("height",t.height),"root"===t.class&&void 0===t.label&&(s.setAttribute("width",t.height),s.setAttribute("x",t.x-t.height/2),s.setAttribute("class","empty")),void 0!==t.label){const n=o.appendChild(r._c("text"));let i=t.y-t.height/2;n.setAttribute("y",i),n.setAttribute("transform","translate("+t.width/2+","+(t.height/2+5)+")");const s=t.label.replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");if("leaf"===t.class){n.setAttribute("title",s);let o,a=0;s.split(" ").forEach((function(s){0!==s.length&&(o=r._c("tspan"),o.appendChild(e.createTextNode(s)),0!==a?o.setAttribute("dy","14pt"):a=1,o.setAttribute("x",t.x-t.width/2),i+=14,n.appendChild(o))})),i+=14,i>c&&(c=i)}else{const i=r._c("tspan");i.appendChild(e.createTextNode(s)),i.setAttribute("x",t.x-t.width/2),n.appendChild(i)}}i.appendChild(o)})),i.setAttribute("width",n.graph().width),i.setAttribute("height",c),this._el},downloadLink:function(){const t=e.createElement("a");return t.setAttribute("href-lang","image/svg+xml"),t.setAttribute("href","data:image/svg+xml;base64,"+this.toBase64()),t.setAttribute("download","tree.svg"),t.target="_blank",t.setAttribute("rel","noopener noreferrer"),t}}})),n("match/treearc",[],(function(){const t=new RegExp("^(?:([^/]+?)/)?([^:]+?):(.+?)$"),e=document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._tokens=[],n._arcs=[],n._tokenElements=[],n._y=0,n._currentInFocus=void 0,n.maxArc=200,n.overlapDiff=40,n.arcDiff=15,n.anchorDiff=8,n.anchorStart=15,n.tokenSep=30,n.xPadding=10,n.yPadding=5,null==t||null==t)return n;const i=e.createElement("div");i.innerHTML=t,n.temp={target:{},edges:[],pos:0},n._parse(0,i.childNodes,void 0);const r=n.temp.target;let o,s,a;return n.temp.edges.forEach((function(t){o=t.targetID,s=r[o],null!=s&&(a={start:[t.srcStart,t.srcEnd],end:s,direction:"uni",label:t.label},this.addRel(a))}),n),delete n.temp,this},_parse:function(t,e,n){Array.from(e).forEach((function(t){if(1==t.nodeType){let i,r,o,s;if(t.hasAttribute("xml:id"))i=t.getAttribute("xml:id"),o=this.temp.pos,s=this.temp.pos;else if(t.hasAttribute("xlink:href"))if("other"==t.getAttribute("xlink:show")&&t.hasAttribute("data-action")&&"join"==t.getAttribute("data-action"))i=t.getAttribute("xlink:href").replace(/^#/,""),o=this.temp.pos,s=this.temp.pos;else{let n;r=t.getAttribute("xlink:href").replace(/^#/,""),t.hasAttribute("xlink:title")&&(n=this._clean(t.getAttribute("xlink:title")));var e={label:n,srcStart:this.temp.pos,targetID:r};n.match(/--$/)||n.match(/ROOT$/)||this.temp.edges.push(e)}if(t.hasChildNodes()&&this._parse(0,t.childNodes,n),void 0!==i){if(void 0!==this.temp.target[i]){const t=this.temp.target[i];s=this.temp.pos-1,t[0]=o<t[0]?o:t[0],t[1]=s>t[1]?s:t[1]}else s=this.temp.pos-1,this.temp.target[i]=[o,s];i=void 0}else void 0!==r&&(e.srcEnd=this.temp.pos-1,r=void 0)}else if(3==t.nodeType&&void 0!==t.nodeValue){const e=t.nodeValue.trim();void 0!==e&&e.length>0&&(this.addToken(e),this.temp.pos++)}}),this)},_clean:function(e){return e.replace(t,"$3")},size:function(){return this._tokens.length},_c:function(t){return e.createElementNS("http://www.w3.org/2000/svg",t)},_rect:function(t){if("tspan"==t.tagName&&!navigator.userAgent.match(/Edge/)){const n=e.createRange();n.selectNode(t);const i=n.getBoundingClientRect();return n.detach(),i}return t.getBoundingClientRect()},_tokenPoint:function(t){const e=this._rect(t);return e.left+e.width/2},_drawAnchor:function(t){const e=this._rect(this._tokenElements[t.first]),n=this._rect(this._tokenElements[t.last]),i=this._y+t.overlaps*this.anchorDiff-this.anchorStart,r=this._c("path");this._arcsElement.appendChild(r);const o="M "+(e.left-this.offsetLeft)+","+i+" L "+(n.right-this.offsetLeft)+","+i;return r.setAttribute("d",o),r.setAttribute("class","anchor"),t.element=r,t.y=i,r},_drawArc:function(t){const n=this;let i,r,o=this._y,s=this._y;void 0!==t.startAnchor?(i=n._tokenPoint(t.startAnchor.element),o=t.startAnchor.y):i=n._tokenPoint(n._tokenElements[t.first]),void 0!==t.endAnchor?(r=n._tokenPoint(t.endAnchor.element),s=t.endAnchor.y):r=n._tokenPoint(n._tokenElements[t.last]),i-=n.offsetLeft,r-=n.offsetLeft;var a=t.overlaps;i==r&&(i-=n.overlapDiff/3,r+=n.overlapDiff/3,a+=.5);const c=n._c("g");c.setAttribute("class","arc");const l=c.appendChild(n._c("path"));l.setAttribute("class","edge"),n._arcsElement.appendChild(c);let u=Math.abs(r-i)/2,h=n.arcDiff+a*n.overlapDiff+u/2;h=h<n.maxArc?h:n.maxArc;var d=Math.min(i,r);let f=s-h;const p="M "+i+","+o+" C "+i+","+f+" "+r+","+f+" "+r+","+s;if(l.setAttribute("d",p),void 0!==t.direction&&(l.setAttribute("marker-end","url(#arr)"),"bi"===t.direction&&l.setAttribute("marker-start","url(#arr)")),void 0===t.label)return c;let v=((o+f)/2+f)/2;const g=this._c("g");g.setAttribute("class","label"),n._labelsElement.appendChild(g),g.arcRef=c;const m=n;g.addEventListener("mouseenter",(function(){m.inFocus(this)}));const _=g.appendChild(n._c("text"));_.setAttribute("x",d+u),_.setAttribute("y",v+3),_.setAttribute("text-anchor","middle");const y=e.createTextNode(t.label);_.appendChild(y);const b=_.getBBox(),w=b.width,E=b.height,x=g.insertBefore(n._c("rect"),_),A=w+2*n.xPadding;x.setAttribute("x",d+u-A/2),x.setAttribute("ry",5),x.setAttribute("y",b.y-n.yPadding),x.setAttribute("width",A),x.setAttribute("height",E+2*n.yPadding)},element:function(){if(void 0!==this._el)return this._el;const t=this._c("svg");window.addEventListener("resize",function(){this.show()}.bind(this));const e=t.appendChild(this._c("defs")).appendChild(this._c("marker"));e.setAttribute("refX",9),e.setAttribute("id","arr"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("markerUnits","userSpaceOnUse");const n=this._c("path");return n.setAttribute("transform","scale(0.8)"),n.setAttribute("d","M 0,-5 0,5 10,0 Z"),e.appendChild(n),this._el=t,this._el},addRel:function(t){return this._arcs.push(t),this},addToken:function(t){return this._tokens.push(t),this},inFocus:function(t){let e;if(this._currentInFocus){if(this._currentInFocus===t)return;e=this._currentInFocus,e.classList.remove("infocus"),e.arcRef.classList.remove("infocus")}e=this._currentInFocus=t,this._labelsElement.appendChild(e),this._arcsElement.appendChild(e.arcRef),e.classList.add("infocus"),e.arcRef.classList.add("infocus")},_sortArcs:function(){let t={};const e=this._arcs.map((function(e){if(e.start instanceof Array)if(e.start[0]==e.start[1])e.start=e.start[0];else{const n=Math.ceil(Math.abs(e.start[1]-e.start[0])/2)+e.start[0];let i="#"+e.start[0]+"_"+e.start[1];e.start[0]>e.start[1]&&(i="#"+e.start[1]+"_"+e.start[0]);let r=t[i];void 0===r&&(r={first:e.start[0],last:e.start[1],length:e.start[1]-e.start[0]},t[i]=r),e.startAnchor=r,e.start=n}if(e.end instanceof Array)if(e.end[0]==e.end[1])e.end=e.end[0];else{const i=Math.abs(e.end[0]-e.end[1])+e.end[0];let r="#"+e.end[0]+"_"+e.end[1];e.end[0]>e.end[1]&&(r="#"+e.end[1]+"_"+e.end[0]);var n=t[r];void 0===n&&(n={first:e.end[0],last:e.end[1],length:e.end[1]-e.end[0]},t[r]=n),e.endAnchor=n,e.end=i}return e.first=e.start,e.last=e.end,e.start<e.end?e.length=e.end-e.start:e.length=e.start-e.end,e}));e.sort((function(t,e){return t.length<e.length?-1:1})),this._sortedArcs=n(e,!1),this._sortedAnchors=n(Object.values(t),!0)},center:function(){if(void 0===this._el)return;const t=this._el.parentNode,e=parseFloat(window.getComputedStyle(this._el).width),n=parseFloat(window.getComputedStyle(t).width);if(e>n){var i=(e-n)/2;t.scrollLeft=i}},show:function(){const t=this,n=this._el,i=this.maxArc;void 0!==n.getElementsByTagName("g")[0]&&(n.removeChild(n.getElementsByTagName("g")[0]),t._tokenElements=[]);const r=n.appendChild(t._c("g")),o=r.appendChild(t._c("text"));o.setAttribute("class","leaf"),o.setAttribute("text-anchor","start"),o.setAttribute("y",i),t._y=i-t.anchorStart;const s=o.appendChild(t._c("tspan"));s.appendChild(e.createTextNode(" ")),s.style.textAnchor="start",t._tokens.forEach((function(t){const n=o.appendChild(this._c("tspan"));n.appendChild(e.createTextNode(t)),n.setAttribute("text-anchor","middle"),this._tokenElements.push(n),n.setAttribute("dx",this.tokenSep)}),t),t.offsetLeft=t._rect(r).left;const a=r.appendChild(t._c("g"));t._arcsElement=a,a.classList.add("arcs");const c=r.appendChild(t._c("g"));t._labelsElement=c,c.classList.add("labels"),void 0===t._sortedArcs&&t._sortArcs(),t._sortedAnchors.forEach(e=>t._drawAnchor(e)),t._sortedArcs.forEach(e=>t._drawArc(e)),n.setAttribute("width",t._rect(o).width+20),n.setAttribute("height",i+20),n.setAttribute("class","relTree")}};function n(t,e){let n=[];return t.forEach((function(t){let i,r=0;for(let o=n.length-1;o>=0;o--){if(i=n[o],t.first<=i.first&&t.last>=i.last){r=i.overlaps+1;break}t.first<=i.first&&t.last>=i.first?(e||t.first!=i.first&&t.last!=i.first)&&(r=i.overlaps+(t.length==i.length?0:1)):t.first<=i.last&&t.last>=i.last&&(e||t.first!=i.last&&t.last!=i.last)&&(r=i.overlaps+(t.length==i.length?0:1))}t.overlaps=r,n.push(t),n.sort((function(t,e){e.overlaps,t.overlaps}))})),n}})),n("view/match/relations",["view","match/treehierarchy","match/treearc"],(function(t,e,n){const i=document,r=KorAP.Locale;return r.DOWNLOAD=r.DOWNLOAD||"Download",{create:function(e,n,i,r){return Object.create(t)._init(["relations"]).upgradeTo(this)._init(e,n,i,r)},_init:function(t,e,n,i){return this._match=t,this._foundry=e,this._layer=n,this._type=i,this},show:function(){if(this._show)return this._show;const t=i.createElement("div");t.classList.add("matchtree","loading");const e=t.addE("h6");return e.addE("span").addT(this._foundry),e.addE("span").addT(this._layer),this._tree=t.addE("div"),this._show=t},afterEmbed:function(){const t=this._foundry,e=this._layer,n=this._type,o=this,s=this._tree,a=this._show;this.getData(t,e,n,(function(t){a.classList.remove("loading"),null===t?s.addT("No data available."):(s.appendChild(t.element()),t.show(),"spans"===n&&o.actions().add(r.DOWNLOAD,{cls:["button-icon","download"]},(function(e){const n=t.downloadLink();i.body.appendChild(n),n.click(),i.body.removeChild(n)})),t.center())})),a.classList.remove("loading")},match:function(){return this._match},getData:function(t,i,r,o){try{KorAP.API.getMatchInfo(this._match,{spans:!0,foundry:t,layer:i},function(t){void 0!==t&&void 0!==t.snippet?o("spans"===r?e.create(t.snippet):"rels"===r?n.create(t.snippet):null):o(null)}.bind(this))}catch(t){KorAP.log(0,t),o(null)}},onClose:function(){this._match=void 0}}})),n("panel/match",["panel","match/treeitem","view/match/tokentable","view/match/meta","view/match/relations","buttongroup/menu"],(function(t,e,n,i,r,o){KorAP.API.getMatchInfo=KorAP.API.getMatchInfo||function(){return KorAP.log(0,"KorAP.API.getMatchInfo() not implemented"),{}};const s=KorAP.Locale;return s.SHOWANNO=s.SHOWANNO||"Tokens",s.SHOW_META=s.SHOW_META||"Metadata",s.ADDTREE=s.ADDTREE||"Relations",{create:function(e){return Object.create(t)._init(["matchinfo"]).upgradeTo(this)._init(e)},_init:function(t){this._match=t;const n=this.actions(),i=n.element().classList;if(i.remove("matchinfo"),i.add("button-matchinfo"),n.add(s.SHOW_META,{cls:["metatable"]},(function(t){this.addMeta()})),n.add(s.SHOWANNO,{cls:["info"]},(function(t){this.addTable()})),n.add(s.ADDTREE,{cls:["tree"]},(function(t){void 0===KorAP.TreeMenu&&(KorAP.TreeMenu=o.create([],e),KorAP.TreeMenu.element().setAttribute("id","treeMenu"));const n=KorAP.TreeMenu;n.panel(this),n.readItems(this._treeMenuList()),n.show(),n.button(this.button),n.focus()})),KorAP.Plugin){const t=KorAP.Plugin.buttonGroup("match");t&&t.forEach(t=>n.add.apply(n,t))}return this},addMeta:function(){const t=this;t._metaView&&t._metaView.shown()||(t._metaView=i.create(t._match),t.add(t._metaView))},addTable:function(){const t=this;t._tableView&&t._tableView.shown()||(t._tableView=n.create(t._match),t.add(t._tableView))},addTree:function(t,e,n){this.add(r.create(this._match,t,e,n))},_treeMenuList:function(){if(this._menuList)return this._menuList;let t=[];const e=this._match;e.getSpans().forEach(e=>t.push(e)),e.getRels().forEach(e=>t.push(e)),t=t.sort((function(t,e){return t.foundry<e.foundry?-1:t.foundry>e.foundry?1:t.layer<e.layer?-1:t.layer>e.layer?1:0}));let n=[];return t.forEach(t=>n.push([t.foundry+"/"+t.layer,t.foundry,t.layer,t.type])),this._menuList=n,n}}})),n("match",["buttongroup","panel/match","util"],(function(t,n){const i=KorAP.Locale;i.MINIMIZE=i.MINIMIZE||"Minimize";const r=["textSigle","matchID","available"];document;return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const n=this;if(n._el=null,n._initialized=!1,arguments.length<1||null==t)throw new Error("Missing parameters");let i;return t instanceof Node?(n._el=t,t._match=n,t.hasAttribute("data-text-sigle")?n.textSigle=t.getAttribute("data-text-sigle"):n.textSigle=t.getAttribute("data-corpus-id")+"/"+t.getAttribute("data-doc-id")+"/"+t.getAttribute("data-text-id"),n.matchID=t.getAttribute("data-match-id"),n.available=t.getAttribute("data-available-info").split(" ")):r.forEach((function(e){this[e]=void 0!==t[e]?t[e]:void 0}),n),n._avail={tokens:[],spans:[],rels:[]},n.available.forEach((function(t){try{i=e("match/infolayer").create(t),this._avail[i.type].push(i)}catch(t){return}}),n),n},getSpans:function(){return this._avail.spans},getTokens:function(){return this._avail.tokens},getRels:function(){return this._avail.rels},init:function(){const t=this;if(t._initialized)return t;const e=t._el;if(null==e)return;const i=e.querySelector("p.ref");return i?(t.panel=n.create(t),t._el.insertBefore(t.panel.element(),t._el.querySelector("p.ref")),i.insertBefore(t.panel.actions().element(),i.firstChild),t._initialized=!0,t):void 0},open:function(){const e=this._el;if(null==e)return!1;if(e.classList.contains("active"))return!1;e.classList.add("active");const n=t.create(["action","button-view"]),r=this;return n.add(i.MINIMIZE,{cls:["button-icon","minimize"]},(function(){r.minimize()})),e.appendChild(n.element()),null!=this.init()},toggle:function(){this._el.classList.contains("active")?this.minimize():this.open()},minimize:function(){this._el.classList.remove("active")},element:function(){return this._el}}})),n("hint/input",["util"],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){this._el=t,this._container=document.createElement("div"),this._container.setAttribute("id","hint"),this._mirror=document.createElement("div");const e=this._mirror;e.classList.add("hint","mirror"),e.addE("span"),e.appendChild(this._container),e.style.height="0px",document.getElementsByTagName("body")[0].appendChild(e);const n=this.reposition.bind(this);return window.addEventListener("resize",n),this._el.addEventListener("onfocus",n),this.reposition(),this},mirror:function(){return this._mirror},container:function(){return this._container},element:function(){return this._el},value:function(){return this._el.value},mirrorValue:function(){return this._mirror.firstChild.textContent},reset:function(){this._el.value=""},update:function(){return this._mirror.firstChild.textContent=this._split()[0],this._container.style.left=this._rightPos()+"px",this},insert:function(t){const e=this._split(),n=this._el;return n.value=e[0]+t+e[1],n.selectionStart=(e[0]+t).length,n.selectionEnd=n.selectionStart,this._mirror.firstChild.textContent=e[0]+t,this},moveto:function(t){const e=this._el;return e.selectionStart=t,e.selectionEnd=t,e.focus(),this.update()},reposition:function(){const t=this._el.getBoundingClientRect(),e=window.getComputedStyle(this._el,null),n=document.getElementsByTagName("body")[0].getBoundingClientRect(),i=this._mirror.style;i.left=parseInt(t.left)+"px",i.top=parseInt(t.bottom-n.top)+"px",i.width=e.getPropertyValue("width"),i.paddingLeft=e.getPropertyValue("padding-left"),i.marginLeft=e.getPropertyValue("margin-left"),i.borderLeftWidth=e.getPropertyValue("border-left-width"),i.borderLeftStyle=e.getPropertyValue("border-left-style"),i.fontSize=e.getPropertyValue("font-size"),i.fontFamily=e.getPropertyValue("font-family")},context:function(){return this._split()[0]},_rightPos:function(){const t=this._mirror.firstChild.getBoundingClientRect();return t.right-t.left},_split:function(t){const e=this._el,n=e.value;return 0===arguments.length&&(t=e.selectionStart),new Array(n.substring(0,t),n.substring(t,n.length))}}})),n("container/containeritem",{create:function(){return Object.create(this)},active:function(t){const e=this.element().classList;if(void 0===t)return e.contains("active");t?e.add("active"):e.remove("active")},element:function(){if(void 0!==this._el)return this._el;const t=document.createElement("li");return void 0!==this.onclick&&(t.onclick=this.onclick.bind(this)),this._el=t},content:function(t){var e;return 1===arguments.length?e=t:(void 0===this.defaultTextValue&&(this.defaultTextValue=""),e=this.defaultTextValue),void 0===this._content?(this._content=document.createTextNode(e),this.element().appendChild(this._content)):this._content.nodeValue=e,this._content},isSelectable:function(){return!0},add:function(t){},clear:function(){},onclick:function(t){},chop:function(){},further:function(t){},menu:function(){return this._menu}}),n("container/container",["container/containeritem"],(function(t){return{create:function(t,e){var n=Object.create(this);return n._init(t,e),n},_init:function(e,n){void 0!==n&&void 0!==n.containerItemClass?this._containerItemClass=n.containerItemClass:this._containerItemClass=t;var i=document.createElement("ul");if(i.style.outline=0,i.setAttribute("tabindex",0),i.classList.add("menu","container"),this._el=i,this._cItemPrefix=void 0,this.items=new Array,void 0!==e)for(let t of e)this.addItem(t);this.position=void 0,this._prefixPosition=void 0},addItem:function(t){var e=this._containerItemClass.create().upgradeTo(t);return e._menu=this._menu,this.items.push(e),void 0!==this._cItemPrefix&&(this.items.splice(this.items.indexOf(this._cItemPrefix),1),this.items.push(this._cItemPrefix)),this._el.appendChild(e.element()),e.content(),e},addMenu:function(t){this._menu=t,void 0!==this._cItemPrefix&&(this._menu._prefix=this._cItemPrefix);for(let e of this.items)e._menu=t},addPrefix:function(t){t.isSelectable=function(){return this.isSet()},this._prefixPosition=this.items.length,t.content=function(t){};var e=this.addItem(t);this._cItemPrefix=e,e._el.onclick=e.onclick.bind(e),void 0!==this._menu&&(this._menu._prefix=e)},removeItem:function(t){t.active()&&this._menu.next(),t._menu=void 0,this._el.removeChild(t.element()),this.items.splice(this.items.indexOf(t),1)},removeItemByIndex:function(t){this.removeItem(this.items[t])},removeItemByIndex:function(t){t<0||t>=this.length()?KorAP.log(0,"Invalid index in containers removeItemByIndex: "+t,"container.js"):this.removeItem(this.items[t])},exit:function(){void 0!==this.position&&(this.item().active(!1),this.position=void 0)},element:function(){return this._el},destroy:function(){for(let t of this.items)delete t._menu},active:function(){return void 0!==this.position},item:function(t){return void 0===t?this.items[this.position]:this.items[t]},makeActive:function(){void 0===this.position&&(this._cItemPrefix.isSelectable()?(this.position=this._prefixPosition,this.item().active(!0)):this.liveLength()>0&&(this.position=0,this._cItemPrefix.active(!1),this.item().active(!0)))},next:function(){if(void 0!==this.position?(this.item().active(!1),this.position++):this.position=0,this.position>=this.length())return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position++,this.position>=this.length())return this.position=void 0,!0;return this.item().active(!0),!1},prev:function(){if(void 0!==this.position?(this.item().active(!1),this.position=this.position-1):this.position=this.items.length-1,this.position<0)return this.position=void 0,!0;for(;!this.item().isSelectable();)if(this.position--,this.position<0)return this.position=void 0,!0;return this.item().active(!0),!1},further:function(){const t=this.item();void 0!==t.further&&t.further.bind(t).apply()},enter:function(t){this.item().onclick(t)},chop:function(){for(let t of this.items)t.chop()},add:function(t){for(let e of this.items)e.add(t)},length:function(){return this.items.length},liveLength:function(){var t=0;for(let e of this.items)e.isSelectable()&&t++;return t}}})),n("containermenu",["menu","container/container","util"],(function(t,e){return{create:function(n,i,r){const o=t.create(n,i).upgradeTo(this)._init(n,i);return o._el.classList.add("containermenu"),void 0!==i&&void 0!==i.containerClass?o._container=i.containerClass.create(r,i):o._container=e.create(r,i),o.container().addMenu(o),o._el.appendChild(o.container().element()),o._el.removeChild(o._prefix.element()),o.container().addPrefix(o._prefix),o},destroy:function(){const t=this;null!=t._el&&delete t._el.menu,t._items.forEach((function(t){delete t._menu})),delete t._prefix._menu,delete t._lengthField._menu,delete t._slider._menu,t.container().destroy(),delete t.container()._menu},_keydown:function(t){const e=this;switch(h(t)){case 27:t.halt(),e.hide();break;case 38:t.halt(),e.prev();break;case 33:t.halt(),e.pageUp();break;case 40:t.halt(),e.next();break;case 34:t.halt(),e.pageDown();break;case 39:if(e.container().active()){e.container().further(),t.halt();break}const n=e.liveItem(e.position);void 0!==n.further&&n.further.bind(n).apply(),t.halt();break;case 13:e.container().active()?e.container().enter(t):e.liveItem(e.position).onclick(t),t.halt();break;case 8:e.container().chop(),e.show(),t.halt()}},_keypress:function(t){0!==t.charCode&&(t.halt(),this.container().add(String.fromCharCode(h(t))),this.show())},show:function(t){const e=this;if(e._unmark(),e.removeItems(),e.container().exit(),!e._initList())return e._prefix.active(!0),e.container().makeActive(),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),!0;let n=0;if(1===arguments.length){if(t<0?t=0:t>=e.liveLength()&&(t=e.liveLength()-1),t>=e._limit){n=t;const i=e.liveLength()-e._limit;n>i&&(n=i)}e.position=t}else e._firstActive?e.position=0:e.position=-1;return e.offset=n,e._showItems(n),-1!==e.position&&e.liveItem(e.position).active(!0),e._prefix.active(!1),e._el.classList.add("visible"),e.container()._el.classList.add("visible"),e._boundary(!0),!0},hide:function(){this.dontHide||(this.removeItems(),this._prefix.clear(),this.onHide(),this._el.classList.remove("visible"),this.container()._el.classList.remove("visible"))},next:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.next()&&e.next())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position++;let i=t.liveItem(t.position);void 0===i?(t.position=-1,0!==n?t.container().next()&&(t.position=0,t._showItems(0),i=t.liveItem(0)):(t.position=0,t._showItems(0),i=t.liveItem(0))):t.position>=t.limit()+t.offset?t.screen(t.position-t.limit()+1):t.position<=t.offset&&t.screen(t.position),void 0!==i&&i.active(!0)},prev:function(){const t=this;const e=t.container(),n=e.liveLength();if(0===t.liveLength()){if(0===n)return;return void(e.prev()&&e.prev())}e.active()||-1===t.position||t.liveItem(t.position).active(!1),e.active()||t.position--;let i=t.liveItem(t.position);if(void 0===i){t.position=-1;let e=t.liveLength()-t.limit();e=e<0?0:e,0!==n?t.container().prev()?(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e)):t.offset=e:(t.position=t.liveLength()-1,i=t.liveItem(t.position),t._showItems(e))}else t.position<t.offset?t.screen(t.position):t.position>=t.limit()+t.offset&&t.screen(t.position-t.limit()+2);void 0!==i&&i.active(!0)},upgradeTo:function(t){for(var e in t)this[e]=t[e];return this},container:function(){return this._container}}})),n("hint/item",["menu/item","util"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},_init:function(t){if(void 0===t[0]||void 0===t[1])throw new Error("Missing parameters");return this._name=t[0],this._action=t[1],this._lcField=" "+this._name.toLowerCase(),t.length>2&&(this._desc=t[2],this._lcField+=" "+this._desc.toLowerCase()),this},content:function(t){return 1===arguments.length&&(this._content=t),this._content},onclick:function(t){var e=this.menu();e.prefix("");var n=e.hint();n.inputField().insert(this._action).update(),t.halt(),n.show(!0)},name:function(){return this._name},action:function(){return this._action},desc:function(){return this._desc},element:function(){if(void 0!==this._el)return this._el;var t=document.createElement("li");void 0!==this.onclick&&(t.onclick=this.onclick.bind(this));var e=document.createElement("span");if(e.addT(this._name),t.appendChild(e),void 0!==this._desc){var n=document.createElement("span");n.classList.add("desc"),n.addT(this._desc),t.appendChild(n)}return this._el=t}}})),n("hint/prefix",["menu/prefix"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){const e=this.menu(),n=this.value(),i=e.hint();i.inputField().insert(n),i.active(null),e.hide(),t.halt()}}})),n("hint/lengthField",["menu/lengthField","util"],(function(t){return{create:function(){return Object.create(t).upgradeTo(this)._init()},add:function(t){this._el.addE("span").addT(t[0]+"--");var e=this._el.addE("span");e.classList.add("desc"),e.addT(t[2]+"--"),this._el.appendChild(e)}}})),n("hint/menu",["containermenu","hint/item","hint/prefix","hint/lengthField"],(function(t,e,n,i){return{create:function(r,o,s){const a=t.create(s,{itemClass:e,prefixClass:n,lengthFieldClass:i}).upgradeTo(this);return a._context=o,a._el.classList.add("hint"),a._hint=r,a._firstActive=!0,a.element().addEventListener("blur",(function(t){this.menu.hide()})),a.onHide=function(){const t=this._hint;t._inputField.element().focus(),null!==t.active()&&(t._alert.active&&t._unshowAlert(),t.active(null))},a},hint:function(){return this._hint}}})),n("hint/contextanalyzer",{create:function(t){return Object.create(this)._init(t)},_init:function(t){try{this._regex=new RegExp(t)}catch(t){return void KorAP.log(0,t)}return this},test:function(t){if(this._regex.exec(t))return RegExp.$1}}),n("hint/alert",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._type="alert",e.active=!1,e._el=document.createElement("div"),e._el.style.display="none",e._el.classList.add("alert","hint"),e},show:function(t){this.active=!0;const e=this._el;e.textContent=t,e.style.display="block"},hide:function(){return!!this.active&&(this._el.style.display="none",this.active=!1,!0)},element:function(){return this._el}}})),n("hint",["hint/input","hint/menu","hint/contextanalyzer","hint/alert","util"],(function(t,e,n,i){return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(e=e||{},this._menuCollection={},this._alert=i.create(),this._active=null,!KorAP.annotationHelper)return void console.log("No annotationhelper defined");KorAP.context=KorAP.context||"(?:^|[^-_a-zA-Z0-9])((?:[-_a-zA-Z0-9]+?)/(?:(?:[-_a-zA-Z0-9]+?)=(?:(?:[^:=/ ]+?):|(?:[^-=/ ]+?)-)?)?)$";const r=e.inputField||document.getElementById("q-field");if(!r)return null;this._inputField=t.create(r);const o=this,s=this._inputField.container();s.appendChild(this._alert.element()),s.addEventListener("click",(function(t){this.classList.contains("active")||o.show(!1)}));const a=this._inputField.element();a.addEventListener("keyup",this.update.bind(this)),a.addEventListener("click",this.update.bind(this));return a.addEventListener("keydown",function(t){40===h(t)&&(this.show(!1),t.halt())}.bind(this),!1),a.addEventListener("touchstart",this._touch.bind(this),!1),a.addEventListener("touchend",this._touch.bind(this),!1),a.addEventListener("touchmove",this._touch.bind(this),!1),this._analyzer=n.create(e.context||KorAP.context),this},inputField:function(){return this._inputField},alert:function(t,e){const n=this;return 0===arguments.length?n._alert:!n._alert.active&&(n._inputField.moveto(t),n._alert.show(e),n.active(n._alert),!0)},update:function(){this._inputField.update(),this._alert.hide()&&this.active(null)},menu:function(t){if(void 0===this._menuCollection[t]){if(void 0===KorAP.annotationHelper[t])return;this._menuCollection[t]=e.create(this,t,KorAP.annotationHelper[t])}return this._menuCollection[t]},contextMenu:function(t){const e=t?void 0:this.menu("-");let n=this._inputField.context();return void 0===n||0===n.length?e:(n=this._analyzer.test(n),void 0===n||0==n.length?e:this.menu(n)||e)},active:function(t){if(1===arguments.length){const e=this._inputField.container();null!==t?(e.classList.add("active"),this._active=t):(e.classList.remove("active"),this._active=null)}return this._active},show:function(t){let e;if(this._unshow(),e=this.contextMenu(t)){this.active(e);let t=e.element();this._active.element().blur(),this._inputField.container().appendChild(t),e.show(),e.focus()}else this._inputField.element().focus()},getContext:function(){},unshow:function(){this._unshow(),this._inputField.element().focus()},_touch:function(t){"touchstart"===t.type?this._lastTouch=t.touches[0].clientY:"touchend"===t.type?this._lastTouch=void 0:"touchmove"==t.type&&(this._lastTouch+10<t.touches[0].clientY&&(this.show(),this._lastTouch=void 0),t.halt())},_unshow:function(){null!==this.active()&&(this._alert.active?this._unshowAlert():this._inputField.container().removeChild(this._active.element()),this.active(null))},_unshowAlert:function(){this._alert.hide(),this.active(null)}}})),n("session",{create:function(t="korap"){const e=Object.create(this);return e._name=t.toLowerCase(),e._hash={},e._parse(),e},get:function(t){return this._hash[t.toLowerCase()]},set:function(t,e){this._hash[t]=e,this._store()},clear:function(){this._hash={},document.cookie=this._name+"=; expires=-1"},_store:function(){document.cookie=this.toString()},toString:function(){return this._name+"="+encodeURIComponent(JSON.stringify(this._hash))+";SameSite=Lax"},_parse:function(){document.cookie.split(";").forEach((function(t){const e=t.split("=");if(e[0].trim().toLowerCase()!==this._name);else{if(1===e.length||0===e[1].length)return;this._hash=JSON.parse(decodeURIComponent(e[1]))}}),this)}}),n("tutorial",["session","buttongroup","util"],(function(t,e){const n=KorAP.Locale;n.CLOSE=n.CLOSE||"Close";const i=document;return{create:function(t,e){return t?Object.create(this)._init(t,e):null},_init:function(e,n){const r=this;if(r._session=void 0===n?t.create():n,e){if(r._show=e,r.start=e.getAttribute("href"),!r.start)return null;e.removeAttribute("href"),e.onclick=function(){this.show()}.bind(r);const t=i.createElement("div");t.setAttribute("id","tutorial"),t.style.display="none",i.getElementsByTagName("body")[0].appendChild(t),r._iframe=null,r._el=t,r._ql=i.getElementById("ql-field"),r._q=i.getElementById("q-field"),r._cutoff=i.getElementById("q-cutoff-field")}return r},useQuery:function(t){const e=this,n=t.getAttribute("data-query"),i=t.getAttribute("data-query-language"),r=t.getAttribute("data-query-cutoff");if(0!==r&&"0"!==r&&"off"!==r&&null!==r&&e._cuttoff&&(e._cutoff.checked=!0),KorAP.QLmenu)KorAP.QLmenu.selectValue(i);else if(e._ql){let t=Array.from(e._ql.options).find(t=>t.value===i);t&&(t.selected=!0)}e._q&&(e._q.value=n),e.setPage(t),e.hide()},initQueries:function(t){let e=t.querySelectorAll("pre.query.tutorial:not(.unsupported)");const n=this;for(var i=0;i<e.length;i++)e[i].onclick=function(t){n.useQuery(this,t)}},initDocLinks:function(t){const e=this;Array.from(t.getElementsByClassName("doc-link")).forEach(t=>t.onclick=function(){return e.setPage(this.getAttribute("href")),!0})},show:function(){const t=this,r=t._el;if("block"!==r.style.display){if(null===t._iframe){t._iframe=i.createElement("iframe"),t._iframe.setAttribute("src",(t.getPage()||t.start)+"?embedded=true");const o=e.create(["action","button-view"]);o.add(n.CLOSE,{cls:["button-icon","close"]},(function(){r.style.display="none"})),r.appendChild(o.element()),r.appendChild(t._iframe)}r.style.display="block"}},hide:function(){this._el.style.display="none"},setPage:function(t){let e=t;if("string"!=typeof e){const n=null!==this._iframe?window.frames[0].location:window.location;e=n.pathname+n.search;for(let n=1;n<5;n++){if(("SECTION"===t.nodeName||"PRE"===t.nodeName)&&t.hasAttribute("id")){e+="#"+t.getAttribute("id");break}if(null===(t=t.parentNode))break}}this._session.set("tutpage",e)},getPage:function(){return this._session.get("tutpage")}}})),
+/**
+ * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/domReady for details
+ */
+n("lib/domReady",[],(function(){"use strict";var t,e,n,i="undefined"!=typeof window&&window.document,r=!i,o=i?document:null,s=[];function a(){var t=s;r&&t.length&&(s=[],function(t){var e;for(e=0;e<t.length;e+=1)t[e](o)}(t))}function c(){r||(r=!0,n&&clearInterval(n),a())}if(i){if(document.addEventListener)document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1);else if(window.attachEvent){window.attachEvent("onload",c),e=document.createElement("div");try{t=null===window.frameElement}catch(t){}e.doScroll&&t&&window.external&&(n=setInterval((function(){try{e.doScroll(),c()}catch(t){}}),30))}"complete"===document.readyState&&c()}function l(t){return r?t(o):s.push(t),l}return l.version="2.0.1",l.load=function(t,e,n,i){i.isBuild?n(null):l(n)},l})),n("vc/array",[],(function(){return[["author","text"],["corpusAuthor","text"],["corpusSigle","string"],["corpusSubTitle","text"],["corpusTitle","text"],["creationDate","date"],["docAuthor","text"],["docSigle","string"],["docSubTitle","text"],["docTitle","text"],["foundries","string"],["keywords","string"],["language","string"],["license","string"],["pubDate","date"],["pubPlace","string"],["subTitle","text"],["textClass","string"],["textColumn","string"],["textDomain","string"],["textSigle","string"],["textType","string"],["textTypeArt","string"],["textTypeRef","string"],["title","text"]]})),function(t,e){"use strict";var i,r=t.document;i=function(){var e,n,i,o,s,a,c,l,u,h,d,f,p={},v={},g=!1,m=13,_=27,y=32,b=[];return v={buttons:{holder:'<nav class="alertify-buttons">{{buttons}}</nav>',submit:'<button type="submit" class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',ok:'<button class="alertify-button alertify-button-ok" id="alertify-ok">{{ok}}</button>',cancel:'<button class="alertify-button alertify-button-cancel" id="alertify-cancel">{{cancel}}</button>'},input:'<div class="alertify-text-wrapper"><input type="text" class="alertify-text" id="alertify-text"></div>',message:'<p class="alertify-message">{{message}}</p>',log:'<article class="alertify-log{{class}}">{{message}}</article>'},f=function(){var t,e,n=!1,i=r.createElement("fakeelement"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(t in o)if(void 0!==i.style[t]){e=o[t],n=!0;break}return{type:e,supported:n}},e=function(t){return r.getElementById(t)},{alert:function(t,e,n){return p.dialog(t,"alert",e,"",n),this},confirm:function(t,e,n){return p.dialog(t,"confirm",e,"",n),this},extend:(p={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:void 0,addListeners:function(t){var e,a,c,l,u,h=void 0!==i,f=void 0!==n,p=void 0!==d,v="",g=this;e=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),void 0!==d&&(v=d.value),"function"==typeof t&&(void 0!==d?t(!0,v):t(!0)),!1},a=function(e){return void 0!==e.preventDefault&&e.preventDefault(),c(e),"function"==typeof t&&t(!1),!1},c=function(t){g.hide(),g.unbind(r.body,"keyup",l),g.unbind(o,"focus",u),h&&g.unbind(i,"click",e),f&&g.unbind(n,"click",a)},l=function(t){var n=t.keyCode;(n===y&&!p||p&&n===m)&&e(t),n===_&&f&&a(t)},u=function(t){p?d.focus():!f||g.buttonReverse?i.focus():n.focus()},this.bind(o,"focus",u),this.bind(s,"focus",u),h&&this.bind(i,"click",e),f&&this.bind(n,"click",a),this.bind(r.body,"keyup",l),this.transition.supported||this.setFocus()},bind:function(t,e,n){"function"==typeof t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},handleErrors:function(){if(void 0!==t.onerror){var e=this;return t.onerror=function(t,n,i){e.error("["+t+" on line "+i+" of "+n+"]",0)},!0}return!1},appendButtons:function(t,e){return this.buttonReverse?e+t:t+e},build:function(t){var e="",n=t.type,i=t.message,r=t.cssClass||"";switch(e+='<div class="alertify-dialog">',e+='<a id="alertify-resetFocusBack" class="alertify-resetFocus" href="#">Reset Focus</a>',"none"===p.buttonFocus&&(e+='<a href="#" id="alertify-noneFocus" class="alertify-hidden"></a>'),"prompt"===n&&(e+='<div id="alertify-form">'),e+='<article class="alertify-inner">',e+=v.message.replace("{{message}}",i),"prompt"===n&&(e+=v.input),e+=v.buttons.holder,e+="</article>","prompt"===n&&(e+="</div>"),e+='<a id="alertify-resetFocus" class="alertify-resetFocus" href="#">Reset Focus</a>',e+="</div>",n){case"confirm":e=(e=e.replace("{{buttons}}",this.appendButtons(v.buttons.cancel,v.buttons.ok))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":e=(e=e.replace("{{buttons}}",this.appendButtons(v.buttons.cancel,v.buttons.submit))).replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":e=(e=e.replace("{{buttons}}",v.buttons.ok)).replace("{{ok}}",this.labels.ok)}return u.className="alertify alertify-"+n+" "+r,l.className="alertify-cover",e},close:function(t,e){var n,i,r=e&&!isNaN(e)?+e:this.delay,o=this;this.bind(t,"click",(function(){n(t)})),i=function(t){t.stopPropagation(),o.unbind(this,o.transition.type,i),h.removeChild(this),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")},n=function(t){void 0!==t&&t.parentNode===h&&(o.transition.supported?(o.bind(t,o.transition.type,i),t.className+=" alertify-log-hide"):(h.removeChild(t),h.hasChildNodes()||(h.className+=" alertify-logs-hidden")))},0!==e&&setTimeout((function(){n(t)}),r)},dialog:function(t,e,n,i,o){c=r.activeElement;var s=function(){h&&null!==h.scrollTop&&l&&null!==l.scrollTop||s()};if("string"!=typeof t)throw new Error("message must be a string");if("string"!=typeof e)throw new Error("type must be a string");if(void 0!==n&&"function"!=typeof n)throw new Error("fn must be a function");return this.init(),s(),b.push({type:e,message:t,callback:n,placeholder:i,cssClass:o}),g||this.setup(),this},extend:function(t){if("string"!=typeof t)throw new Error("extend method must have exactly one paramter");return function(e,n){return this.log(e,t,n),this}},hide:function(){var t,e=this;b.splice(0,1),b.length>0?this.setup(!0):(g=!1,t=function(n){n.stopPropagation(),e.unbind(u,e.transition.type,t)},this.transition.supported?(this.bind(u,this.transition.type,t),u.className="alertify alertify-hide alertify-hidden"):u.className="alertify alertify-hide alertify-hidden alertify-isHidden",l.className="alertify-cover alertify-cover-hidden",c.focus())},init:function(){r.createElement("nav"),r.createElement("article"),r.createElement("section"),null==e("alertify-cover")&&((l=r.createElement("div")).setAttribute("id","alertify-cover"),l.className="alertify-cover alertify-cover-hidden",r.body.appendChild(l)),null==e("alertify")&&(g=!1,b=[],(u=r.createElement("section")).setAttribute("id","alertify"),u.className="alertify alertify-hidden",r.body.appendChild(u)),null==e("alertify-logs")&&((h=r.createElement("section")).setAttribute("id","alertify-logs"),h.className="alertify-logs alertify-logs-hidden",r.body.appendChild(h)),r.body.setAttribute("tabindex","0"),this.transition=f()},log:function(t,e,n){var i=function(){h&&null!==h.scrollTop||i()};return this.init(),i(),h.className="alertify-logs",this.notify(t,e,n),this},notify:function(t,e,n){var i=r.createElement("article");i.className="alertify-log"+("string"==typeof e&&""!==e?" alertify-log-"+e:""),i.innerHTML=t,h.appendChild(i),setTimeout((function(){i.className=i.className+" alertify-log-show"}),50),this.close(i,n)},set:function(t){var e;if("object"!=typeof t&&t instanceof Array)throw new Error("args must be an object");for(e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},setFocus:function(){d?(d.focus(),d.select()):a.focus()},setup:function(t){var r,c=b[0],l=this;g=!0,r=function(t){t.stopPropagation(),l.setFocus(),l.unbind(u,l.transition.type,r)},this.transition.supported&&!t&&this.bind(u,this.transition.type,r),u.innerHTML=this.build(c),o=e("alertify-resetFocus"),s=e("alertify-resetFocusBack"),i=e("alertify-ok")||void 0,n=e("alertify-cancel")||void 0,a="cancel"===p.buttonFocus?n:"none"===p.buttonFocus?e("alertify-noneFocus"):i,d=e("alertify-text")||void 0,e("alertify-form")||void 0,"string"==typeof c.placeholder&&""!==c.placeholder&&(d.value=c.placeholder),t&&this.setFocus(),this.addListeners(c.callback)},unbind:function(t,e,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)}}).extend,init:p.init,log:function(t,e,n){return p.log(t,e,n),this},prompt:function(t,e,n,i){return p.dialog(t,"prompt",e,n,i),this},success:function(t,e){return p.log(t,"success",e),this},error:function(t,e){return p.log(t,"error",e),this},set:function(t){p.set(t)},labels:p.labels,debug:p.handleErrors}},"function"==typeof n?n("lib/alertify",[],(function(){return new i})):void 0===t.alertify&&(t.alertify=new i)}(this),n("selectMenu/item",["menu/item"],(function(t){return{create:function(e){return Object.create(t).upgradeTo(this)._init(e)},onclick:function(t){var e=this.menu();e.hide(),e.select(this._index),e.showTitle(),t.halt()},title:function(){return this.content().textContent}}})),n("selectMenu",["menu","selectMenu/item","util"],(function(t,e){return{create:function(n){const i=n.getElementsByTagName("select")[0];if(null===i)return;const r=[];Array.from(i.getElementsByTagName("option")).forEach((function(t){const e=[t.textContent,t.getAttribute("value")];t.hasAttribute("desc")&&e.push(t.getAttribute("desc")),r.push(e)}));const o=Object.create(t).upgradeTo(this)._init(r,{itemClass:e});return o._container=n,o._select=i,i.style.display="none",o._title=o._container.addE("span"),o._title.addT(""),o._container.appendChild(o.element()),o._container.addEventListener("click",o.showSelected.bind(o)),o._items.forEach((t,e)=>t._index=e),o.element().addEventListener("blur",(function(t){this.menu.hide(),this.menu.showTitle()})),i.addEventListener("change",function(t){this.showTitle()}.bind(o)),o.showTitle(),o},select:function(t){const e=this;return arguments.length>0&&(e._selected=t,e._select.selectedIndex=t),e._selected||e._select.selectedIndex||0},selectValue:function(t){const e=this,n=e._select.options;for(let i=0;i<n.length;i++)if(n[i].value==t){e.hide(),e.select(i),e.showTitle();break}return e},showSelected:function(){const t=this;t._title.style.display="none",t.show(t._selected=t._select.selectedIndex),t.focus()},showTitle:function(){const t=this;t.select();t._title.textContent=t.item(t.select()).title(),t._title.style.display="inline"}}})),function(t){"undefined"!=typeof exports?t(exports):(window.hljs=t({}),"function"==typeof n&&n.amd&&n("lib/highlight/highlight.pack",[],(function(){return window.hljs})))}((function(t){function e(t){return t.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function n(t){return t.nodeName.toLowerCase()}function i(t,e){var n=t&&t.exec(e);return n&&0==n.index}function r(t,e){var n,i={};for(n in t)i[n]=t[n];if(e)for(n in e)i[n]=e[n];return i}function o(t){var e=[];return function t(i,r){for(var o=i.firstChild;o;o=o.nextSibling)3==o.nodeType?r+=o.nodeValue.length:1==o.nodeType&&(e.push({event:"start",offset:r,node:o}),r=t(o,r),n(o).match(/br|hr|img|input/)||e.push({event:"stop",offset:r,node:o}));return r}(t,0),e}function s(t,i,r){function o(){return t.length&&i.length?t[0].offset!=i[0].offset?t[0].offset<i[0].offset?t:i:"start"==i[0].event?t:i:t.length?t:i}function s(t){u+="<"+n(t)+Array.prototype.map.call(t.attributes,(function(t){return" "+t.nodeName+'="'+e(t.value)+'"'})).join("")+">"}function a(t){u+="</"+n(t)+">"}function c(t){("start"==t.event?s:a)(t.node)}for(var l=0,u="",h=[];t.length||i.length;){var d=o();if(u+=e(r.substr(l,d[0].offset-l)),l=d[0].offset,d==t){h.reverse().forEach(a);do{c(d.splice(0,1)[0]),d=o()}while(d==t&&d.length&&d[0].offset==l);h.reverse().forEach(s)}else"start"==d[0].event?h.push(d[0].node):h.pop(),c(d.splice(0,1)[0])}return u+e(r.substr(l))}function a(t){function e(t){return t&&t.source||t}function n(n,i){return new RegExp(e(n),"m"+(t.cI?"i":"")+(i?"g":""))}!function i(o,s){if(!o.compiled){if(o.compiled=!0,o.k=o.k||o.bK,o.k){var a={},c=function(e,n){t.cI&&(n=n.toLowerCase()),n.split(" ").forEach((function(t){var n=t.split("|");a[n[0]]=[e,n[1]?Number(n[1]):1]}))};"string"==typeof o.k?c("keyword",o.k):Object.keys(o.k).forEach((function(t){c(t,o.k[t])})),o.k=a}o.lR=n(o.l||/\b\w+\b/,!0),s&&(o.bK&&(o.b="\\b("+o.bK.split(" ").join("|")+")\\b"),o.b||(o.b=/\B|\b/),o.bR=n(o.b),o.e||o.eW||(o.e=/\B|\b/),o.e&&(o.eR=n(o.e)),o.tE=e(o.e)||"",o.eW&&s.tE&&(o.tE+=(o.e?"|":"")+s.tE)),o.i&&(o.iR=n(o.i)),void 0===o.r&&(o.r=1),o.c||(o.c=[]);var l=[];o.c.forEach((function(t){t.v?t.v.forEach((function(e){l.push(r(t,e))})):l.push("self"==t?o:t)})),o.c=l,o.c.forEach((function(t){i(t,o)})),o.starts&&i(o.starts,s);var u=o.c.map((function(t){return t.bK?"\\.?("+t.b+")\\.?":t.b})).concat([o.tE,o.i]).map(e).filter(Boolean);o.t=u.length?n(u.join("|"),!0):{exec:function(){return null}}}}(t)}function c(t,n,r,o){function s(t,e){for(var n=0;n<e.c.length;n++)if(i(e.c[n].bR,t))return e.c[n]}function u(t,e){if(i(t.eR,e)){for(;t.endsParent&&t.parent;)t=t.parent;return t}return t.eW?u(t.parent,e):void 0}function h(t,e){return!r&&i(e.iR,t)}function d(t,e){var n=b.cI?e[0].toLowerCase():e[0];return t.k.hasOwnProperty(n)&&t.k[n]}function g(t,e,n,i){var r='<span class="'+(i?"":p.classPrefix);return(r+=t+'">')+e+(n?"":"</span>")}function m(){return void 0!==E.sL?function(){if(E.sL&&!v[E.sL])return e(k);var t=E.sL?c(E.sL,k,!0,x[E.sL]):l(k);return E.r>0&&(C+=t.r),"continuous"==E.subLanguageMode&&(x[E.sL]=t.top),g(t.language,t.value,!1,!0)}():function(){if(!E.k)return e(k);var t="",n=0;E.lR.lastIndex=0;for(var i=E.lR.exec(k);i;){t+=e(k.substr(n,i.index-n));var r=d(E,i);r?(C+=r[1],t+=g(r[0],e(i[0]))):t+=e(i[0]),n=E.lR.lastIndex,i=E.lR.exec(k)}return t+e(k.substr(n))}()}function _(t,n){var i=t.cN?g(t.cN,"",!0):"";t.rB?(A+=i,k=""):t.eB?(A+=e(n)+i,k=""):(A+=i,k=n),E=Object.create(t,{parent:{value:E}})}function y(t,n){if(k+=t,void 0===n)return A+=m(),0;var i=s(n,E);if(i)return A+=m(),_(i,n),i.rB?0:n.length;var r=u(E,n);if(r){var o=E;o.rE||o.eE||(k+=n),A+=m();do{E.cN&&(A+="</span>"),C+=E.r,E=E.parent}while(E!=r.parent);return o.eE&&(A+=e(n)),k="",r.starts&&_(r.starts,""),o.rE?0:n.length}if(h(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return k+=n,n.length||1}var b=f(t);if(!b)throw new Error('Unknown language: "'+t+'"');a(b);var w,E=o||b,x={},A="";for(w=E;w!=b;w=w.parent)w.cN&&(A=g(w.cN,"",!0)+A);var k="",C=0;try{for(var T,P,L=0;E.t.lastIndex=L,T=E.t.exec(n);)P=y(n.substr(L,T.index-L),T[0]),L=T.index+P;for(y(n.substr(L)),w=E;w.parent;w=w.parent)w.cN&&(A+="</span>");return{r:C,value:A,language:t,top:E}}catch(t){if(-1!=t.message.indexOf("Illegal"))return{r:0,value:e(n)};throw t}}function l(t,n){n=n||p.languages||Object.keys(v);var i={r:0,value:e(t)},r=i;return n.forEach((function(e){if(f(e)){var n=c(e,t,!1);n.language=e,n.r>r.r&&(r=n),n.r>i.r&&(r=i,i=n)}})),r.language&&(i.second_best=r),i}function u(t){return p.tabReplace&&(t=t.replace(/^((<[^>]+>|\t)+)/gm,(function(t,e){return e.replace(/\t/g,p.tabReplace)}))),p.useBR&&(t=t.replace(/\n/g,"<br>")),t}function h(t){var e=function(t){var e=(t.className+" "+(t.parentNode?t.parentNode.className:"")).split(/\s+/);return(e=e.map((function(t){return t.replace(/^lang(uage)?-/,"")}))).filter((function(t){return f(t)||/no(-?)highlight|plain|text/.test(t)}))[0]}(t);if(!/no(-?)highlight|plain|text/.test(e)){var n;p.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=t.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=t;var i=n.textContent,r=e?c(e,i,!0):l(i),a=o(n);if(a.length){var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");h.innerHTML=r.value,r.value=s(a,o(h),i)}r.value=u(r.value),t.innerHTML=r.value,t.className=function(t,e,n){var i=e?g[e]:n,r=[t.trim()];return t.match(/\bhljs\b/)||r.push("hljs"),-1===t.indexOf(i)&&r.push(i),r.join(" ").trim()}(t.className,e,r.language),t.result={language:r.language,re:r.r},r.second_best&&(t.second_best={language:r.second_best.language,re:r.second_best.r})}}function d(){if(!d.called){d.called=!0;var t=document.querySelectorAll("pre code");Array.prototype.forEach.call(t,h)}}function f(t){return v[t]||v[g[t]]}var p={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},v={},g={};return t.highlight=c,t.highlightAuto=l,t.fixMarkup=u,t.highlightBlock=h,t.configure=function(t){p=r(p,t)},t.initHighlighting=d,t.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",d,!1),addEventListener("load",d,!1)},t.registerLanguage=function(e,n){var i=v[e]=n(t);i.aliases&&i.aliases.forEach((function(t){g[t]=e}))},t.listLanguages=function(){return Object.keys(v)},t.getLanguage=f,t.inherit=r,t.IR="[a-zA-Z]\\w*",t.UIR="[a-zA-Z_]\\w*",t.NR="\\b\\d+(\\.\\d+)?",t.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",t.BNR="\\b(0b[01]+)",t.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",t.BE={b:"\\\\[\\s\\S]",r:0},t.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[t.BE]},t.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[t.BE]},t.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},t.C=function(e,n,i){var r=t.inherit({cN:"comment",b:e,e:n,c:[]},i||{});return r.c.push(t.PWM),r},t.CLCM=t.C("//","$"),t.CBCM=t.C("/\\*","\\*/"),t.HCM=t.C("#","$"),t.NM={cN:"number",b:t.NR,r:0},t.CNM={cN:"number",b:t.CNR,r:0},t.BNM={cN:"number",b:t.BNR,r:0},t.CSSNM={cN:"number",b:t.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},t.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[t.BE,{b:/\[/,e:/\]/,r:0,c:[t.BE]}]},t.TM={cN:"title",b:t.IR,r:0},t.UTM={cN:"title",b:t.UIR,r:0},t})),hljs.registerLanguage("json",(function(t){var e={literal:"true false null"},n=[t.QSM,t.CNM],i={cN:"value",e:",",eW:!0,eE:!0,c:n,k:e},r={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[t.BE],i:"\\n",starts:i}],i:"\\S"},o={b:"\\[",e:"\\]",c:[t.inherit(i,{cN:null})],i:"\\S"};return n.splice(n.length,0,r,o),{c:n,k:e,i:"\\S"}})),n("view/result/koralquery",["view","lib/highlight/highlight.pack"],(function(t){return{create:function(e){return Object.create(t)._init(e).upgradeTo(this)},show:function(){if(this._show)return this._show;const t=document.createElement("div");t.setAttribute("id","koralquery");const e=t.addE("div");return e.addT(JSON.stringify(KorAP.koralQuery||{},null,"  ")),hljs.highlightBlock(e),this._show=t,t}}})),n("panel/result",["panel","view/result/koralquery"],(function(t,e){const n=document,i=KorAP.Locale;i.TOGGLE_ALIGN=i.TOGGLE_ALIGN||"toggle alignment",i.SHOW_KQ=i.SHOW_KQ||"show KoralQuery";const r=["left","right","center"];return{create:function(e){return Object.create(t)._init(["result"]).upgradeTo(this)._init(e)},_init:function(t){return this._opened=t,KorAP.Plugin&&(KorAP.Plugin.buttonGroup("result").forEach(t=>this.actions().add.apply(this.actions(),t)),KorAP.Plugin.clearButtonGroup("result")),this.prepend=!0,this},addKqAction:function(){const t=this.actions().add(i.SHOW_KQ,{cls:["show-kq","button-icon"]},(function(){const t=this;t._kq&&t._kq.shown()?t._kq.close():(t._kq=e.create(),t._kq.onClose=function(){delete this._opened.kq}.bind(t),t._opened.kq=!0,t.add(t._kq))}));this._opened.kq&&t.click()},addAlignAction:function(){this.actions().add(i.TOGGLE_ALIGN,{cls:["align","right","button-icon"]},(function(t){var e=n.querySelector("#search > ol").classList;r.find((function(t,n){if(e.contains("align-"+t)){const i=n>=2?0:n+1,o=i>=2?0:i+1;return e.remove("align-"+t),e.add("align-"+r[i]),this.button.toggleClass(r[i],r[o]),!0}}),this)}))}}})),n("panel/query",["panel"],(function(t){document,KorAP.Locale;return{create:function(e){return Object.create(t)._init(["query"]).upgradeTo(this)._init(e)},_init:function(t){this._opened=t;const e=this.actions();return KorAP.Plugin&&(KorAP.Plugin.buttonGroup("query").forEach(t=>e.add.apply(e,t)),KorAP.Plugin.clearButtonGroup("query")),this}}})),n("pageInfo",[],(function(){return{create:function(){const t=Object.create(this),e=document.getElementById("pagination");return t.ds=e?e.dataset:{},t},page:function(){return parseInt(this.ds.page||0)},total:function(){return parseInt(this.ds.total||0)},count:function(){return parseInt(this.ds.count||0)}}})),n("panel/pagination",["panel","buttongroup","pageInfo"],(function(t,e,n){document;const i=KorAP.Locale;return i.RANDOM_PAGE=i.RANDOM_PAGE||"Random page",{create:function(){return Object.create(t)._init(["pagination"]).upgradeTo(this)._init()},_init:function(){let t=document.getElementById("pagination");if(null===t)return null;if("0"===t.getAttribute("data-total"))return null;this._actions.panel=void 0,this._actions.clear();const n=e.adopt(t);n._omOutside=!0,n._omLeft=!0,n.anchor(t.lastElementChild);let i=n.addList("More",{cls:["button-group-list","button-icon"]});return this._actions=i.list,this._bg=n,i.setAttribute("data-icon",""),this._actions.panel=this,this.prepend=!0,this},buttonGroup:function(){return this._bg},addRandomPage:function(){const t=n.create();this.actions().add(i.RANDOM_PAGE,{},(function(){if(t.total()>0){const e=new URLSearchParams(window.location.search);e.set("p",Math.floor(Math.random()*t.total())+1),window.location.search=e.toString()}}))}}})),
+/*!
+ * Intro.js v4.2.2
+ * https://introjs.com
+ *
+ * Copyright (C) 2012-2021 Afshin Mehrabani (@afshinmeh).
+ * https://raw.githubusercontent.com/usablica/intro.js/master/license.md
+ *
+ * Date: Fri, 27 Aug 2021 12:07:05 GMT
+ */
+function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof n&&n.amd?n("lib/intro",e):(t="undefined"!=typeof globalThis?globalThis:t||self).introJs=e()}(this,(function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}var e=function(){var t={};return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"introjs-stamp";return t[n]=t[n]||0,void 0===e[n]&&(e[n]=t[n]++),e[n]}}();function n(t,e,n){if(t)for(var i=0,r=t.length;i<r;i++)e(t[i],i);"function"==typeof n&&n()}var i=new function(){var t="introjs_event";this._id=function(t,n,i,r){return n+e(i)+(r?"_".concat(e(r)):"")},this.on=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=function(t){return i.call(r||e,t||window.event)};"addEventListener"in e?e.addEventListener(n,a,o):"attachEvent"in e&&e.attachEvent("on".concat(n),a),e[t]=e[t]||{},e[t][s]=a},this.off=function(e,n,i,r,o){var s=this._id.apply(this,arguments),a=e[t]&&e[t][s];a&&("removeEventListener"in e?e.removeEventListener(n,a,o):"detachEvent"in e&&e.detachEvent("on".concat(n),a),e[t][s]=null)}},r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,e){return t(e={exports:{}},e.exports),e.exports}var s,a,c=function(t){return t&&t.Math==Math&&t},l=c("object"==typeof globalThis&&globalThis)||c("object"==typeof window&&window)||c("object"==typeof self&&self)||c("object"==typeof r&&r)||function(){return this}()||Function("return this")(),u=function(t){try{return!!t()}catch(t){return!0}},h=!u((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),d={}.propertyIsEnumerable,f=Object.getOwnPropertyDescriptor,p={f:f&&!d.call({1:2},1)?function(t){var e=f(this,t);return!!e&&e.enumerable}:d},v=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},g={}.toString,m=function(t){return g.call(t).slice(8,-1)},_="".split,y=u((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==m(t)?_.call(t,""):Object(t)}:Object,b=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},w=function(t){return y(b(t))},E=function(t){return"object"==typeof t?null!==t:"function"==typeof t},x=function(t){return"function"==typeof t?t:void 0},A=function(t,e){return arguments.length<2?x(l[t]):l[t]&&l[t][e]},k=A("navigator","userAgent")||"",C=l.process,T=l.Deno,P=C&&C.versions||T&&T.version,L=P&&P.v8;L?a=(s=L.split("."))[0]<4?1:s[0]+s[1]:k&&(!(s=k.match(/Edge\/(\d+)/))||s[1]>=74)&&(s=k.match(/Chrome\/(\d+)/))&&(a=s[1]);var S=a&&+a,N=!!Object.getOwnPropertySymbols&&!u((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&S&&S<41})),O=N&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,I=O?function(t){return"symbol"==typeof t}:function(t){var e=A("Symbol");return"function"==typeof e&&Object(t)instanceof e},R=function(t,e){try{Object.defineProperty(l,t,{value:e,configurable:!0,writable:!0})}catch(n){l[t]=e}return e},j=l["__core-js_shared__"]||R("__core-js_shared__",{}),K=o((function(t){(t.exports=function(t,e){return j[t]||(j[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.16.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),M=function(t){return Object(b(t))},q={}.hasOwnProperty,B=Object.hasOwn||function(t,e){return q.call(M(t),e)},U=0,D=Math.random(),F=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++U+D).toString(36)},H=K("wks"),V=l.Symbol,G=O?V:V&&V.withoutSetter||F,z=function(t){return B(H,t)&&(N||"string"==typeof H[t])||(N&&B(V,t)?H[t]=V[t]:H[t]=G("Symbol."+t)),H[t]},Y=z("toPrimitive"),W=function(t,e){if(!E(t)||I(t))return t;var n,i=t[Y];if(void 0!==i){if(void 0===e&&(e="default"),n=i.call(t,e),!E(n)||I(n))return n;throw TypeError("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var n,i;if("string"===e&&"function"==typeof(n=t.toString)&&!E(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!E(i=n.call(t)))return i;if("string"!==e&&"function"==typeof(n=t.toString)&&!E(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}(t,e)},$=function(t){var e=W(t,"string");return I(e)?e:String(e)},Q=l.document,J=E(Q)&&E(Q.createElement),X=function(t){return J?Q.createElement(t):{}},Z=!h&&!u((function(){return 7!=Object.defineProperty(X("div"),"a",{get:function(){return 7}}).a})),tt=Object.getOwnPropertyDescriptor,et={f:h?tt:function(t,e){if(t=w(t),e=$(e),Z)try{return tt(t,e)}catch(t){}if(B(t,e))return v(!p.f.call(t,e),t[e])}},nt=function(t){if(!E(t))throw TypeError(String(t)+" is not an object");return t},it=Object.defineProperty,rt={f:h?it:function(t,e,n){if(nt(t),e=$(e),nt(n),Z)try{return it(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},ot=h?function(t,e,n){return rt.f(t,e,v(1,n))}:function(t,e,n){return t[e]=n,t},st=Function.toString;"function"!=typeof j.inspectSource&&(j.inspectSource=function(t){return st.call(t)});var at,ct,lt,ut=j.inspectSource,ht=l.WeakMap,dt="function"==typeof ht&&/native code/.test(ut(ht)),ft=K("keys"),pt=function(t){return ft[t]||(ft[t]=F(t))},vt={},gt=l.WeakMap;if(dt||j.state){var mt=j.state||(j.state=new gt),_t=mt.get,yt=mt.has,bt=mt.set;at=function(t,e){if(yt.call(mt,t))throw new TypeError("Object already initialized");return e.facade=t,bt.call(mt,t,e),e},ct=function(t){return _t.call(mt,t)||{}},lt=function(t){return yt.call(mt,t)}}else{var wt=pt("state");vt[wt]=!0,at=function(t,e){if(B(t,wt))throw new TypeError("Object already initialized");return e.facade=t,ot(t,wt,e),e},ct=function(t){return B(t,wt)?t[wt]:{}},lt=function(t){return B(t,wt)}}var Et,xt={set:at,get:ct,has:lt,enforce:function(t){return lt(t)?ct(t):at(t,{})},getterFor:function(t){return function(e){var n;if(!E(e)||(n=ct(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}},At=o((function(t){var e=xt.get,n=xt.enforce,i=String(String).split("String");(t.exports=function(t,e,r,o){var s,a=!!o&&!!o.unsafe,c=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;"function"==typeof r&&("string"!=typeof e||B(r,"name")||ot(r,"name",e),(s=n(r)).source||(s.source=i.join("string"==typeof e?e:""))),t!==l?(a?!u&&t[e]&&(c=!0):delete t[e],c?t[e]=r:ot(t,e,r)):c?t[e]=r:R(e,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&e(this).source||ut(this)}))})),kt=Math.ceil,Ct=Math.floor,Tt=function(t){return isNaN(t=+t)?0:(t>0?Ct:kt)(t)},Pt=Math.min,Lt=function(t){return t>0?Pt(Tt(t),9007199254740991):0},St=Math.max,Nt=Math.min,Ot=function(t,e){var n=Tt(t);return n<0?St(n+e,0):Nt(n,e)},It=function(t){return function(e,n,i){var r,o=w(e),s=Lt(o.length),a=Ot(i,s);if(t&&n!=n){for(;s>a;)if((r=o[a++])!=r)return!0}else for(;s>a;a++)if((t||a in o)&&o[a]===n)return t||a||0;return!t&&-1}},Rt={includes:It(!0),indexOf:It(!1)},jt=Rt.indexOf,Kt=function(t,e){var n,i=w(t),r=0,o=[];for(n in i)!B(vt,n)&&B(i,n)&&o.push(n);for(;e.length>r;)B(i,n=e[r++])&&(~jt(o,n)||o.push(n));return o},Mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],qt=Mt.concat("length","prototype"),Bt={f:Object.getOwnPropertyNames||function(t){return Kt(t,qt)}},Ut={f:Object.getOwnPropertySymbols},Dt=A("Reflect","ownKeys")||function(t){var e=Bt.f(nt(t)),n=Ut.f;return n?e.concat(n(t)):e},Ft=function(t,e){for(var n=Dt(e),i=rt.f,r=et.f,o=0;o<n.length;o++){var s=n[o];B(t,s)||i(t,s,r(e,s))}},Ht=/#|\.prototype\./,Vt=function(t,e){var n=zt[Gt(t)];return n==Wt||n!=Yt&&("function"==typeof e?u(e):!!e)},Gt=Vt.normalize=function(t){return String(t).replace(Ht,".").toLowerCase()},zt=Vt.data={},Yt=Vt.NATIVE="N",Wt=Vt.POLYFILL="P",$t=Vt,Qt=et.f,Jt=function(t,e){var n,i,r,o,s,a=t.target,c=t.global,u=t.stat;if(n=c?l:u?l[a]||R(a,{}):(l[a]||{}).prototype)for(i in e){if(o=e[i],r=t.noTargetGet?(s=Qt(n,i))&&s.value:n[i],!$t(c?i:a+(u?".":"#")+i,t.forced)&&void 0!==r){if(typeof o==typeof r)continue;Ft(o,r)}(t.sham||r&&r.sham)&&ot(o,"sham",!0),At(n,i,o,t)}},Xt=function(t){if(I(t))throw TypeError("Cannot convert a Symbol value to a string");return String(t)},Zt=function(){var t=nt(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e},te=function(t,e){return RegExp(t,e)},ee={UNSUPPORTED_Y:u((function(){var t=te("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),BROKEN_CARET:u((function(){var t=te("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},ne=Object.keys||function(t){return Kt(t,Mt)},ie=h?Object.defineProperties:function(t,e){nt(t);for(var n,i=ne(e),r=i.length,o=0;r>o;)rt.f(t,n=i[o++],e[n]);return t},re=A("document","documentElement"),oe=pt("IE_PROTO"),se=function(){},ae=function(t){return"<script>"+t+"<\/script>"},ce=function(t){t.write(ae("")),t.close();var e=t.parentWindow.Object;return t=null,e},le=function(){try{Et=new ActiveXObject("htmlfile")}catch(t){}le=document.domain&&Et?ce(Et):function(){var t,e=X("iframe");if(e.style)return e.style.display="none",re.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(ae("document.F=Object")),t.close(),t.F}()||ce(Et);for(var t=Mt.length;t--;)delete le.prototype[Mt[t]];return le()};vt[oe]=!0;var ue,he,de=Object.create||function(t,e){var n;return null!==t?(se.prototype=nt(t),n=new se,se.prototype=null,n[oe]=t):n=le(),void 0===e?n:ie(n,e)},fe=u((function(){var t=RegExp(".","string".charAt(0));return!(t.dotAll&&t.exec("\n")&&"s"===t.flags)})),pe=u((function(){var t=RegExp("(?<a>b)","string".charAt(5));return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$<a>c")})),ve=xt.get,ge=RegExp.prototype.exec,me=K("native-string-replace",String.prototype.replace),_e=ge,ye=(ue=/a/,he=/b*/g,ge.call(ue,"a"),ge.call(he,"a"),0!==ue.lastIndex||0!==he.lastIndex),be=ee.UNSUPPORTED_Y||ee.BROKEN_CARET,we=void 0!==/()??/.exec("")[1];(ye||we||be||fe||pe)&&(_e=function(t){var e,n,i,r,o,s,a,c=this,l=ve(c),u=Xt(t),h=l.raw;if(h)return h.lastIndex=c.lastIndex,e=_e.call(h,u),c.lastIndex=h.lastIndex,e;var d=l.groups,f=be&&c.sticky,p=Zt.call(c),v=c.source,g=0,m=u;if(f&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=u.slice(c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&"\n"!==u.charAt(c.lastIndex-1))&&(v="(?: "+v+")",m=" "+m,g++),n=new RegExp("^(?:"+v+")",p)),we&&(n=new RegExp("^"+v+"$(?!\\s)",p)),ye&&(i=c.lastIndex),r=ge.call(f?n:c,m),f?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=c.lastIndex,c.lastIndex+=r[0].length):c.lastIndex=0:ye&&r&&(c.lastIndex=c.global?r.index+r[0].length:i),we&&r&&r.length>1&&me.call(r[0],n,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r&&d)for(r.groups=s=de(null),o=0;o<d.length;o++)s[(a=d[o])[0]]=r[a[1]];return r});var Ee=_e;Jt({target:"RegExp",proto:!0,forced:/./.exec!==Ee},{exec:Ee});var xe=z("species"),Ae=RegExp.prototype,ke=function(t,e,n,i){var r=z(t),o=!u((function(){var e={};return e[r]=function(){return 7},7!=""[t](e)})),s=o&&!u((function(){var e=!1,n=/a/;return"split"===t&&((n={}).constructor={},n.constructor[xe]=function(){return n},n.flags="",n[r]=/./[r]),n.exec=function(){return e=!0,null},n[r](""),!e}));if(!o||!s||n){var a=/./[r],c=e(r,""[t],(function(t,e,n,i,r){var s=e.exec;return s===Ee||s===Ae.exec?o&&!r?{done:!0,value:a.call(e,n,i)}:{done:!0,value:t.call(n,e,i)}:{done:!1}}));At(String.prototype,t,c[0]),At(Ae,r,c[1])}i&&ot(Ae[r],"sham",!0)},Ce=function(t){return function(e,n){var i,r,o=Xt(b(e)),s=Tt(n),a=o.length;return s<0||s>=a?t?"":void 0:(i=o.charCodeAt(s))<55296||i>56319||s+1===a||(r=o.charCodeAt(s+1))<56320||r>57343?t?o.charAt(s):i:t?o.slice(s,s+2):r-56320+(i-55296<<10)+65536}},Te={codeAt:Ce(!1),charAt:Ce(!0)}.charAt,Pe=function(t,e,n){return e+(n?Te(t,e).length:1)},Le=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==m(t))throw TypeError("RegExp#exec called on incompatible receiver");return Ee.call(t,e)};ke("match",(function(t,e,n){return[function(e){var n=b(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,n):new RegExp(e)[t](Xt(n))},function(t){var i=nt(this),r=Xt(t),o=n(e,i,r);if(o.done)return o.value;if(!i.global)return Le(i,r);var s=i.unicode;i.lastIndex=0;for(var a,c=[],l=0;null!==(a=Le(i,r));){var u=Xt(a[0]);c[l]=u,""===u&&(i.lastIndex=Pe(r,Lt(i.lastIndex),s)),l++}return 0===l?null:c}]}));var Se=Array.isArray||function(t){return"Array"==m(t)},Ne=function(t,e,n){var i=$(e);i in t?rt.f(t,i,v(0,n)):t[i]=n},Oe=z("species"),Ie=function(t,e){return new(function(t){var e;return Se(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!Se(e.prototype)?E(e)&&null===(e=e[Oe])&&(e=void 0):e=void 0),void 0===e?Array:e}(t))(0===e?0:e)},Re=z("species"),je=function(t){return S>=51||!u((function(){var e=[];return(e.constructor={})[Re]=function(){return{foo:1}},1!==e[t](Boolean).foo}))},Ke=z("isConcatSpreadable"),Me=S>=51||!u((function(){var t=[];return t[Ke]=!1,t.concat()[0]!==t})),qe=je("concat"),Be=function(t){if(!E(t))return!1;var e=t[Ke];return void 0!==e?!!e:Se(t)};Jt({target:"Array",proto:!0,forced:!Me||!qe},{concat:function(t){var e,n,i,r,o,s=M(this),a=Ie(s,0),c=0;for(e=-1,i=arguments.length;e<i;e++)if(Be(o=-1===e?s:arguments[e])){if(c+(r=Lt(o.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n<r;n++,c++)n in o&&Ne(a,c,o[n])}else{if(c>=9007199254740991)throw TypeError("Maximum allowed index exceeded");Ne(a,c++,o)}return a.length=c,a}});var Ue={};Ue[z("toStringTag")]="z";var De="[object z]"===String(Ue),Fe=z("toStringTag"),He="Arguments"==m(function(){return arguments}()),Ve=De?m:function(t){var e,n,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),Fe))?n:He?m(e):"Object"==(i=m(e))&&"function"==typeof e.callee?"Arguments":i},Ge=De?{}.toString:function(){return"[object "+Ve(this)+"]"};De||At(Object.prototype,"toString",Ge,{unsafe:!0});var ze=RegExp.prototype,Ye=ze.toString,We=u((function(){return"/a/b"!=Ye.call({source:"a",flags:"b"})})),$e="toString"!=Ye.name;(We||$e)&&At(RegExp.prototype,"toString",(function(){var t=nt(this),e=Xt(t.source),n=t.flags;return"/"+e+"/"+Xt(void 0===n&&t instanceof RegExp&&!("flags"in ze)?Zt.call(t):n)}),{unsafe:!0});var Qe=z("match"),Je=function(t){var e;return E(t)&&(void 0!==(e=t[Qe])?!!e:"RegExp"==m(t))},Xe=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},Ze=z("species"),tn=ee.UNSUPPORTED_Y,en=[].push,nn=Math.min;function rn(t,e){if(t instanceof SVGElement){var i=t.getAttribute("class")||"";i.match(e)||t.setAttribute("class","".concat(i," ").concat(e))}else{if(void 0!==t.classList)n(e.split(" "),(function(e){t.classList.add(e)}));else t.className.match(e)||(t.className+=" ".concat(e))}}function on(t,e){var n="";return t.currentStyle?n=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(n=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),n&&n.toLowerCase?n.toLowerCase():n}function sn(t){var e=t.element;if(this._options.scrollToElement){var n=function(t){var e=window.getComputedStyle(t),n="absolute"===e.position,i=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var r=t;r=r.parentElement;)if(e=window.getComputedStyle(r),(!n||"static"!==e.position)&&i.test(e.overflow+e.overflowY+e.overflowX))return r;return document.body}(e);n!==document.body&&(n.scrollTop=e.offsetTop-n.offsetTop)}}function an(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function cn(t,e,n){var i,r=e.element;if("off"!==t&&(this._options.scrollToElement&&(i="tooltip"===t?n.getBoundingClientRect():r.getBoundingClientRect(),!function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom+80<=window.innerHeight&&e.right<=window.innerWidth}(r)))){var o=an().height;i.bottom-(i.bottom-i.top)<0||r.clientHeight>o?window.scrollBy(0,i.top-(o/2-i.height/2)-this._options.scrollPadding):window.scrollBy(0,i.top-(o/2-i.height/2)+this._options.scrollPadding)}}function ln(t){t.setAttribute("role","button"),t.tabIndex=0}ke("split",(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=Xt(b(this)),r=void 0===n?4294967295:n>>>0;if(0===r)return[];if(void 0===t)return[i];if(!Je(t))return e.call(i,t,r);for(var o,s,a,c=[],l=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),u=0,h=new RegExp(t.source,l+"g");(o=Ee.call(h,i))&&!((s=h.lastIndex)>u&&(c.push(i.slice(u,o.index)),o.length>1&&o.index<i.length&&en.apply(c,o.slice(1)),a=o[0].length,u=s,c.length>=r));)h.lastIndex===o.index&&h.lastIndex++;return u===i.length?!a&&h.test("")||c.push(""):c.push(i.slice(u)),c.length>r?c.slice(0,r):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var r=b(this),o=null==e?void 0:e[t];return void 0!==o?o.call(e,r,n):i.call(Xt(r),e,n)},function(t,r){var o=nt(this),s=Xt(t),a=n(i,o,s,r,i!==e);if(a.done)return a.value;var c=function(t,e){var n,i=nt(t).constructor;return void 0===i||null==(n=nt(i)[Ze])?e:Xe(n)}(o,RegExp),l=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(tn?"g":"y"),h=new c(tn?"^(?:"+o.source+")":o,u),d=void 0===r?4294967295:r>>>0;if(0===d)return[];if(0===s.length)return null===Le(h,s)?[s]:[];for(var f=0,p=0,v=[];p<s.length;){h.lastIndex=tn?0:p;var g,m=Le(h,tn?s.slice(p):s);if(null===m||(g=nn(Lt(h.lastIndex+(tn?p:0)),s.length))===f)p=Pe(s,p,l);else{if(v.push(s.slice(f,p)),v.length===d)return v;for(var _=1;_<=m.length-1;_++)if(v.push(m[_]),v.length===d)return v;p=f=g}}return v.push(s.slice(f)),v}]}),!!u((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),tn);var un=Object.assign,hn=Object.defineProperty,dn=!un||u((function(){if(h&&1!==un({b:1},un(hn({},"a",{enumerable:!0,get:function(){hn(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=un({},t)[n]||"abcdefghijklmnopqrst"!=ne(un({},e)).join("")}))?function(t,e){for(var n=M(t),i=arguments.length,r=1,o=Ut.f,s=p.f;i>r;)for(var a,c=y(arguments[r++]),l=o?ne(c).concat(o(c)):ne(c),u=l.length,d=0;u>d;)a=l[d++],h&&!s.call(c,a)||(n[a]=c[a]);return n}:un;function fn(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===on(t,"position")||fn(e))}function pn(t,e){var n=document.body,i=document.documentElement,r=window.pageYOffset||i.scrollTop||n.scrollTop,o=window.pageXOffset||i.scrollLeft||n.scrollLeft;e=e||n;var s=t.getBoundingClientRect(),a=e.getBoundingClientRect(),c=on(e,"position"),l={width:s.width,height:s.height};return"body"!==e.tagName.toLowerCase()&&"relative"===c||"sticky"===c?Object.assign(l,{top:s.top-a.top,left:s.left-a.left}):fn(t)?Object.assign(l,{top:s.top,left:s.left}):Object.assign(l,{top:s.top+r,left:s.left+o})}Jt({target:"Object",stat:!0,forced:Object.assign!==dn},{assign:dn});var vn=Math.floor,gn="".replace,mn=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,_n=/\$([$&'`]|\d{1,2})/g,yn=function(t,e,n,i,r,o){var s=n+t.length,a=i.length,c=_n;return void 0!==r&&(r=M(r),c=mn),gn.call(o,c,(function(o,c){var l;switch(c.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(s);case"<":l=r[c.slice(1,-1)];break;default:var u=+c;if(0===u)return o;if(u>a){var h=vn(u/10);return 0===h?o:h<=a?void 0===i[h-1]?c.charAt(1):i[h-1]+c.charAt(1):o}l=i[u-1]}return void 0===l?"":l}))},bn=z("replace"),wn=Math.max,En=Math.min,xn="$0"==="a".replace(/./,"$0"),An=!!/./[bn]&&""===/./[bn]("a","$0");function kn(t,e){if(t instanceof SVGElement){var n=t.getAttribute("class")||"";t.setAttribute("class",n.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function Cn(t,e){var n="";if(t.style.cssText&&(n+=t.style.cssText),"string"==typeof e)n+=e;else for(var i in e)n+="".concat(i,":").concat(e[i],";");t.style.cssText=n}function Tn(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],n=pn(e.element,this._targetElement),i=this._options.helperElementPadding;fn(e.element)?rn(t,"introjs-fixedTooltip"):kn(t,"introjs-fixedTooltip"),"floating"===e.position&&(i=0),Cn(t,{width:"".concat(n.width+i,"px"),height:"".concat(n.height+i,"px"),top:"".concat(n.top-i/2,"px"),left:"".concat(n.left-i/2,"px")})}}ke("replace",(function(t,e,n){var i=An?"$":"$0";return[function(t,n){var i=b(this),r=null==t?void 0:t[bn];return void 0!==r?r.call(t,i,n):e.call(Xt(i),t,n)},function(t,r){var o=nt(this),s=Xt(t);if("string"==typeof r&&-1===r.indexOf(i)&&-1===r.indexOf("$<")){var a=n(e,o,s,r);if(a.done)return a.value}var c="function"==typeof r;c||(r=Xt(r));var l=o.global;if(l){var u=o.unicode;o.lastIndex=0}for(var h=[];;){var d=Le(o,s);if(null===d)break;if(h.push(d),!l)break;""===Xt(d[0])&&(o.lastIndex=Pe(s,Lt(o.lastIndex),u))}for(var f,p="",v=0,g=0;g<h.length;g++){d=h[g];for(var m=Xt(d[0]),_=wn(En(Tt(d.index),s.length),0),y=[],b=1;b<d.length;b++)y.push(void 0===(f=d[b])?f:String(f));var w=d.groups;if(c){var E=[m].concat(y,_,s);void 0!==w&&E.push(w);var x=Xt(r.apply(void 0,E))}else x=yn(m,s,_,y,w,r);_>=v&&(p+=s.slice(v,_)+x,v=_+m.length)}return p+s.slice(v)}]}),!!u((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")}))||!xn||An);var Pn=z("unscopables"),Ln=Array.prototype;null==Ln[Pn]&&rt.f(Ln,Pn,{configurable:!0,value:de(null)});var Sn,Nn=Rt.includes;Jt({target:"Array",proto:!0},{includes:function(t){return Nn(this,t,arguments.length>1?arguments[1]:void 0)}}),Sn="includes",Ln[Pn][Sn]=!0;var On=je("slice"),In=z("species"),Rn=[].slice,jn=Math.max;Jt({target:"Array",proto:!0,forced:!On},{slice:function(t,e){var n,i,r,o=w(this),s=Lt(o.length),a=Ot(t,s),c=Ot(void 0===e?s:e,s);if(Se(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Se(n.prototype)?E(n)&&null===(n=n[In])&&(n=void 0):n=void 0,n===Array||void 0===n))return Rn.call(o,a,c);for(i=new(void 0===n?Array:n)(jn(c-a,0)),r=0;a<c;a++,r++)a in o&&Ne(i,r,o[a]);return i.length=r,i}});var Kn=function(t){if(Je(t))throw TypeError("The method doesn't accept regular expressions");return t},Mn=z("match");Jt({target:"String",proto:!0,forced:!function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[Mn]=!1,"/./"[t](e)}catch(t){}}return!1}("includes")},{includes:function(t){return!!~Xt(b(this)).indexOf(Xt(Kn(t)),arguments.length>1?arguments[1]:void 0)}});var qn=function(t,e){var n=[][t];return!!n&&u((function(){n.call(null,e||function(){throw 1},1)}))},Bn=[].join,Un=y!=Object,Dn=qn("join",",");Jt({target:"Array",proto:!0,forced:Un||!Dn},{join:function(t){return Bn.call(w(this),void 0===t?",":t)}});var Fn=[].push,Hn=function(t){var e=1==t,n=2==t,i=3==t,r=4==t,o=6==t,s=7==t,a=5==t||o;return function(c,l,u,h){for(var d,f,p=M(c),v=y(p),g=function(t,e,n){if(Xe(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)}}return function(){return t.apply(e,arguments)}}(l,u,3),m=Lt(v.length),_=0,b=h||Ie,w=e?b(c,m):n||s?b(c,0):void 0;m>_;_++)if((a||_ in v)&&(f=g(d=v[_],_,p),t))if(e)w[_]=f;else if(f)switch(t){case 3:return!0;case 5:return d;case 6:return _;case 2:Fn.call(w,d)}else switch(t){case 4:return!1;case 7:Fn.call(w,d)}return o?-1:i||r?r:w}},Vn={forEach:Hn(0),map:Hn(1),filter:Hn(2),some:Hn(3),every:Hn(4),find:Hn(5),findIndex:Hn(6),filterReject:Hn(7)}.filter;function Gn(t,e,n,i,r){return t.left+e+n.width>i.width?(r.style.left="".concat(i.width-n.width-t.left,"px"),!1):(r.style.left="".concat(e,"px"),!0)}function zn(t,e,n,i){return t.left+t.width-e-n.width<0?(i.style.left="".concat(-t.left,"px"),!1):(i.style.right="".concat(e,"px"),!0)}Jt({target:"Array",proto:!0,forced:!je("filter")},{filter:function(t){return Vn(this,t,arguments.length>1?arguments[1]:void 0)}});var Yn=je("splice"),Wn=Math.max,$n=Math.min;function Qn(t,e){t.includes(e)&&t.splice(t.indexOf(e),1)}function Jn(t,e,n){var i=this._options.positionPrecedence.slice(),r=an(),o=pn(e).height+10,s=pn(e).width+20,a=t.getBoundingClientRect(),c="floating";a.bottom+o>r.height&&Qn(i,"bottom"),a.top-o<0&&Qn(i,"top"),a.right+s>r.width&&Qn(i,"right"),a.left-s<0&&Qn(i,"left");var l,u,h=-1!==(u=(l=n||"").indexOf("-"))?l.substr(u):"";return n&&(n=n.split("-")[0]),i.length&&(c=i.includes(n)?n:i[0]),["top","bottom"].includes(c)&&(c+=function(t,e,n,i){var r=n.width,o=e/2,s=Math.min(r,window.screen.width),a=["-left-aligned","-middle-aligned","-right-aligned"];return s-t<e&&Qn(a,"-left-aligned"),(t<o||s-t<o)&&Qn(a,"-middle-aligned"),t<e&&Qn(a,"-right-aligned"),a.length?a.includes(i)?i:a[0]:"-middle-aligned"}(a.left,s,r,h)),c}function Xn(t,e,n,i){var r,o,s,a,c,l="";if(i=i||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,n.style.display="inherit",this._introItems[this._currentStep])switch(l="string"==typeof(r=this._introItems[this._currentStep]).tooltipClass?r.tooltipClass:this._options.tooltipClass,e.className=["introjs-tooltip",l].filter(Boolean).join(" "),e.setAttribute("role","dialog"),"floating"!==(c=this._introItems[this._currentStep].position)&&this._options.autoPosition&&(c=Jn.call(this,t,e,c)),s=pn(t),o=pn(e),a=an(),rn(e,"introjs-".concat(c)),c){case"top-right-aligned":n.className="introjs-arrow bottom-right";var u=0;zn(s,u,o,e),e.style.bottom="".concat(s.height+20,"px");break;case"top-middle-aligned":n.className="introjs-arrow bottom-middle";var h=s.width/2-o.width/2;i&&(h+=5),zn(s,h,o,e)&&(e.style.right=null,Gn(s,h,o,a,e)),e.style.bottom="".concat(s.height+20,"px");break;case"top-left-aligned":case"top":n.className="introjs-arrow bottom",Gn(s,i?0:15,o,a,e),e.style.bottom="".concat(s.height+20,"px");break;case"right":e.style.left="".concat(s.width+20,"px"),s.top+o.height>a.height?(n.className="introjs-arrow left-bottom",e.style.top="-".concat(o.height-s.height-20,"px")):n.className="introjs-arrow left";break;case"left":i||!0!==this._options.showStepNumbers||(e.style.top="15px"),s.top+o.height>a.height?(e.style.top="-".concat(o.height-s.height-20,"px"),n.className="introjs-arrow right-bottom"):n.className="introjs-arrow right",e.style.right="".concat(s.width+20,"px");break;case"floating":n.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-".concat(o.width/2,"px"),e.style.marginTop="-".concat(o.height/2,"px");break;case"bottom-right-aligned":n.className="introjs-arrow top-right",zn(s,u=0,o,e),e.style.top="".concat(s.height+20,"px");break;case"bottom-middle-aligned":n.className="introjs-arrow top-middle",h=s.width/2-o.width/2,i&&(h+=5),zn(s,h,o,e)&&(e.style.right=null,Gn(s,h,o,a,e)),e.style.top="".concat(s.height+20,"px");break;default:n.className="introjs-arrow top",Gn(s,0,o,a,e),e.style.top="".concat(s.height+20,"px")}}function Zn(){n(document.querySelectorAll(".introjs-showElement"),(function(t){kn(t,/introjs-[a-zA-Z]+/g)}))}function ti(t,e){var n=document.createElement(t);e=e||{};var i=/^(?:role|data-|aria-)/;for(var r in e){var o=e[r];"style"===r?Cn(n,o):r.match(i)?n.setAttribute(r,o):n[r]=o}return n}function ei(t,e,n){if(n){var i=e.style.opacity||"1";Cn(e,{opacity:"0"}),window.setTimeout((function(){Cn(e,{opacity:i})}),10)}t.appendChild(e)}function ni(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}function ii(){var t=document.querySelector(".introjs-disableInteraction");null===t&&(t=ti("div",{className:"introjs-disableInteraction"}),this._targetElement.appendChild(t)),Tn.call(this,t)}function ri(t){var e=this,i=ti("div",{className:"introjs-bullets"});!1===this._options.showBullets&&(i.style.display="none");var r=ti("ul");r.setAttribute("role","tablist");var o=function(){e.goToStep(this.getAttribute("data-stepnumber"))};return n(this._introItems,(function(e,n){var i=e.step,s=ti("li"),a=ti("a");s.setAttribute("role","presentation"),a.setAttribute("role","tab"),a.onclick=o,n===t.step-1&&(a.className="active"),ln(a),a.innerHTML="&nbsp;",a.setAttribute("data-stepnumber",i),s.appendChild(a),r.appendChild(s)})),i.appendChild(r),i}function oi(t,e){if(this._options.showBullets){var n=document.querySelector(".introjs-bullets");n.parentNode.replaceChild(ri.call(this,e),n)}}function si(t,e){this._options.showBullets&&(t.querySelector(".introjs-bullets li > a.active").className="",t.querySelector('.introjs-bullets li > a[data-stepnumber="'.concat(e.step,'"]')).className="active")}function ai(){var t=ti("div");t.className="introjs-progress",!1===this._options.showProgress&&(t.style.display="none");var e=ti("div",{className:"introjs-progressbar"});return this._options.progressBarAdditionalClass&&(e.className+=" "+this._options.progressBarAdditionalClass),e.setAttribute("role","progress"),e.setAttribute("aria-valuemin",0),e.setAttribute("aria-valuemax",100),e.setAttribute("aria-valuenow",ni.call(this)),e.style.cssText="width:".concat(ni.call(this),"%;"),t.appendChild(e),t}function ci(t){t.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:".concat(ni.call(this),"%;"),t.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",ni.call(this))}function li(t){var e=this;void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,t.element);var n,i,r,o=this,s=document.querySelector(".introjs-helperLayer"),a=document.querySelector(".introjs-tooltipReferenceLayer"),c="introjs-helperLayer";if("string"==typeof t.highlightClass&&(c+=" ".concat(t.highlightClass)),"string"==typeof this._options.highlightClass&&(c+=" ".concat(this._options.highlightClass)),null!==s&&null!==a){var l=a.querySelector(".introjs-helperNumberLayer"),u=a.querySelector(".introjs-tooltiptext"),h=a.querySelector(".introjs-tooltip-title"),d=a.querySelector(".introjs-arrow"),f=a.querySelector(".introjs-tooltip");r=a.querySelector(".introjs-skipbutton"),i=a.querySelector(".introjs-prevbutton"),n=a.querySelector(".introjs-nextbutton"),s.className=c,f.style.opacity=0,f.style.display="none",sn.call(o,t),Tn.call(o,s),Tn.call(o,a),Zn(),o._lastShowElementTimer&&window.clearTimeout(o._lastShowElementTimer),o._lastShowElementTimer=window.setTimeout((function(){null!==l&&(l.innerHTML="".concat(t.step," of ").concat(e._introItems.length)),u.innerHTML=t.intro,h.innerHTML=t.title,f.style.display="block",Xn.call(o,t.element,f,d),si.call(o,a,t),ci.call(o,a),f.style.opacity=1,(null!=n&&/introjs-donebutton/gi.test(n.className)||null!=n)&&n.focus(),cn.call(o,t.scrollTo,t,u)}),350)}else{var p=ti("div",{className:c}),v=ti("div",{className:"introjs-tooltipReferenceLayer"}),g=ti("div",{className:"introjs-arrow"}),m=ti("div",{className:"introjs-tooltip"}),_=ti("div",{className:"introjs-tooltiptext"}),y=ti("div",{className:"introjs-tooltip-header"}),b=ti("h1",{className:"introjs-tooltip-title"}),w=ti("div");Cn(p,{"box-shadow":"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, ".concat(o._options.overlayOpacity.toString(),") 0 0 0 5000px")}),sn.call(o,t),Tn.call(o,p),Tn.call(o,v),ei(this._targetElement,p,!0),ei(this._targetElement,v),_.innerHTML=t.intro,b.innerHTML=t.title,w.className="introjs-tooltipbuttons",!1===this._options.showButtons&&(w.style.display="none"),y.appendChild(b),m.appendChild(y),m.appendChild(_),m.appendChild(ri.call(this,t)),m.appendChild(ai.call(this));var E=ti("div");!0===this._options.showStepNumbers&&(E.className="introjs-helperNumberLayer",E.innerHTML="".concat(t.step," of ").concat(this._introItems.length),m.appendChild(E)),m.appendChild(g),v.appendChild(m),(n=ti("a")).onclick=function(){o._introItems.length-1!==o._currentStep?di.call(o):/introjs-donebutton/gi.test(n.className)&&("function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),Qi.call(o,o._targetElement))},ln(n),n.innerHTML=this._options.nextLabel,(i=ti("a")).onclick=function(){0!==o._currentStep&&fi.call(o)},ln(i),i.innerHTML=this._options.prevLabel,ln(r=ti("a",{className:"introjs-skipbutton"})),r.innerHTML=this._options.skipLabel,r.onclick=function(){o._introItems.length-1===o._currentStep&&"function"==typeof o._introCompleteCallback&&o._introCompleteCallback.call(o),"function"==typeof o._introSkipCallback&&o._introSkipCallback.call(o),Qi.call(o,o._targetElement)},y.appendChild(r),this._introItems.length>1&&w.appendChild(i),w.appendChild(n),m.appendChild(w),Xn.call(o,t.element,m,g),cn.call(this,t.scrollTo,t,m)}var x=o._targetElement.querySelector(".introjs-disableInteraction");x&&x.parentNode.removeChild(x),t.disableInteraction&&ii.call(o),0===this._currentStep&&this._introItems.length>1?(null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton"),n.innerHTML=this._options.nextLabel),!0===this._options.hidePrev?(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton introjs-hidden")),null!=n&&rn(n,"introjs-fullbutton")):null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton introjs-disabled"))):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton")),!0===this._options.hideNext?(null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton introjs-hidden")),null!=i&&rn(i,"introjs-fullbutton")):null!=n&&(!0===this._options.nextToDone?(n.innerHTML=this._options.doneLabel,rn(n,"".concat(this._options.buttonClass," introjs-nextbutton introjs-donebutton"))):n.className="".concat(this._options.buttonClass," introjs-nextbutton introjs-disabled"))):(null!=i&&(i.className="".concat(this._options.buttonClass," introjs-prevbutton")),null!=n&&(n.className="".concat(this._options.buttonClass," introjs-nextbutton"),n.innerHTML=this._options.nextLabel)),null!=i&&i.setAttribute("role","button"),null!=n&&n.setAttribute("role","button"),null!=r&&r.setAttribute("role","button"),null!=n&&n.focus(),function(t){var e=t.element;rn(e,"introjs-showElement");var n=on(e,"position");"absolute"!==n&&"relative"!==n&&"sticky"!==n&&"fixed"!==n&&rn(e,"introjs-relativePosition")}(t),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,t.element)}function ui(t){this._currentStep=t-2,void 0!==this._introItems&&di.call(this)}function hi(t){this._currentStepNumber=t,void 0!==this._introItems&&di.call(this)}function di(){var t=this;this._direction="forward",void 0!==this._currentStepNumber&&n(this._introItems,(function(e,n){e.step===t._currentStepNumber&&(t._currentStep=n-1,t._currentStepNumber=void 0)})),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var e=this._introItems[this._currentStep],i=!0;return void 0!==this._introBeforeChangeCallback&&(i=this._introBeforeChangeCallback.call(this,e&&e.element)),!1===i?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void Qi.call(this,this._targetElement)):void li.call(this,e)}function fi(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t&&t.element)),!1===e)return++this._currentStep,!1;li.call(this,t)}function pi(){return this._currentStep}function vi(t){var e=void 0===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)fi.call(this);else if("ArrowRight"===e||39===e)di.call(this);else if("Enter"===e||"NumpadEnter"===e||13===e){var n=t.target||t.srcElement;n&&n.className.match("introjs-prevbutton")?fi.call(this):n&&n.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),Qi.call(this,this._targetElement)):n&&n.getAttribute("data-stepnumber")?n.click():di.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else Qi.call(this,this._targetElement)}function gi(e){if(null===e||"object"!==t(e)||void 0!==e.nodeType)return e;var n={};for(var i in e)void 0!==window.jQuery&&e[i]instanceof window.jQuery?n[i]=e[i]:n[i]=gi(e[i]);return n}function mi(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function _i(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];Ti.call(this),e&&rn(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function yi(){var t=this;n(mi(".introjs-hint"),(function(e){_i.call(t,e.getAttribute("data-step"))}))}function bi(){var t=this,e=mi(".introjs-hint");e&&e.length?n(e,(function(e){wi.call(t,e.getAttribute("data-step"))})):Pi.call(this,this._targetElement)}function wi(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];e&&kn(e,/introjs-hidehint/g)}function Ei(){var t=this;n(mi(".introjs-hint"),(function(e){xi.call(t,e.getAttribute("data-step"))}))}function xi(t){var e=mi('.introjs-hint[data-step="'.concat(t,'"]'))[0];e&&e.parentNode.removeChild(e)}function Ai(){var t=this,e=this,i=document.querySelector(".introjs-hints");null===i&&(i=ti("div",{className:"introjs-hints"}));n(this._introItems,(function(n,r){if(!document.querySelector('.introjs-hint[data-step="'.concat(r,'"]'))){var o=ti("a",{className:"introjs-hint"});ln(o),o.onclick=function(t){return function(n){var i=n||window.event;i.stopPropagation&&i.stopPropagation(),null!==i.cancelBubble&&(i.cancelBubble=!0),Ci.call(e,t)}}(r),n.hintAnimation||rn(o,"introjs-hint-no-anim"),fn(n.element)&&rn(o,"introjs-fixedhint");var s=ti("div",{className:"introjs-hint-dot"}),a=ti("div",{className:"introjs-hint-pulse"});o.appendChild(s),o.appendChild(a),o.setAttribute("data-step",r),n.targetElement=n.element,n.element=o,ki.call(t,n.hintPosition,o,n.targetElement),i.appendChild(o)}})),document.body.appendChild(i),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}function ki(t,e,n){var i=e.style,r=pn.call(this,n);switch(t){default:case"top-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top,"px");break;case"top-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top,"px");break;case"bottom-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"bottom-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"middle-left":i.left="".concat(r.left,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"middle-right":i.left="".concat(r.left+r.width-20,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"middle-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top+(r.height-20)/2,"px");break;case"bottom-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top+r.height-20,"px");break;case"top-middle":i.left="".concat(r.left+(r.width-20)/2,"px"),i.top="".concat(r.top,"px")}}function Ci(t){var e=document.querySelector('.introjs-hint[data-step="'.concat(t,'"]')),n=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,n,t);var i=Ti.call(this);if(parseInt(i,10)!==t){var r=ti("div",{className:"introjs-tooltip"}),o=ti("div"),s=ti("div"),a=ti("div");r.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},o.className="introjs-tooltiptext";var c=ti("p");c.innerHTML=n.hint;var l=ti("a");l.className=this._options.buttonClass,l.setAttribute("role","button"),l.innerHTML=this._options.hintButtonLabel,l.onclick=_i.bind(this,t),o.appendChild(c),o.appendChild(l),s.className="introjs-arrow",r.appendChild(s),r.appendChild(o),this._currentStep=e.getAttribute("data-step"),a.className="introjs-tooltipReferenceLayer introjs-hintReference",a.setAttribute("data-step",e.getAttribute("data-step")),Tn.call(this,a),a.appendChild(r),document.body.appendChild(a),Xn.call(this,e,r,s,!0)}}function Ti(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function Pi(t){var e=this;if(this._introItems=[],this._options.hints)n(this._options.hints,(function(t){var n=gi(t);"string"==typeof n.element&&(n.element=document.querySelector(n.element)),n.hintPosition=n.hintPosition||e._options.hintPosition,n.hintAnimation=n.hintAnimation||e._options.hintAnimation,null!==n.element&&e._introItems.push(n)}));else{var r=t.querySelectorAll("*[data-hint]");if(!r||!r.length)return!1;n(r,(function(t){var n=t.getAttribute("data-hintanimation");n=n?"true"===n:e._options.hintAnimation,e._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||e._options.hintPosition,hintAnimation:n,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition})}))}Ai.call(this),i.on(document,"click",Ti,this,!1),i.on(window,"resize",Li,this,!0)}function Li(){var t=this;n(this._introItems,(function(e){var n=e.targetElement,i=e.hintPosition,r=e.element;void 0!==n&&ki.call(t,i,r,n)}))}Jt({target:"Array",proto:!0,forced:!Yn},{splice:function(t,e){var n,i,r,o,s,a,c=M(this),l=Lt(c.length),u=Ot(t,l),h=arguments.length;if(0===h?n=i=0:1===h?(n=0,i=l-u):(n=h-2,i=$n(Wn(Tt(e),0),l-u)),l+n-i>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(r=Ie(c,i),o=0;o<i;o++)(s=u+o)in c&&Ne(r,o,c[s]);if(r.length=i,n<i){for(o=u;o<l-i;o++)a=o+n,(s=o+i)in c?c[a]=c[s]:delete c[a];for(o=l;o>l-i+n;o--)delete c[o-1]}else if(n>i)for(o=l-i;o>u;o--)a=o+n-1,(s=o+i-1)in c?c[a]=c[s]:delete c[a];for(o=0;o<n;o++)c[o+u]=arguments[o+2];return c.length=l-i+n,r}});var Si=Math.floor,Ni=function(t,e){var n=t.length,i=Si(n/2);return n<8?Oi(t,e):Ii(Ni(t.slice(0,i),e),Ni(t.slice(i),e),e)},Oi=function(t,e){for(var n,i,r=t.length,o=1;o<r;){for(i=o,n=t[o];i&&e(t[i-1],n)>0;)t[i]=t[--i];i!==o++&&(t[i]=n)}return t},Ii=function(t,e,n){for(var i=t.length,r=e.length,o=0,s=0,a=[];o<i||s<r;)o<i&&s<r?a.push(n(t[o],e[s])<=0?t[o++]:e[s++]):a.push(o<i?t[o++]:e[s++]);return a},Ri=Ni,ji=k.match(/firefox\/(\d+)/i),Ki=!!ji&&+ji[1],Mi=/MSIE|Trident/.test(k),qi=k.match(/AppleWebKit\/(\d+)\./),Bi=!!qi&&+qi[1],Ui=[],Di=Ui.sort,Fi=u((function(){Ui.sort(void 0)})),Hi=u((function(){Ui.sort(null)})),Vi=qn("sort"),Gi=!u((function(){if(S)return S<70;if(!(Ki&&Ki>3)){if(Mi)return!0;if(Bi)return Bi<603;var t,e,n,i,r="";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(i=0;i<47;i++)Ui.push({k:e+i,v:n})}for(Ui.sort((function(t,e){return e.v-t.v})),i=0;i<Ui.length;i++)e=Ui[i].k.charAt(0),r.charAt(r.length-1)!==e&&(r+=e);return"DGBEFHACIJK"!==r}}));function zi(t){var e=this,i=t.querySelectorAll("*[data-intro]"),r=[];if(this._options.steps)n(this._options.steps,(function(t){var n=gi(t);if(n.step=r.length+1,n.title=n.title||"","string"==typeof n.element&&(n.element=document.querySelector(n.element)),void 0===n.element||null===n.element){var i=document.querySelector(".introjsFloatingElement");null===i&&(i=ti("div",{className:"introjsFloatingElement"}),document.body.appendChild(i)),n.element=i,n.position="floating"}n.position=n.position||e._options.tooltipPosition,n.scrollTo=n.scrollTo||e._options.scrollTo,void 0===n.disableInteraction&&(n.disableInteraction=e._options.disableInteraction),null!==n.element&&r.push(n)}));else{var o;if(i.length<1)return[];n(i,(function(t){if((!e._options.group||t.getAttribute("data-intro-group")===e._options.group)&&"none"!==t.style.display){var n=parseInt(t.getAttribute("data-step"),10);o=t.hasAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):e._options.disableInteraction,n>0&&(r[n-1]={element:t,title:t.getAttribute("data-title")||"",intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||e._options.scrollTo,disableInteraction:o})}}));var s=0;n(i,(function(t){if((!e._options.group||t.getAttribute("data-intro-group")===e._options.group)&&null===t.getAttribute("data-step")){for(;void 0!==r[s];)s++;o=t.hasAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):e._options.disableInteraction,r[s]={element:t,title:t.getAttribute("data-title")||"",intro:t.getAttribute("data-intro"),step:s+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||e._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||e._options.scrollTo,disableInteraction:o}}}))}for(var a=[],c=0;c<r.length;c++)r[c]&&a.push(r[c]);return(r=a).sort((function(t,e){return t.step-e.step})),r}function Yi(t){var e=document.querySelector(".introjs-tooltipReferenceLayer"),n=document.querySelector(".introjs-helperLayer"),i=document.querySelector(".introjs-disableInteraction");if(Tn.call(this,n),Tn.call(this,e),Tn.call(this,i),t&&(this._introItems=zi.call(this,this._targetElement),oi.call(this,e,this._introItems[this._currentStep]),ci.call(this,e)),void 0!==this._currentStep&&null!==this._currentStep){var r=document.querySelector(".introjs-arrow"),o=document.querySelector(".introjs-tooltip");Xn.call(this,this._introItems[this._currentStep].element,o,r)}return Li.call(this),this}function Wi(){Yi.call(this)}function $i(t,e){if(t&&t.parentElement){var n=t.parentElement;e?(Cn(t,{opacity:"0"}),window.setTimeout((function(){try{n.removeChild(t)}catch(t){}}),500)):n.removeChild(t)}}function Qi(t,e){var r=!0;if(void 0!==this._introBeforeExitCallback&&(r=this._introBeforeExitCallback.call(this)),e||!1!==r){var o=t.querySelectorAll(".introjs-overlay");o&&o.length&&n(o,(function(t){return $i(t)})),$i(t.querySelector(".introjs-helperLayer"),!0),$i(t.querySelector(".introjs-tooltipReferenceLayer")),$i(t.querySelector(".introjs-disableInteraction")),$i(document.querySelector(".introjsFloatingElement")),Zn(),i.off(window,"keydown",vi,this,!0),i.off(window,"resize",Wi,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function Ji(t){var e=this,n=ti("div",{className:"introjs-overlay"});return Cn(n,{top:0,bottom:0,left:0,right:0,position:"fixed"}),t.appendChild(n),!0===this._options.exitOnOverlayClick&&(Cn(n,{cursor:"pointer"}),n.onclick=function(){Qi.call(e,t)}),!0}function Xi(t){var e=zi.call(this,t);return 0===e.length||(this._introItems=e,Ji.call(this,t)&&(di.call(this),this._options.keyboardNavigation&&i.on(window,"keydown",vi,this,!0),i.on(window,"resize",Wi,this,!0))),!1}Jt({target:"Array",proto:!0,forced:Fi||!Hi||!Vi||!Gi},{sort:function(t){void 0!==t&&Xe(t);var e=M(this);if(Gi)return void 0===t?Di.call(e):Di.call(e,t);var n,i,r=[],o=Lt(e.length);for(i=0;i<o;i++)i in e&&r.push(e[i]);for(n=(r=Ri(r,function(t){return function(e,n){return void 0===n?-1:void 0===e?1:void 0!==t?+t(e,n)||0:Xt(e)>Xt(n)?1:-1}}(t))).length,i=0;i<n;)e[i]=r[i++];for(;i<o;)delete e[i++];return e}});function Zi(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next",prevLabel:"Back",skipLabel:"×",doneLabel:"Done",hidePrev:!1,hideNext:!1,nextToDone:!0,tooltipPosition:"bottom",tooltipClass:"",group:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!1,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.5,autoPosition:!0,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button",progressBarAdditionalClass:!1}}var tr=function n(i){var r;if("object"===t(i))r=new Zi(i);else if("string"==typeof i){var o=document.querySelector(i);if(!o)throw new Error("There is no element with given selector.");r=new Zi(o)}else r=new Zi(document.body);return n.instances[e(r,"introjs-instance")]=r,r};return tr.version="4.2.2",tr.instances={},tr.fn=Zi.prototype={clone:function(){return new Zi(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var n,i={};for(n in t)i[n]=t[n];for(n in e)i[n]=e[n];return i}(this._options,t),this},start:function(){return Xi.call(this,this._targetElement),this},goToStep:function(t){return ui.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return hi.call(this,t),this},nextStep:function(){return di.call(this),this},previousStep:function(){return fi.call(this),this},currentStep:function(){return pi.call(this)},exit:function(t){return Qi.call(this,this._targetElement,t),this},refresh:function(t){return Yi.call(this,t),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return Pi.call(this,this._targetElement),this},hideHint:function(t){return _i.call(this,t),this},hideHints:function(){return yi.call(this),this},showHint:function(t){return wi.call(this,t),this},showHints:function(){return bi.call(this),this},removeHints:function(){return Ei.call(this),this},removeHint:function(t){return xi().call(this,t),this},showHintDialog:function(t){return Ci.call(this,t),this}},tr})),n("tour/tours",["lib/intro","vc","hint","menu","vc/doc","vc/docgroup"],(function(t,e,n,i,r,o){const s=KorAP.Locale;s.TOUR_lprev=s.TOUR_lprev||"Back",s.TOUR_lnext=s.TOUR_lnext||"Next",s.TOUR_ldone=s.TOUR_ldone||"Done",s.TOUR_ldoneSearch=s.TOUR_ldoneSearch||"Search",s.TOUR_welcti=s.TOUR_welcti||"<span class='tgreeting'> Welcome to our guided tour! </span>",s.TOUR_welc=s.TOUR_welc||"This tour should give you a quick introduction to KorAP. We lead you step by step through an example.",s.TOUR_sear1=s.TOUR_sear1||"Input field for the query, for example the search for '"+s.TOUR_Qexample+"'.",s.TOUR_searAnnot=s.TOUR_searAnnot||"Annotation helper",s.TOUR_annotAss=s.TOUR_annotAss||"The assistant displays the annotations of the different layers and helps to formulate queries.",s.TOUR_vccho1=s.TOUR_vccho1||"Choose corpus",s.TOUR_vccho2=s.TOUR_vccho2||"Define your corpus here.",s.TOUR_vcStat1=s.TOUR_vcStat1||"Click here to display corpus statistic.",s.TOUR_vcStat2=s.TOUR_vcStat2||"Corpus statistic",s.TOUR_qlfield=s.TOUR_qlfield||"Selection of the query language: You can use KorAP with different query languages.",s.TOUR_help=s.TOUR_help||"Help and information about KorAP.",s.TOUR_glimpse=s.TOUR_glimpse||"Select this to show only the first hits in undefined order.",s.TOUR_seargo=s.TOUR_seargo||"Start the search",s.TOUR_kwic=s.TOUR_kwic||"KWIC result (keyword in context)",s.TOUR_snippet=s.TOUR_snippet||"Click on a match to show a larger snippet.",s.TOUR_snippetb=s.TOUR_snippetb||"Snippet",s.TOUR_metadatab=s.TOUR_metadatab||"Display of metadata",s.TOUR_metadata=s.TOUR_metadata||"Metadata",s.TOUR_tokenb=s.TOUR_tokenb||"Display of token annotations",s.TOUR_token=s.TOUR_token||"KorAP supports multiple annotations.",s.TOUR_treeb=s.TOUR_treeb||"Display further annotations",s.TOUR_tree=s.TOUR_tree||"Further annotations can be displayed as tree and arch views.",s.TOUR_tourdone=s.TOUR_tourdone||"Have fun with KorAP!";let a={prevLabel:s.TOUR_lprev,nextLabel:s.TOUR_lnext,doneLabel:s.TOUR_ldone,showStepNumbers:!1},c={showBullets:!1,overlayOpacity:.5,exitOnOverlayClick:!1,disableInteraction:!0,tooltipClass:"customTooltip",hidePrev:!0};var l=document;return{gTstartSearch:function(e){let n=t();n.setOptions(a),n.setOption("doneLabel",s.TOUR_ldoneSearch),n.setOptions(c),e&&(l=e),l.querySelector("#q-field").value="";let i=[{element:"#link-guided-tour",title:s.TOUR_welcti,intro:s.TOUR_welc,position:"right"},{title:s.TOUR_sear1ti,element:"#q-field",intro:s.TOUR_sear1,position:"bottom"},{title:s.TOUR_searAnnotti,element:"#hint",intro:s.TOUR_searAnnot,position:"bottom"},{title:s.TOUR_annotAssti,element:l.querySelector("#hint > .menu.hint"),intro:s.TOUR_annotAss,position:"bottom"},{title:s.TOUR_vccho1ti,element:"#vc-choose",intro:s.TOUR_vccho1,position:"bottom"},{title:s.TOUR_vccho2ti,element:"#vc-view",intro:s.TOUR_vccho2,position:"bottom"},{title:s.TOUR_vcStat1ti,element:l.querySelector(".statistic"),intro:s.TOUR_vcStat1,position:"left"},{title:s.TOUR_vcStat2ti,element:l.querySelector(".stattable"),intro:s.TOUR_vcStat2,position:"bottom"},{title:s.TOUR_qlfieldti,element:l.querySelector("#ql-field").parentNode,intro:s.TOUR_qlfield,position:"bottom"},{title:s.TOUR_glimpseti,element:l.querySelector("#glimpse").parentNode,intro:s.TOUR_glimpse,position:"bottom"},{title:s.TOUR_helpti,element:"#view-tutorial",intro:s.TOUR_help,position:"bottom"},{title:s.TOUR_seargoti,element:"#qsubmit",intro:s.TOUR_seargo,position:"bottom"}];return n.setOptions({steps:i}),this.testPrerequ(i,n),n.onbeforechange((function(t){switch(t.id){case"q-field":t.value=s.TOUR_Qexample;break;case"vc-view":let e=l.querySelector("#vc-choose"),i=l.querySelector("#vc-view");KorAP._delete.apply(KorAP.vc.root()),KorAP.vc.fromJson(s.TOUR_vcQuery),i.querySelector(".active")||(e.click(),n._introItems[6].element=l.querySelector(".statistic"),n._introItems[6].position="left")}if(7==this._currentStep){l.querySelector(".statistic").click(),n._introItems[7].element=l.querySelector(".stattable"),n._introItems[7].position="bottom"}})),n.onbeforeexit((function(){KorAP.Hint.active()&&KorAP.Hint.active().dontHide&&KorAP.Hint.unshow()})),n.onchange((function(t){switch(this._currentStep){case 2:KorAP.Hint.active()&&KorAP.Hint.unshow();break;case 3:KorAP.Hint.show(!1),KorAP.Hint.active().dontHide=!0,n._introItems[3].element=l.querySelector(".menu.roll.hint"),n._introItems[3].position=l.querySelector("bottom");break;case 4:KorAP.Hint.unshow()}})),n.oncomplete((function(){KorAP.session.set("tour",!0),l.getElementById("qsubmit").click()})),n},gTshowResults:function(e){let n=t();n.setOptions(c),e&&(l=e);let i=[{element:"#search",intro:s.TOUR_kwic,position:"auto"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippet,position:"bottom"},{element:l.querySelector("#search > ol > li"),intro:s.TOUR_snippetb,position:"bottom"},{element:l.querySelector(".action > .metatable"),intro:s.TOUR_metadatab,position:"bottom"},{element:l.querySelector(".view.metatable"),intro:s.TOUR_metadata,position:"auto"},{element:l.querySelector(".action > .info"),intro:s.TOUR_tokenb,position:"bottom"},{element:l.querySelector(".view.tokentable"),intro:s.TOUR_token,position:"auto"},{element:l.querySelector(".tree"),intro:s.TOUR_treeb,position:"bottom"},{element:l.querySelector(".view.relations"),intro:s.TOUR_tree,position:"bottom"},{intro:s.TOUR_tourdone}];return n.setOptions({steps:i}),n.setOptions(a),n.onbeforeexit((function(){KorAP.session.set("tour",!1)})),n.setOption("scrollToElement",!0),n.setOption("scrollTo","tooltip"),this.testPrerequ(i,n),n.onbeforechange((function(t){if(1==this._currentStep&&KorAP.session.set("tour",!1),2==this._currentStep&&(l.querySelector("#search > ol > li").click(),n._introItems[3].element=l.querySelector(".action > .metatable"),n._introItems[3].position="bottom"),4==this._currentStep&&(l.querySelector(".metatable").click(),n._introItems[4].element=l.querySelector(".view.metatable"),n._introItems[5].element=l.querySelector(".action > .info"),n._introItems[5].position="bottom"),6==this._currentStep&&(l.querySelector(".info").click(),n._introItems[6].element=l.querySelector(".view.tokentable"),n._introItems[7].element=l.querySelector(".tree"),n._introItems[7].position="bottom"),8==this._currentStep){l.querySelector(".tree").click();let t=document.querySelectorAll(".button-group-list")[0].querySelectorAll("li");for(let e=0;e<t.length;e++)if(t[e].innerText==s.TOUR_Relations){t[e].click();break}n._introItems[8].element=l.querySelector(".view.relations")}})),n},testPrerequ:function(t,e){let n=t,i=e;i.stepCount=n.length,i.testIntros=[];for(let t=0;t<n.length;t++)i.testIntros.push(n[t].intro)}}})),n("plugin/service",[],(function(){let t={scripts:1,presentation:1,forms:1,"downloads-without-user-activation":1,downloads:1};return{create:function(t){return Object.create(this)._init(t)},_init:function(e){if(!(e&&e.name&&e.src&&e.id))throw Error("Service not well defined");this.name=e.name,this.src=e.src,this.id=e.id,this.desc=e.desc;let n=new Set,i=e.permissions;return i&&Array.isArray(i)&&i.forEach((function(e){e in t?n.add(e):KorAP.log(0,"Requested permission not allowed")})),this._perm=n,this.close||(this.close=function(){this._closeIframe()}),this},load:function(){if(this._load)return this._load;if("https:"==window.location.protocol&&0!=this.src.toLowerCase().indexOf("https:"))return void KorAP.log(0,"Service endpoint is insecure");let t=document.createElement("iframe");return t.setAttribute("allowTransparency","true"),t.setAttribute("frameborder",0),t.setAttribute("sandbox",Array.from(this._perm).sort().map((function(t){return"allow-"+t})).join(" ")),t.style.height="0px",t.setAttribute("name",this.id),t.setAttribute("src",this.src),this._load=t,t},sendMsg:function(t){this.load().contentWindow.postMessage(t,"*")},_closeIframe:function(){var t=this._load;t&&t.parentNode&&t.parentNode.removeChild(t),this._load=null}}})),n("plugin/widget",["view","plugin/service","util"],(function(t,e){return{create:function(n){return Object.create(t)._init(["widget"]).upgradeTo(e)._init(n).upgradeTo(this)._init()},_init:function(){return this.isWidget=!0,this},show:function(){if(this._load)return this._el&&this._el.classList.add("show"),this._load;let t=this.load();return this._load.classList.add("widget","show"),t.setAttribute("loading","lazy"),this.actions().add(this.name,{cls:["button-icon","plugin"]},function(t){let e=this.name;void 0!==this.desc&&(e+="\n\n"+this.desc),window.alert(e)}.bind(this)),t},resize:function(t){this.show().style.height=t.height+"px"},onClose:function(){this._mgr&&(this._mgr._closeService(this.id),this._mgr=void 0)}}})),n("state",[],(function(){return{create:function(t){return Object.create(this)._init(t)},_init:function(t){const e=this;return e._assoc=[],null==t?e.values=[!1,!0]:Array.isArray(t)?e.values=t:e.values=[t],e},associate:function(t){t.hasOwnProperty("setState")?(this._assoc.push(t),t.setState(this.value)):console.log("Object "+t+" has no setState() method")},set:function(t){t!=this.value&&(this.value=t,this._assoc.forEach(e=>e.setState(t)))},setIfNotYet:function(t){null==this.value&&this.set(t)},get:function(){return null==this.value&&(this.value=this.values[0]),this.value},associates:function(){return this._assoc.length},clear:function(){return this._assoc=[]},roll:function(){let t=0;for(let e=0;e<this.values.length-1;e++)if(this.get()==this.values[e]){t=e+1;break}this.set(this.values[t])}}})),n("plugin/server",["plugin/widget","plugin/service","state","pageInfo","util"],(function(t,e,n,i){KorAP.Panel=KorAP.Panel||{};var r={},o={},s={match:[]},a={query:[],result:[]},c={};return{create:function(){return Object.create(this)._init()},_init:function(){return this},register:function(t){var e=t.name;if(!e)throw new Error("Missing name of plugin");var i=t.desc,c=o[e]={name:e,desc:i,about:t.about,widgets:[],services:[]};if("object"!=typeof t.embed)throw new Error("Embedding of plugin is no list");var l=this;t.embed.forEach((function(t){if("object"!=typeof t)throw new Error("Embedding of plugin is no object");let o=t.title,u=t.panel,h=t.onClick,d=t.icon;if(!u||!s[u]&&!a[u])throw new Error("Panel for plugin is invalid");if(h.action&&"addWidget"!=h.action&&"setWidget"!=h.action){if("toggle"==h.action){let t=n.create([!0,!1]);void 0!==h.default&&t.setIfNotYet(h.default),KorAP.Panel[u].actions().addToggle(o,{cls:["title"]},t);let i=this.addService({name:e,src:h.template,permissions:h.permissions}),s=r[i];s.load().onload=function(){let e={setState:function(t){s.sendMsg({action:"state",key:h.state,value:t})}};t.associate(e)},c.services.push(i)}}else{let f=function(t){if("state"in this.button&&this.button.state.associates()>0){let t=this.button.state;if(r[this.button.widgetID])return void t.roll();t.clear(),t.set(!0)}let n=l.addWidget(this,{name:e,src:h.template,permissions:h.permissions,desc:i});c.widgets.push(n),"state"in this.button&&(this.button.widgetID=n,this.button.state.associate({setState:function(t){0==t?r[n].minimize():r[n].show()}}))},p={cls:t.classes,icon:d};h.action&&"setWidget"==h.action&&(p.state=n.create([!0,!1])),s[u]?s[u].push([o,p,f]):KorAP.Panel[u]?KorAP.Panel[u].actions().add(o,p,f):a[u].push([o,p,f])}}),this)},_interpolateURI:function(t,e){},buttonGroup:function(t){return null!=s[t]?s[t]:null!=a[t]?a[t]:[]},clearButtonGroup:function(t){null!=s[t]?s[t]=[]:null!=a[t]&&(a[t]=[])},_getServiceID:function(){return this._listener||(this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this._timer=window.setInterval((function(){for(let t=0;t<c.length;t++)c[t]++>=100&&(c[t]=100)}),1e3)),"id-"+this._randomID()},addService:function(t){if(!t.src)return;let n=this._getServiceID();t.id=n;let i=e.create(t);return r[n]=i,c[n]=100,this.element().appendChild(i.load()),n},addWidget:function(e,n){let i=this._getServiceID();n.id=i;var o=t.create(n);return r[i]=o,c[i]=100,o._mgr=this,e.add(o),i},service:function(t){return r[t]},_receiveMsg:function(t){var e=t.data;if(!e)return;var n=e.originID;if(!n)return;let o=r[n];if(o){if(c[n]--<0)return KorAP.log(0,"Suspicious action by service",o.src),this._closeService(o.id),void o.close();switch(e.action){case"resize":o.isWidget&&o.resize(e);break;case"log":KorAP.log(e.code,e.msg,o.src);break;case"pipe":null!=KorAP.Pipe&&("del"==e.job?KorAP.Pipe.remove(e.service):KorAP.Pipe.append(e.service));break;case"get":if("KQ"==e.key)void 0!==KorAP.koralQuery&&(e.value=KorAP.koralQuery);else if("QueryForm"==e.key){let t=document,n=e.value={};var s;(s=t.getElementById("q-field"))&&(n.q=s.value),(s=t.getElementById("ql-field"))&&(n.ql=s.value),(s=KorAP.vc)&&(n.cq=s.toQuery())}else if("QueryParam"==e.key){var a=new URLSearchParams(window.location.search);let t=e.value={};t.search=window.location.search,t.q=a.get("q"),t.ql=a.get("ql"),t.cq=a.get("cq")}else if("Pagination"==e.key){const t=i.create();let n=e.value={};n.page=t.page(),n.total=t.total(),n.count=t.count()}e._id&&o.sendMsg(e);break;case"redirect":const t=new URL(window.location);e.queryParam&&(t.search=new URLSearchParams(e.queryParam)),window.location=t.toString()}}},_closeService:function(t){delete c[t],r[t]&&r[t]._closeIframe&&(r[t]._closeIframe(),delete r[t]),0==Object.keys(c).length&&this._removeListener()},_randomID:function(){return function(t){const e=new Uint8Array((t||40)/2);return window.crypto.getRandomValues(e),Array.from(e,f).join("")}(20)},_removeListener:function(){window.clearInterval(this._timer),this._timer=void 0,window.removeEventListener("message",this._listener),this._listener=void 0},element:function(){return this._el||(this._el=document.createElement("div"),this._el.setAttribute("id","services")),this._el},destroy:function(){if(c={},Object.keys(r).forEach(t=>r[t].close()),r={},Object.keys(s).forEach(t=>s[t]=[]),Object.keys(a).forEach(t=>a[t]=[]),this._el){let t=this._el;t.parentNode&&t.parentNode.removeChild(t),this._el=null}this._removeListener()}}})),n("pipe",[],(function(){const t=new RegExp("[a-zA-Z0-9]");function e(e){return(e=e.trim()).match(t)?e:null}return{create:function(){const t=Object.create(this);return t._pipe=[],t},append:function(t){(t=e(t))&&(this._pipe.push(t),this._update())},prepend:function(t){(t=e(t))&&(this._pipe.unshift(t),this._update())},remove:function(t){const e=this._pipe.indexOf(t);-1!=e&&(this._pipe.splice(e,1),this._update())},size:function(){return this._pipe.length},toString:function(){return this._pipe.join(",")},_update:function(){null!=this.e&&this.e.setAttribute("value",this.toString())},element:function(){let t=this.e;return null==t&&(t=this.e=document.createElement("input"),t.setAttribute("type","text"),t.setAttribute("name","pipe"),t.classList.add("pipe")),t}}})),n("api",["util"],(function(){KorAP.URL=void 0!==KorAP.URL?KorAP.URL:"",KorAP.API=KorAP.API||{};const t=new RegExp("^([^_]+)_([^\\.]+)\\.(.+?)$");function e(t,e,n,i,r,o){console.log(arguments);const s=new XMLHttpRequest;s.open(t,e,!0);const a=new CustomEvent("korapRequest",{bubbles:!1,detail:{url:e,title:n}});window.dispatchEvent(a),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Content-Type","application/json"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.onload=function(){console.log(s.responseText)},s.onreadystatechange=function(){if(4==this.readyState){if("GET"===t){let t;try{t=JSON.parse(this.responseText)}catch(t){return KorAP.log(0,t),console.log(t),void r(void 0)}void 0!==t&&void 0!==t.errors?t.errors.forEach(t=>KorAP.log(t[0],t[1]||"Unknown")):200!==this.status&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e),200===this.status?r(t):r(void 0)}else(this.status>=300||this.status<200)&&KorAP.log(this.status,this.statusText,"Remote service error (XMLHttpRequest) under URL: "+e);"function"==typeof o&&o({status:this.status,statusText:this.statusText+" - "+JSON.parse(this.responseText).errors[0].message})}},"POST"===t||"PUT"===t?(console.log("JSON: \n",JSON.stringify(i)),console.log(s),s.send(JSON.stringify(i))):s.send()}KorAP.API.getMatchInfo=function(e,n,i){let r=KorAP.URL+"/corpus";const o=t.exec(e.textSigle);let s="";s=null!==o&&o[0]?o[1]+"/"+o[2]+"/"+o[3]:e.textSigle,s+="/"+e.matchID,r+="/"+s,1==n.spans?(r+="?spans=true",s+=" +spans ",void 0!==n.foundry&&(r+="&foundry="+n.foundry,s+=n.foundry),void 0!==n.layer&&(r+="&layer="+n.layer,s+="/"+n.layer)):(s+=" -spans",r+="?spans=false"),KorAP.API.getJSON(r,i,"MatchInfo: "+s)},KorAP.API.getTextInfo=function(t,e,n){let i=KorAP.URL+"/corpus/"+t.textSigle;void 0!==e.fields?i+="?fields=":i+="?fields=@all",KorAP.API.getJSON(i,n,"TextInfo: "+t.textSigle)},KorAP.API.getCollections=function(t){KorAP.API.getJSON(KorAP.URL+"/collection",t,"CorpusInfo")},KorAP.API.getCorpStat=function(t,e){let n=KorAP.URL+"/corpus?cq="+encodeURIComponent(t);KorAP.API.getJSON(n,e,"CorpusInfo: "+t)},KorAP.API.getPluginList=function(t,e){KorAP.API.getJSON(t,e,"Plugin-List")},KorAP.API.getJSON=function(t,n,i,r){e("GET",t,i,void 0,n,r)},KorAP.API.putJSON=function(t,n,i,r){e("PUT",t,i,n,void 0,r)},KorAP.API.postJSON=function(t,n,i,r){e("POST",t,i,n,void 0,r)},KorAP.API.deleteJSON=function(t,n,i){e("DELETE",t,n,void 0,void 0,i)},KorAP.API.getQueryList=function(t,e){KorAP.API.getJSON(KorAP.URL+"/query/",t,"getSavedQueryList",e)},KorAP.API.getQuery=function(t,e,n){KorAP.API.getJSON(KorAP.URL+"/query/"+t,e,"getSavedQuery of name "+t,n)},KorAP.API.putQuery=function(t,e,n){KorAP.API.putJSON(KorAP.URL+"/query/"+t,e,"putQuery of name "+t,n)},KorAP.API.postQuery=function(t,e,n){KorAP.API.postJSON(KorAP.URL+"/query/"+t,e,"postQuery of name "+t,n)},KorAP.API.deleteQuery=function(t,e){KorAP.API.deleteJSON(KorAP.URL+"/query/"+t,"deleteQuery of name "+t,e)}})),n("mailToChiffre",[],(function(){window.PArok=function(t,e){e&&((t=document.createElement("a")).href=e);var n,o=t.search,s=RegExp,a=String.fromCharCode,c=[];Math.pow;for(d=t.pathname.match(/([^\/]+)\/([^\/]+)$/),p=function(t){for(var e,o,s=0,c="";s<t.length;)if((o=t.charAt(s++)).match(/[A-Za-z]/))c+=a((o<="Z"?90:122)>=(o=o.charCodeAt(0)+13)?o:o-26);else{if("-"!=o)return;for(e="",o=t.charAt(s++);o.match(/\d/);)e+=o,o=t.charAt(s++);s--,c+=a(parseInt(e))}for(l=c.length,r=Math.abs(673%l-l),c=c.substr(r)+c.substr(0,r),n="",i=0;i<l;i++)n+=a(c.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)));return n};o;)o=o.replace(/^[\?\&]([^\&]+)/,""),(n=s.$1).match(/^(sid|b?cc|to)=(.+)$/)?"sid"==s.$1?c.push("to="+p(s.$2)+"@"+p(d[2])):c.push(s.$1+"="+p(s.$2)):c.push(n.replace(/\+/g," "));return location.href="mailto:?"+c.join("&"),!1},document.querySelectorAll(".PArok").forEach(t=>t.addEventListener("click",(function(t){t.preventDefault(),window.PArok(!1,"#"==this.href?this.getAttribute("data-href"):this.href)})))})),n("init",["match","hint","vc","tutorial","lib/domReady","vc/array","lib/alertify","session","selectMenu","panel/result","panel/query","panel/pagination","tour/tours","plugin/server","pipe","api","mailToChiffre","util","state"],(function(t,e,n,i,r,o,s,a,c,l,u,d,f,p,v){const g=document;KorAP.URL=g.body.getAttribute("data-korap-url")||"";const m=g.getElementById("koralQuery");let _;null!==m&&(KorAP.koralQuery=JSON.parse(m.getAttribute("data-koralquery")||"")),KorAP.session=a.create(KorAP.URL.length>0?"kalamarJS-"+KorAP.URL.slugify():"kalamarJS"),window.alertify=s,KorAP.log=function(t,e,n){n&&(e+='<code class="src">'+n+"</code>"),s.log((0===t?"":t+": ")+e,"error",1e4)},KorAP.vc=n.create(o),(_=document.getElementById("link-guided-tour"))&&(_.setAttribute("href","#"),_.addEventListener("click",(function(){f.gTstartSearch().start()})),KorAP.tourshowR=function(){f.gTshowResults().start()}),r((function(n){var r,o,a={},m=KorAP.session.get("show")||{};KorAP.Panel=KorAP.Panel||{},g.querySelectorAll("#notifications div.notify").forEach((function(t){let e=t.textContent,n=t.getAttribute("data-src");n&&(e+='<code class="src">'+n+"</code>");let i=t.getAttribute("data-type")||"error";s.log(e,i,1e4)}));var _=g.getElementById("cq"),y=KorAP.vc;if(_){if(_.style.display="none",(r=g.createElement("span")).setAttribute("id","vc-choose"),r.classList.add("select"),void 0!==KorAP.koralQuery&&(KorAP.koralQuery.collection||KorAP.koralQuery.corpus))try{y.fromJson(KorAP.koralQuery.collection||KorAP.koralQuery.corpus)}catch(t){KorAP.log(0,t)}(o=r.addE("span")).addT(y.getName()),y.wasRewritten()&&o.classList.add("rewritten"),_.parentNode.insertBefore(r,_)}var b=g.querySelectorAll("#search > ol > li");b.forEach((function(e){e.classList.contains("active")?void 0===e._match&&t.create(e).init():(e.addEventListener("click",(function(e){void 0!==this._match?this._match.open():t.create(this).open()})),e.addEventListener("keydown",(function(e){switch(h(e)){case 32:void 0!==this._match?this._match.toggle():t.create(this).open(),e.halt()}})))}));var w=g.getElementsByTagName("aside")[0];if(w&&0==w.classList.contains("active")){var E=!1;w.addEventListener("focus",(function(t){this.classList.add("active")}));var x=g.getElementsByTagName("body")[0];null!==x&&x.addEventListener("click",(function(){E?E=!1:w.classList.remove("active")})),w.addEventListener("click",(function(t){E=!0}))}null!==g.getElementById("ql-field")&&(KorAP.QLmenu=c.create(g.getElementById("ql-field").parentNode).limit(5));var A=g.getElementById("resultinfo"),k=l.create(m);if(null!=A){A.appendChild(k.actions().element());var C=g.getElementById("search");C.insertBefore(k.element(),C.firstChild)}if(void 0!==KorAP.koralQuery&&(null!==A&&k.addKqAction(),KorAP.koralQuery.errors&&KorAP.koralQuery.errors.forEach((function(t){302===t[0]&&void 0!==t[2]?(a.hint=e.create(),a.hint.alert(t[2],t[1])):301===t[0]&&(a.hint=e.create(),a.hint.alert(0,t[1]))}))),b.length>0&&k.addAlignAction(),KorAP.Panel.result=k,r){y.onMinimize=function(){r.classList.remove("active"),delete m.vc},y.onOpen=function(){r.classList.add("active");var t=g.getElementById("vc-view");t.firstChild||t.appendChild(this.element()),m.vc=!0};var T=function(){y.isOpen()?y.minimize():y.open()};r.onclick=T,m.vc&&T.apply()}g.getElementById("view-tutorial")?(window.tutorial=i.create(g.getElementById("view-tutorial"),KorAP.session),a.tutorial=window.tutorial):window.parent&&(a.tutorial=window.parent.tutorial),a.tutorial&&(a.tutorial.initQueries(g),a.tutorial.initDocLinks(g));var P=g.getElementById("searchform");null!==P&&P.addEventListener("submit",(function(t){var e=g.getElementById("q-field");if(void 0===e.value||""===e.value)return e.focus(),t.halt(),void KorAP.log(700,"No query given");KorAP.session.set("show",m),void 0!==y?(_.value=y.toQuery(),""==_.value&&_.removeAttribute("name")):(_.removeAttribute("value"),_.removeAttribute("name")),e.classList.add("loading"),g.getElementById("qsubmit").classList.add("loading")})),KorAP.session.get("tour")&&f.gTshowResults().start(),void 0===a.hint&&(a.hint=e.create()),KorAP.Hint=a.hint;var L=u.create(),S=g.getElementById("searchform"),N=g.getElementById("vc-view");S&&N&&(S.insertBefore(L.element(),N),KorAP.Panel.query=L);const O=d.create();let I;if(O&&(O.addRandomPage(),KorAP.Panel.pagination=O),function(t){const e=t.querySelectorAll("input.copy-to-clipboard");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("copy-to-clipboard"),i.addEventListener("click",(function(){let t=!1;"password"===n.getAttribute("type")&&(n.setAttribute("type","text"),t=!0),n.select(),n.setSelectionRange(0,99999),document.execCommand("copy"),t&&n.setAttribute("type","password")})),n.parentNode.insertBefore(i,n.nextSibling)}}(g),function(t){const e=t.querySelectorAll("input[type=password].show-pwd");for(let t=0;t<e.length;t++){const n=e[t],i=document.createElement("a");i.classList.add("show-pwd"),i.addEventListener("click",(function(){if("password"===n.getAttribute("type"))return n.setAttribute("type","text"),void i.classList.add("hide");n.setAttribute("type","password"),i.classList.remove("hide")})),n.parentNode.insertBefore(i,n.nextSibling)}}(g),I=g.getElementById("kalamar-plugins")){let t=I.getAttribute("data-plugins");void 0!==t&&KorAP.API.getPluginList(t,(function(t){if(t&&t.length>0){KorAP.Plugin=p.create(),g.head.appendChild(KorAP.Plugin.element()),KorAP.Pipe=v.create(),g.getElementById("searchform").appendChild(KorAP.Pipe.element());try{t.forEach(t=>KorAP.Plugin.register(t))}catch(t){KorAP.log(0,t)}}}))}return a}))})),window.KorAP=window.KorAP||{},KorAP.Locale=KorAP.Locale||{},e(["loc/dereko","init"]),n("app/en",(function(){}))}();
\ No newline at end of file
diff --git a/public/js/kalamar-0.43.1-en.js.map b/public/js/kalamar-0.43.1-en.js.map
new file mode 100644
index 0000000..a8093dd
--- /dev/null
+++ b/public/js/kalamar-0.43.1-en.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["public/js/kalamar-0.43.1-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","upgradeTo","props","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","_prefixPosition","cItem","addMenu","addPrefix","prefItem","removeItem","removeItemByIndex","exit","makeActive","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","ds","dataset","total","count","pageInfoClass","RANDOM_PAGE","pagEl","bg","lastElementChild","_bg","addRandomPage","pi","sp","URLSearchParams","factory","globalThis","introJs","_typeof","Symbol","iterator","forEachFnc","completeFnc","DOMEvent","events_key","_id","listener","on","useCapture","handler","commonjsGlobal","createCommonjsModule","version$1","global_1","fails","descriptors","$propertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor$1","getOwnPropertyDescriptor","objectPropertyIsEnumerable","V","createPropertyDescriptor","bitmap","classofRaw","indexedObject","requireObjectCoercible","toIndexedObject","aFunction$1","getBuiltIn","namespace","method","engineUserAgent","process","Deno","versions","v8","engineV8Version","nativeSymbol","getOwnPropertySymbols","symbol","sham","useSymbolAsUid","isSymbol","$Symbol","setGlobal","sharedStore","shared","mode","copyright","toObject","argument","has$1","postfix","uid","WellKnownSymbolsStore","Symbol$1","createWellKnownSymbol","withoutSetter","wellKnownSymbol","TO_PRIMITIVE","toPrimitive","exoticToPrim","ordinaryToPrimitive","toPropertyKey","document$1","EXISTS","documentCreateElement","ie8DomDefine","$getOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","anObject","$defineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","functionToString","inspectSource","WeakMap$1","WeakMap","nativeWeakMap","sharedKey","hiddenKeys$1","wmget","wmhas","wmset","metadata","facade","STATE","activeXDocument","internalState","enforce","getterFor","TYPE","redefine","getInternalState","enforceInternalState","TEMPLATE","unsafe","simple","noTargetGet","floor$2","toInteger","min$4","toLength","max$3","min$3","toAbsoluteIndex","integer","createMethod$2","IS_INCLUDES","$this","arrayIncludes","objectKeysInternal","names","enumBugKeys","hiddenKeys","objectGetOwnPropertyNames","getOwnPropertyNames","objectGetOwnPropertySymbols","ownKeys","copyConstructorProperties","replacement","isForced","feature","detection","POLYFILL","NATIVE","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","toString_1","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","regexpStickyHelpers","UNSUPPORTED_Y","BROKEN_CARET","objectKeys","objectDefineProperties","defineProperties","Properties","IE_PROTO","EmptyConstructor","scriptTag","LT","NullProtoObjectViaActiveX","parentWindow","NullProtoObject","ActiveXObject","domain","iframeDocument","iframe","contentWindow","F","NullProtoObjectViaIFrame","re1","re2","objectCreate","regexpUnsupportedDotAll","flags","regexpUnsupportedNcg","groups","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","UNSUPPORTED_Y$1","NPCG_INCLUDED","reCopy","raw","charsAdded","strCopy","regexpExec","SPECIES$4","RegExpPrototype$1","fixRegexpWellKnownSymbolLogic","KEY","FORCED","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","regexp","arg2","forceStringMethod","$exec","done","createMethod$1","CONVERT_TO_STRING","second","codeAt","advanceStringIndex","regexpExecAbstract","MATCH","nativeMatch","maybeCallNative","matcher","rx","res","fullUnicode","A","matchStr","arg","createProperty","propertyKey","SPECIES$3","arraySpeciesCreate","originalArray","SPECIES$2","arrayMethodHasSpeciesSupport","METHOD_NAME","foo","IS_CONCAT_SPREADABLE","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","test$1","toStringTagSupport","TO_STRING_TAG","CORRECT_ARGUMENTS","classof","tryGet","callee","objectToString","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","MATCH$1","isRegexp","aFunction","SPECIES$1","arrayPush","min$2","addClass","SVGElement","pre","getPropValue","propName","propValue","currentStyle","defaultView","scrollParentToElement","targetElement","_options","scrollToElement","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","getScrollParent","offsetTop","getWinSize","innerWidth","innerHeight","D","documentElement","tooltipLayer","elementInViewport","winHeight","scrollBy","scrollPadding","setAnchorAsButton","tabIndex","SPLIT","nativeSplit","internalSplit","separator","lastLength","output","lastLastIndex","separatorCopy","splitter","defaultConstructor","speciesConstructor","unicodeMatching","z","originalExec","$assign","objectAssign","chr","T","argumentsLength","isFixed","getOffset","relativeEl","docEl","pageYOffset","xr","relativeElPosition","floor$1","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","getSubstitution","matched","captures","namedCaptures","tailPos","symbols","ch","capture","REPLACE","max$2","min$1","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","removeClass","classNameRegex","setStyle","cssText","rule","setHelperLayerPosition","helperLayer","_introItems","_currentStep","currentElement","elementPosition","_targetElement","widthHeightPadding","helperElementPadding","UNSAFE_SUBSTITUTE","searchValue","replaceValue","replacer","functionalReplace","accumulatedResult","nextSourcePosition","replacerArgs","UNSCOPABLES","ArrayPrototype","$includes","HAS_SPECIES_SUPPORT$2","SPECIES","nativeSlice","max$1","Constructor","fin","notARegexp","error1","error2","correctIsRegexpLogic","searchString","arrayMethodIsStrict","nativeJoin","ES3_STRINGS","STRICT_METHOD$1","createMethod","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","specificCreate","boundFunction","functionBindContext","$filter","filterReject","checkRight","targetOffset","tooltipLayerStyleLeft","tooltipOffset","windowSize","checkLeft","tooltipLayerStyleRight","HAS_SPECIES_SUPPORT","removeEntry","stringArray","stringToRemove","_determineAutoPosition","desiredTooltipPosition","possiblePositions","positionPrecedence","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","_determineAutoAlignment","placeTooltip","arrowLayer","hintMode","currentStepObj","currentTooltipPosition","tooltipCssClass","marginTop","tooltipClass","autoPosition","tooltipLayerStyleLeftRight","showStepNumbers","removeShowElement","elm","_createElement","tagname","setAttRegex","animate","existingOpacity","opacity","_getProgress","_disableInteraction","disableInteractionLayer","_createBullets","bulletsLayer","showBullets","ulContainer","anchorClick","goToStep","innerLi","anchorLink","_recreateBullets","oldReferenceLayer","existing","_updateBullets","_createProgressBar","progressLayer","showProgress","progressBar","progressBarAdditionalClass","_updateProgressBar","_showElement","_this","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","oldHelperLayer","highlightClass","oldHelperNumberLayer","oldtooltipLayer","oldTooltipTitleLayer","oldArrowLayer","oldtooltipContainer","_lastShowElementTimer","intro","referenceLayer","tooltipTextLayer","tooltipHeaderLayer","tooltipTitleLayer","buttonsLayer","box-shadow","overlayOpacity","showButtons","helperNumberLayer","nextStep","_introCompleteCallback","exitIntro","nextLabel","previousStep","prevLabel","skipLabel","_introSkipCallback","disableInteraction","buttonClass","hidePrev","hideNext","nextToDone","doneLabel","currentElementPosition","setShowElement","_introAfterChangeCallback","goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","currentStep","onKeyDown","which","exitOnEsc","srcElement","returnValue","cloneObject","hintQuerySelectorAll","selector","hintsWrapper","hideHint","stepId","removeHintTooltip","_hintCloseCallback","hideHints","showHints","_this2","hints","showHint","populateHints","removeHints","_this3","removeHint","addHints","_this4","evt","cancelBubble","showHintDialog","getHintClick","hintAnimation","hintDot","hintPulse","alignHintPosition","hintPosition","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","hintButtonLabel","tooltip","targetElm","_this5","currentItem","tooltipPosition","reAlignHints","_this6","_ref2","deleteCount","insertCount","actualDeleteCount","actualStart","mergeSort","comparefn","insertionSort","llength","rlength","lindex","rindex","arraySort","firefox","engineFfVersion","engineIsIeOrEdge","webkit","engineWebkitVersion","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","STRICT_METHOD","STABLE_SORT","fetchIntroSteps","allIntroSteps","introItems","steps","floatingElementQuery","tempIntroItems","refresh","refreshSteps","onResize","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","_introExitCallback","addOverlayLayer","exitOnOverlayClick","cursor","introForElement","keyboardNavigation","itemsLength","arrayLength","getSortCompare","IntroJs","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","mergeOptions","addStep","addSteps","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","introClass","hintClass","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welcti","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","TOUR_sear1ti","TOUR_searAnnotti","TOUR_annotAssti","TOUR_vccho1ti","TOUR_vccho2ti","TOUR_vcStat1ti","TOUR_vcStat2ti","TOUR_qlfieldti","TOUR_glimpseti","TOUR_helpti","TOUR_seargoti","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","setIfNotYet","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","responseText","onreadystatechange","retJSObj","status","statusText","errors","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","paginationPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","paginationPanel","pe","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n/**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\nObject.prototype.upgradeTo  = function (props) {\r\n  for (let prop in props) {\r\n    this[prop] = props[prop];\r\n  };\r\n  return this;\r\n};\r\n\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\r\n\nwindow.KorAP = window.KorAP || {};\r\n\r\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined) {\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    }\r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array(); //all childNodes, i.e. ItemClass, prefixClass\r\n\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined; //filtered List containing all itemClass items\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n\r\n    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      //Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n    removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      //Upon Change please update alwaysmenu.js prev\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[this._notItemElements]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\n// TODO:\r\n//   Add addToggle() method\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the list of items and the itemClass.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\tthis.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\r\n     */\r\n    panel : function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n\r\n      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\r\n    },\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\r\n    },\r\n\r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor !== null && anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\r\n    },\r\n    \r\n\r\n    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\r\n    },\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \r\n      let b = this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      b.list = list;\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t._actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions().element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this._actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this._actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions().element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"^(?:[^ \\:\\.\\'\\\\\\\\\\|\\&]+:)?[^ \\:\\.\\'\\\\\\\\\\|\\&]+$\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) === null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\r\n\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n    * \r\n    * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n    * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n    * @returns The container object\r\n    */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      //items are stored in the order they are added in. This includes the prefix.\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container,\r\n      // 0 to length-1 = in container\r\n\r\n      this._prefixPosition = undefined; //Required so that switching\r\n      // to prefix by default is supported\r\n\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\r\n\r\n  },\r\n\r\n    /**\r\n     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      this._prefixPosition = this.items.length;\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n    \r\n    //Taken from Branch 5133\r\n    /**\r\n    * Remove a containeritem from the container by identity. Should not be used with prefix.\r\n    * If the active item is removed, this calls menu.next().\r\n    * @param {containerItemClass} item The item to be removed.\r\n    */\r\n     removeItem : function (item) {\r\n      if (item.active()) {\r\n        this._menu.next();\r\n      }\r\n      item._menu=undefined;\r\n      this._el.removeChild(item.element());\r\n      this.items.splice(this.items.indexOf(item) , 1);\r\n      //TODO what to do when we completely empty the item and containeritem lists???\r\n      //Nothing is active anymore and the arrow keys do not work then.\r\n    },\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      if (index < 0 || index >= this.length()){\r\n        KorAP.log(0,\"Invalid index in containers removeItemByIndex: \"+index, \"container.js\");\r\n        return;\r\n      };\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n    /**\r\n    * Exit the container unconditionally. Required so that active returns the\r\n    * correct result. Called when the prefix or similar resets the currently visual\r\n    * field.\r\n    */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n    * @returns whether an item within the container is active (by checking this.position)\r\n    */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n    * Getter for items\r\n    * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n    * @returns item at location index\r\n    */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * \r\n     * Make the container active without having called prev or next.\r\n     * Occurs whenever the prefix makes the\r\n     * menus list empty while we had it selected.\r\n     * This potentially requires adjusting this.position.\r\n     */\r\n     makeActive : function () {\r\n      if (this.position === undefined) {\r\n        if (this._cItemPrefix.isSelectable()) {\r\n          this.position = this._prefixPosition; //make prefix active if it exists\r\n          this.item().active(true);\r\n        } else if (this.liveLength() > 0) {\r\n          this.position = 0;\r\n          this._cItemPrefix.active(false); // usually the menu makes the prefix active anyway.\r\n          this.item().active(true);\r\n        }\r\n      }\r\n    },\r\n    \r\n    /**\r\n     * \r\n    * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n    * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n    * \r\n    * @returns The number of items that are selectable. Is the actual length of the list.\r\n    */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\r\n\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //There are only four new lines, marked with NEW\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n      t.container().exit(); //NEW\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);        \r\n        t.container().makeActive(); //NEW Incase the own\r\n        // list becomes empty we need to make container active for line 129 to work\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._el.classList.add('visible'); //NEW\r\n\r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n      t.container()._el.classList.add('visible'); //NEW\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () { //only one new line\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\r\n        };\r\n      }// The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        }\r\n      }\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n    \r\n    /**\r\n    * Upgrade this object to another object,\r\n    * while private data stays intact.\r\n    *\r\n    * @param {Object} An object with properties.\r\n    */\r\n   upgradeTo : function (props) {\r\n     for (var prop in props) {\r\n       this[prop] = props[prop];\r\n     };\r\n     return this;\r\n   },\r\n\r\n    /**\r\n     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\r\n\r\n\r\n  };\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menuCollection   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menuCollection[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menuCollection[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menuCollection[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions().add.apply(this.actions(), i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions().add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions().add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions();\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The pagination panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/pagination',[\r\n  'panel',\r\n  'buttongroup',\r\n  'pageInfo'\r\n], function (panelClass, buttonGroupClass, pageInfoClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.RANDOM_PAGE = loc.RANDOM_PAGE || 'Random page';\r\n\r\n  \r\n  return {\r\n    create : function () {\r\n      return Object.create(panelClass)._init(['pagination']).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function () {\r\n\r\n      // Override existing button group\r\n      // This allows actions.add() ... to work for list items in server.js\r\n      let pagEl = document.getElementById(\"pagination\");\r\n      if (pagEl === null) {\r\n        return null;\r\n      };\r\n\r\n      // Do not show if no pages exist\r\n      if (pagEl.getAttribute('data-total') === '0') {\r\n        return null;\r\n      };\r\n\r\n      this._actions.panel = undefined;\r\n      this._actions.clear();\r\n\r\n      const bg = buttonGroupClass.adopt(pagEl);\r\n      bg._omOutside = true;\r\n      bg._omLeft = true;\r\n      \r\n      bg.anchor(pagEl.lastElementChild);\r\n\r\n      let button = bg.addList(\"More\", {'cls':['button-group-list','button-icon']});\r\n      this._actions = button.list;\r\n      this._bg = bg;\r\n\r\n      button.setAttribute('data-icon',\"\\uf0c9\");\r\n\r\n      // Warning: This is circular\r\n      this._actions.panel = this;\r\n     \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The buttongroup holding the pagination panel.\r\n     * This differs from action, as action contains the list.\r\n     */\r\n    buttonGroup : function () {\r\n      return this._bg;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add random paginator to list\r\n     */\r\n    addRandomPage : function () {\r\n      const pi = pageInfoClass.create();\r\n      \r\n      const button = this.actions().add(\r\n        loc.RANDOM_PAGE,\r\n        {},\r\n        function () {\r\n          if (pi.total() > 0) {\r\n            const sp = new URLSearchParams(window.location.search);\r\n            sp.set(\"p\", Math.floor(Math.random() * pi.total()) + 1);\r\n            window.location.search = sp.toString();\r\n          };\r\n        }\r\n      )\r\n    }\r\n  }\r\n});\r\n\n/*!\r\n * Intro.js v4.2.2\r\n * https://introjs.com\r\n *\r\n * Copyright (C) 2012-2021 Afshin Mehrabani (@afshinmeh).\r\n * https://raw.githubusercontent.com/usablica/intro.js/master/license.md\r\n *\r\n * Date: Fri, 27 Aug 2021 12:07:05 GMT\r\n */\r\n\r\n(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n  typeof define === 'function' && define.amd ? define('lib/intro',factory) :\r\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.introJs = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n  function _typeof(obj) {\r\n    \"@babel/helpers - typeof\";\r\n\r\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n      _typeof = function (obj) {\r\n        return typeof obj;\r\n      };\r\n    } else {\r\n      _typeof = function (obj) {\r\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n      };\r\n    }\r\n\r\n    return _typeof(obj);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function mergeOptions(obj1, obj2) {\r\n    var obj3 = {};\r\n    var attrname;\r\n\r\n    for (attrname in obj1) {\r\n      obj3[attrname] = obj1[attrname];\r\n    }\r\n\r\n    for (attrname in obj2) {\r\n      obj3[attrname] = obj2[attrname];\r\n    }\r\n\r\n    return obj3;\r\n  }\r\n\r\n  /**\r\n   * Mark any object with an incrementing number\r\n   * used for keeping track of objects\r\n   *\r\n   * @param Object obj   Any object or DOM Element\r\n   * @param String key\r\n   * @return Object\r\n   */\r\n  var stamp = function () {\r\n    var keys = {};\r\n    return function stamp(obj) {\r\n      var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"introjs-stamp\";\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0; // stamp only once per object\r\n\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  }();\r\n\r\n  /**\r\n   * Iterates arrays\r\n   *\r\n   * @param {Array} arr\r\n   * @param {Function} forEachFnc\r\n   * @param {Function} [completeFnc]\r\n   * @return {Null}\r\n   */\r\n  function forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof completeFnc === \"function\") {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * DOMEvent Handles all DOM events\r\n   *\r\n   * methods:\r\n   *\r\n   * on - add event handler\r\n   * off - remove event\r\n   */\r\n\r\n  var DOMEvent = function () {\r\n    function DOMEvent() {\r\n      var events_key = \"introjs_event\";\r\n      /**\r\n       * Gets a unique ID for an event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type event type\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @return String\r\n       */\r\n\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + stamp(listener) + (context ? \"_\".concat(stamp(context)) : \"\");\r\n      };\r\n      /**\r\n       * Adds event listener\r\n       *\r\n       * @param obj Object obj\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = function handler(e) {\r\n          return listener.call(context || obj, e || window.event);\r\n        };\r\n\r\n        if (\"addEventListener\" in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if (\"attachEvent\" in obj) {\r\n          obj.attachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n      /**\r\n       * Removes event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if (\"removeEventListener\" in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if (\"detachEvent\" in obj) {\r\n          obj.detachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  }();\r\n\r\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\r\n\r\n  function createCommonjsModule(fn, module) {\r\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\r\n  }\r\n\r\n  var check = function (it) {\r\n    return it && it.Math == Math && it;\r\n  };\r\n\r\n  // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\r\n  var global_1 =\r\n    // eslint-disable-next-line es/no-global-this -- safe\r\n    check(typeof globalThis == 'object' && globalThis) ||\r\n    check(typeof window == 'object' && window) ||\r\n    // eslint-disable-next-line no-restricted-globals -- safe\r\n    check(typeof self == 'object' && self) ||\r\n    check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\r\n    // eslint-disable-next-line no-new-func -- fallback\r\n    (function () { return this; })() || Function('return this')();\r\n\r\n  var fails = function (exec) {\r\n    try {\r\n      return !!exec();\r\n    } catch (error) {\r\n      return true;\r\n    }\r\n  };\r\n\r\n  // Detect IE8's incomplete defineProperty implementation\r\n  var descriptors = !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n    return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\r\n  });\r\n\r\n  var $propertyIsEnumerable = {}.propertyIsEnumerable;\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;\r\n\r\n  // Nashorn ~ JDK8 bug\r\n  var NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({ 1: 2 }, 1);\r\n\r\n  // `Object.prototype.propertyIsEnumerable` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\r\n  var f$4 = NASHORN_BUG ? function propertyIsEnumerable(V) {\r\n    var descriptor = getOwnPropertyDescriptor$1(this, V);\r\n    return !!descriptor && descriptor.enumerable;\r\n  } : $propertyIsEnumerable;\r\n\r\n  var objectPropertyIsEnumerable = {\r\n  \tf: f$4\r\n  };\r\n\r\n  var createPropertyDescriptor = function (bitmap, value) {\r\n    return {\r\n      enumerable: !(bitmap & 1),\r\n      configurable: !(bitmap & 2),\r\n      writable: !(bitmap & 4),\r\n      value: value\r\n    };\r\n  };\r\n\r\n  var toString = {}.toString;\r\n\r\n  var classofRaw = function (it) {\r\n    return toString.call(it).slice(8, -1);\r\n  };\r\n\r\n  var split = ''.split;\r\n\r\n  // fallback for non-array-like ES3 and non-enumerable old V8 strings\r\n  var indexedObject = fails(function () {\r\n    // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\r\n    // eslint-disable-next-line no-prototype-builtins -- safe\r\n    return !Object('z').propertyIsEnumerable(0);\r\n  }) ? function (it) {\r\n    return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\r\n  } : Object;\r\n\r\n  // `RequireObjectCoercible` abstract operation\r\n  // https://tc39.es/ecma262/#sec-requireobjectcoercible\r\n  var requireObjectCoercible = function (it) {\r\n    if (it == undefined) throw TypeError(\"Can't call method on \" + it);\r\n    return it;\r\n  };\r\n\r\n  // toObject with fallback for non-array-like ES3 strings\r\n\r\n\r\n\r\n  var toIndexedObject = function (it) {\r\n    return indexedObject(requireObjectCoercible(it));\r\n  };\r\n\r\n  var isObject = function (it) {\r\n    return typeof it === 'object' ? it !== null : typeof it === 'function';\r\n  };\r\n\r\n  var aFunction$1 = function (variable) {\r\n    return typeof variable == 'function' ? variable : undefined;\r\n  };\r\n\r\n  var getBuiltIn = function (namespace, method) {\r\n    return arguments.length < 2 ? aFunction$1(global_1[namespace]) : global_1[namespace] && global_1[namespace][method];\r\n  };\r\n\r\n  var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\r\n\r\n  var process = global_1.process;\r\n  var Deno = global_1.Deno;\r\n  var versions = process && process.versions || Deno && Deno.version;\r\n  var v8 = versions && versions.v8;\r\n  var match, version$1;\r\n\r\n  if (v8) {\r\n    match = v8.split('.');\r\n    version$1 = match[0] < 4 ? 1 : match[0] + match[1];\r\n  } else if (engineUserAgent) {\r\n    match = engineUserAgent.match(/Edge\\/(\\d+)/);\r\n    if (!match || match[1] >= 74) {\r\n      match = engineUserAgent.match(/Chrome\\/(\\d+)/);\r\n      if (match) version$1 = match[1];\r\n    }\r\n  }\r\n\r\n  var engineV8Version = version$1 && +version$1;\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\r\n  var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\r\n    var symbol = Symbol();\r\n    // Chrome 38 Symbol has incorrect toString conversion\r\n    // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\r\n    return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\r\n      // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\r\n      !Symbol.sham && engineV8Version && engineV8Version < 41;\r\n  });\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n  var useSymbolAsUid = nativeSymbol\r\n    && !Symbol.sham\r\n    && typeof Symbol.iterator == 'symbol';\r\n\r\n  var isSymbol = useSymbolAsUid ? function (it) {\r\n    return typeof it == 'symbol';\r\n  } : function (it) {\r\n    var $Symbol = getBuiltIn('Symbol');\r\n    return typeof $Symbol == 'function' && Object(it) instanceof $Symbol;\r\n  };\r\n\r\n  // `OrdinaryToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-ordinarytoprimitive\r\n  var ordinaryToPrimitive = function (input, pref) {\r\n    var fn, val;\r\n    if (pref === 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (pref !== 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    throw TypeError(\"Can't convert object to primitive value\");\r\n  };\r\n\r\n  var setGlobal = function (key, value) {\r\n    try {\r\n      // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n      Object.defineProperty(global_1, key, { value: value, configurable: true, writable: true });\r\n    } catch (error) {\r\n      global_1[key] = value;\r\n    } return value;\r\n  };\r\n\r\n  var SHARED = '__core-js_shared__';\r\n  var store$1 = global_1[SHARED] || setGlobal(SHARED, {});\r\n\r\n  var sharedStore = store$1;\r\n\r\n  var shared = createCommonjsModule(function (module) {\r\n  (module.exports = function (key, value) {\r\n    return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\r\n  })('versions', []).push({\r\n    version: '3.16.1',\r\n    mode: 'global',\r\n    copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\r\n  });\r\n  });\r\n\r\n  // `ToObject` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toobject\r\n  var toObject = function (argument) {\r\n    return Object(requireObjectCoercible(argument));\r\n  };\r\n\r\n  var hasOwnProperty = {}.hasOwnProperty;\r\n\r\n  var has$1 = Object.hasOwn || function hasOwn(it, key) {\r\n    return hasOwnProperty.call(toObject(it), key);\r\n  };\r\n\r\n  var id = 0;\r\n  var postfix = Math.random();\r\n\r\n  var uid = function (key) {\r\n    return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\r\n  };\r\n\r\n  var WellKnownSymbolsStore = shared('wks');\r\n  var Symbol$1 = global_1.Symbol;\r\n  var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\r\n\r\n  var wellKnownSymbol = function (name) {\r\n    if (!has$1(WellKnownSymbolsStore, name) || !(nativeSymbol || typeof WellKnownSymbolsStore[name] == 'string')) {\r\n      if (nativeSymbol && has$1(Symbol$1, name)) {\r\n        WellKnownSymbolsStore[name] = Symbol$1[name];\r\n      } else {\r\n        WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\r\n      }\r\n    } return WellKnownSymbolsStore[name];\r\n  };\r\n\r\n  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\r\n\r\n  // `ToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toprimitive\r\n  var toPrimitive = function (input, pref) {\r\n    if (!isObject(input) || isSymbol(input)) return input;\r\n    var exoticToPrim = input[TO_PRIMITIVE];\r\n    var result;\r\n    if (exoticToPrim !== undefined) {\r\n      if (pref === undefined) pref = 'default';\r\n      result = exoticToPrim.call(input, pref);\r\n      if (!isObject(result) || isSymbol(result)) return result;\r\n      throw TypeError(\"Can't convert object to primitive value\");\r\n    }\r\n    if (pref === undefined) pref = 'number';\r\n    return ordinaryToPrimitive(input, pref);\r\n  };\r\n\r\n  // `ToPropertyKey` abstract operation\r\n  // https://tc39.es/ecma262/#sec-topropertykey\r\n  var toPropertyKey = function (argument) {\r\n    var key = toPrimitive(argument, 'string');\r\n    return isSymbol(key) ? key : String(key);\r\n  };\r\n\r\n  var document$1 = global_1.document;\r\n  // typeof document.createElement is 'object' in old IE\r\n  var EXISTS = isObject(document$1) && isObject(document$1.createElement);\r\n\r\n  var documentCreateElement = function (it) {\r\n    return EXISTS ? document$1.createElement(it) : {};\r\n  };\r\n\r\n  // Thank's IE8 for his funny defineProperty\r\n  var ie8DomDefine = !descriptors && !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\r\n    return Object.defineProperty(documentCreateElement('div'), 'a', {\r\n      get: function () { return 7; }\r\n    }).a != 7;\r\n  });\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\r\n\r\n  // `Object.getOwnPropertyDescriptor` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\r\n  var f$3 = descriptors ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\r\n    O = toIndexedObject(O);\r\n    P = toPropertyKey(P);\r\n    if (ie8DomDefine) try {\r\n      return $getOwnPropertyDescriptor(O, P);\r\n    } catch (error) { /* empty */ }\r\n    if (has$1(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\r\n  };\r\n\r\n  var objectGetOwnPropertyDescriptor = {\r\n  \tf: f$3\r\n  };\r\n\r\n  var anObject = function (it) {\r\n    if (!isObject(it)) {\r\n      throw TypeError(String(it) + ' is not an object');\r\n    } return it;\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n  var $defineProperty = Object.defineProperty;\r\n\r\n  // `Object.defineProperty` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperty\r\n  var f$2 = descriptors ? $defineProperty : function defineProperty(O, P, Attributes) {\r\n    anObject(O);\r\n    P = toPropertyKey(P);\r\n    anObject(Attributes);\r\n    if (ie8DomDefine) try {\r\n      return $defineProperty(O, P, Attributes);\r\n    } catch (error) { /* empty */ }\r\n    if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\r\n    if ('value' in Attributes) O[P] = Attributes.value;\r\n    return O;\r\n  };\r\n\r\n  var objectDefineProperty = {\r\n  \tf: f$2\r\n  };\r\n\r\n  var createNonEnumerableProperty = descriptors ? function (object, key, value) {\r\n    return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\r\n  } : function (object, key, value) {\r\n    object[key] = value;\r\n    return object;\r\n  };\r\n\r\n  var functionToString = Function.toString;\r\n\r\n  // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\r\n  if (typeof sharedStore.inspectSource != 'function') {\r\n    sharedStore.inspectSource = function (it) {\r\n      return functionToString.call(it);\r\n    };\r\n  }\r\n\r\n  var inspectSource = sharedStore.inspectSource;\r\n\r\n  var WeakMap$1 = global_1.WeakMap;\r\n\r\n  var nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\r\n\r\n  var keys = shared('keys');\r\n\r\n  var sharedKey = function (key) {\r\n    return keys[key] || (keys[key] = uid(key));\r\n  };\r\n\r\n  var hiddenKeys$1 = {};\r\n\r\n  var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\r\n  var WeakMap = global_1.WeakMap;\r\n  var set, get, has;\r\n\r\n  var enforce = function (it) {\r\n    return has(it) ? get(it) : set(it, {});\r\n  };\r\n\r\n  var getterFor = function (TYPE) {\r\n    return function (it) {\r\n      var state;\r\n      if (!isObject(it) || (state = get(it)).type !== TYPE) {\r\n        throw TypeError('Incompatible receiver, ' + TYPE + ' required');\r\n      } return state;\r\n    };\r\n  };\r\n\r\n  if (nativeWeakMap || sharedStore.state) {\r\n    var store = sharedStore.state || (sharedStore.state = new WeakMap());\r\n    var wmget = store.get;\r\n    var wmhas = store.has;\r\n    var wmset = store.set;\r\n    set = function (it, metadata) {\r\n      if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      wmset.call(store, it, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return wmget.call(store, it) || {};\r\n    };\r\n    has = function (it) {\r\n      return wmhas.call(store, it);\r\n    };\r\n  } else {\r\n    var STATE = sharedKey('state');\r\n    hiddenKeys$1[STATE] = true;\r\n    set = function (it, metadata) {\r\n      if (has$1(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      createNonEnumerableProperty(it, STATE, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return has$1(it, STATE) ? it[STATE] : {};\r\n    };\r\n    has = function (it) {\r\n      return has$1(it, STATE);\r\n    };\r\n  }\r\n\r\n  var internalState = {\r\n    set: set,\r\n    get: get,\r\n    has: has,\r\n    enforce: enforce,\r\n    getterFor: getterFor\r\n  };\r\n\r\n  var redefine = createCommonjsModule(function (module) {\r\n  var getInternalState = internalState.get;\r\n  var enforceInternalState = internalState.enforce;\r\n  var TEMPLATE = String(String).split('String');\r\n\r\n  (module.exports = function (O, key, value, options) {\r\n    var unsafe = options ? !!options.unsafe : false;\r\n    var simple = options ? !!options.enumerable : false;\r\n    var noTargetGet = options ? !!options.noTargetGet : false;\r\n    var state;\r\n    if (typeof value == 'function') {\r\n      if (typeof key == 'string' && !has$1(value, 'name')) {\r\n        createNonEnumerableProperty(value, 'name', key);\r\n      }\r\n      state = enforceInternalState(value);\r\n      if (!state.source) {\r\n        state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\r\n      }\r\n    }\r\n    if (O === global_1) {\r\n      if (simple) O[key] = value;\r\n      else setGlobal(key, value);\r\n      return;\r\n    } else if (!unsafe) {\r\n      delete O[key];\r\n    } else if (!noTargetGet && O[key]) {\r\n      simple = true;\r\n    }\r\n    if (simple) O[key] = value;\r\n    else createNonEnumerableProperty(O, key, value);\r\n  // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\r\n  })(Function.prototype, 'toString', function toString() {\r\n    return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\r\n  });\r\n  });\r\n\r\n  var ceil = Math.ceil;\r\n  var floor$2 = Math.floor;\r\n\r\n  // `ToInteger` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tointeger\r\n  var toInteger = function (argument) {\r\n    return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$2 : ceil)(argument);\r\n  };\r\n\r\n  var min$4 = Math.min;\r\n\r\n  // `ToLength` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tolength\r\n  var toLength = function (argument) {\r\n    return argument > 0 ? min$4(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\r\n  };\r\n\r\n  var max$3 = Math.max;\r\n  var min$3 = Math.min;\r\n\r\n  // Helper for a popular repeating case of the spec:\r\n  // Let integer be ? ToInteger(index).\r\n  // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\r\n  var toAbsoluteIndex = function (index, length) {\r\n    var integer = toInteger(index);\r\n    return integer < 0 ? max$3(integer + length, 0) : min$3(integer, length);\r\n  };\r\n\r\n  // `Array.prototype.{ indexOf, includes }` methods implementation\r\n  var createMethod$2 = function (IS_INCLUDES) {\r\n    return function ($this, el, fromIndex) {\r\n      var O = toIndexedObject($this);\r\n      var length = toLength(O.length);\r\n      var index = toAbsoluteIndex(fromIndex, length);\r\n      var value;\r\n      // Array#includes uses SameValueZero equality algorithm\r\n      // eslint-disable-next-line no-self-compare -- NaN check\r\n      if (IS_INCLUDES && el != el) while (length > index) {\r\n        value = O[index++];\r\n        // eslint-disable-next-line no-self-compare -- NaN check\r\n        if (value != value) return true;\r\n      // Array#indexOf ignores holes, Array#includes - not\r\n      } else for (;length > index; index++) {\r\n        if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\r\n      } return !IS_INCLUDES && -1;\r\n    };\r\n  };\r\n\r\n  var arrayIncludes = {\r\n    // `Array.prototype.includes` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n    includes: createMethod$2(true),\r\n    // `Array.prototype.indexOf` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.indexof\r\n    indexOf: createMethod$2(false)\r\n  };\r\n\r\n  var indexOf = arrayIncludes.indexOf;\r\n\r\n\r\n  var objectKeysInternal = function (object, names) {\r\n    var O = toIndexedObject(object);\r\n    var i = 0;\r\n    var result = [];\r\n    var key;\r\n    for (key in O) !has$1(hiddenKeys$1, key) && has$1(O, key) && result.push(key);\r\n    // Don't enum bug & hidden keys\r\n    while (names.length > i) if (has$1(O, key = names[i++])) {\r\n      ~indexOf(result, key) || result.push(key);\r\n    }\r\n    return result;\r\n  };\r\n\r\n  // IE8- don't enum bug keys\r\n  var enumBugKeys = [\r\n    'constructor',\r\n    'hasOwnProperty',\r\n    'isPrototypeOf',\r\n    'propertyIsEnumerable',\r\n    'toLocaleString',\r\n    'toString',\r\n    'valueOf'\r\n  ];\r\n\r\n  var hiddenKeys = enumBugKeys.concat('length', 'prototype');\r\n\r\n  // `Object.getOwnPropertyNames` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertynames\r\n  // eslint-disable-next-line es/no-object-getownpropertynames -- safe\r\n  var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\r\n    return objectKeysInternal(O, hiddenKeys);\r\n  };\r\n\r\n  var objectGetOwnPropertyNames = {\r\n  \tf: f$1\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\r\n  var f = Object.getOwnPropertySymbols;\r\n\r\n  var objectGetOwnPropertySymbols = {\r\n  \tf: f\r\n  };\r\n\r\n  // all object keys, includes non-enumerable and symbols\r\n  var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\r\n    var keys = objectGetOwnPropertyNames.f(anObject(it));\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\r\n  };\r\n\r\n  var copyConstructorProperties = function (target, source) {\r\n    var keys = ownKeys(source);\r\n    var defineProperty = objectDefineProperty.f;\r\n    var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n    for (var i = 0; i < keys.length; i++) {\r\n      var key = keys[i];\r\n      if (!has$1(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\r\n    }\r\n  };\r\n\r\n  var replacement = /#|\\.prototype\\./;\r\n\r\n  var isForced = function (feature, detection) {\r\n    var value = data[normalize(feature)];\r\n    return value == POLYFILL ? true\r\n      : value == NATIVE ? false\r\n      : typeof detection == 'function' ? fails(detection)\r\n      : !!detection;\r\n  };\r\n\r\n  var normalize = isForced.normalize = function (string) {\r\n    return String(string).replace(replacement, '.').toLowerCase();\r\n  };\r\n\r\n  var data = isForced.data = {};\r\n  var NATIVE = isForced.NATIVE = 'N';\r\n  var POLYFILL = isForced.POLYFILL = 'P';\r\n\r\n  var isForced_1 = isForced;\r\n\r\n  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n\r\n\r\n\r\n\r\n\r\n\r\n  /*\r\n    options.target      - name of the target object\r\n    options.global      - target is the global object\r\n    options.stat        - export as static methods of target\r\n    options.proto       - export as prototype methods of target\r\n    options.real        - real prototype method for the `pure` version\r\n    options.forced      - export even if the native feature is available\r\n    options.bind        - bind methods to the target, required for the `pure` version\r\n    options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\r\n    options.unsafe      - use the simple assignment of property instead of delete + defineProperty\r\n    options.sham        - add a flag to not completely full polyfills\r\n    options.enumerable  - export as enumerable property\r\n    options.noTargetGet - prevent calling a getter on target\r\n  */\r\n  var _export = function (options, source) {\r\n    var TARGET = options.target;\r\n    var GLOBAL = options.global;\r\n    var STATIC = options.stat;\r\n    var FORCED, target, key, targetProperty, sourceProperty, descriptor;\r\n    if (GLOBAL) {\r\n      target = global_1;\r\n    } else if (STATIC) {\r\n      target = global_1[TARGET] || setGlobal(TARGET, {});\r\n    } else {\r\n      target = (global_1[TARGET] || {}).prototype;\r\n    }\r\n    if (target) for (key in source) {\r\n      sourceProperty = source[key];\r\n      if (options.noTargetGet) {\r\n        descriptor = getOwnPropertyDescriptor(target, key);\r\n        targetProperty = descriptor && descriptor.value;\r\n      } else targetProperty = target[key];\r\n      FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\r\n      // contained in target\r\n      if (!FORCED && targetProperty !== undefined) {\r\n        if (typeof sourceProperty === typeof targetProperty) continue;\r\n        copyConstructorProperties(sourceProperty, targetProperty);\r\n      }\r\n      // add a flag to not completely full polyfills\r\n      if (options.sham || (targetProperty && targetProperty.sham)) {\r\n        createNonEnumerableProperty(sourceProperty, 'sham', true);\r\n      }\r\n      // extend global\r\n      redefine(target, key, sourceProperty, options);\r\n    }\r\n  };\r\n\r\n  var toString_1 = function (argument) {\r\n    if (isSymbol(argument)) throw TypeError('Cannot convert a Symbol value to a string');\r\n    return String(argument);\r\n  };\r\n\r\n  // `RegExp.prototype.flags` getter implementation\r\n  // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\r\n  var regexpFlags = function () {\r\n    var that = anObject(this);\r\n    var result = '';\r\n    if (that.global) result += 'g';\r\n    if (that.ignoreCase) result += 'i';\r\n    if (that.multiline) result += 'm';\r\n    if (that.dotAll) result += 's';\r\n    if (that.unicode) result += 'u';\r\n    if (that.sticky) result += 'y';\r\n    return result;\r\n  };\r\n\r\n  // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\r\n  var RE = function (s, f) {\r\n    return RegExp(s, f);\r\n  };\r\n\r\n  var UNSUPPORTED_Y$2 = fails(function () {\r\n    var re = RE('a', 'y');\r\n    re.lastIndex = 2;\r\n    return re.exec('abcd') != null;\r\n  });\r\n\r\n  var BROKEN_CARET = fails(function () {\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\r\n    var re = RE('^r', 'gy');\r\n    re.lastIndex = 2;\r\n    return re.exec('str') != null;\r\n  });\r\n\r\n  var regexpStickyHelpers = {\r\n  \tUNSUPPORTED_Y: UNSUPPORTED_Y$2,\r\n  \tBROKEN_CARET: BROKEN_CARET\r\n  };\r\n\r\n  // `Object.keys` method\r\n  // https://tc39.es/ecma262/#sec-object.keys\r\n  // eslint-disable-next-line es/no-object-keys -- safe\r\n  var objectKeys = Object.keys || function keys(O) {\r\n    return objectKeysInternal(O, enumBugKeys);\r\n  };\r\n\r\n  // `Object.defineProperties` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperties\r\n  // eslint-disable-next-line es/no-object-defineproperties -- safe\r\n  var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\r\n    anObject(O);\r\n    var keys = objectKeys(Properties);\r\n    var length = keys.length;\r\n    var index = 0;\r\n    var key;\r\n    while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\r\n    return O;\r\n  };\r\n\r\n  var html = getBuiltIn('document', 'documentElement');\r\n\r\n  /* global ActiveXObject -- old IE, WSH */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var GT = '>';\r\n  var LT = '<';\r\n  var PROTOTYPE = 'prototype';\r\n  var SCRIPT = 'script';\r\n  var IE_PROTO = sharedKey('IE_PROTO');\r\n\r\n  var EmptyConstructor = function () { /* empty */ };\r\n\r\n  var scriptTag = function (content) {\r\n    return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\r\n  var NullProtoObjectViaActiveX = function (activeXDocument) {\r\n    activeXDocument.write(scriptTag(''));\r\n    activeXDocument.close();\r\n    var temp = activeXDocument.parentWindow.Object;\r\n    activeXDocument = null; // avoid memory leak\r\n    return temp;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use iframe Object with cleared prototype\r\n  var NullProtoObjectViaIFrame = function () {\r\n    // Thrash, waste and sodomy: IE GC bug\r\n    var iframe = documentCreateElement('iframe');\r\n    var JS = 'java' + SCRIPT + ':';\r\n    var iframeDocument;\r\n    if (iframe.style) {\r\n      iframe.style.display = 'none';\r\n      html.appendChild(iframe);\r\n      // https://github.com/zloirock/core-js/issues/475\r\n      iframe.src = String(JS);\r\n      iframeDocument = iframe.contentWindow.document;\r\n      iframeDocument.open();\r\n      iframeDocument.write(scriptTag('document.F=Object'));\r\n      iframeDocument.close();\r\n      return iframeDocument.F;\r\n    }\r\n  };\r\n\r\n  // Check for document.domain and active x support\r\n  // No need to use active x approach when document.domain is not set\r\n  // see https://github.com/es-shims/es5-shim/issues/150\r\n  // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\r\n  // avoid IE GC bug\r\n  var activeXDocument;\r\n  var NullProtoObject = function () {\r\n    try {\r\n      activeXDocument = new ActiveXObject('htmlfile');\r\n    } catch (error) { /* ignore */ }\r\n    NullProtoObject = document.domain && activeXDocument ?\r\n      NullProtoObjectViaActiveX(activeXDocument) : // old IE\r\n      NullProtoObjectViaIFrame() ||\r\n      NullProtoObjectViaActiveX(activeXDocument); // WSH\r\n    var length = enumBugKeys.length;\r\n    while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\r\n    return NullProtoObject();\r\n  };\r\n\r\n  hiddenKeys$1[IE_PROTO] = true;\r\n\r\n  // `Object.create` method\r\n  // https://tc39.es/ecma262/#sec-object.create\r\n  var objectCreate = Object.create || function create(O, Properties) {\r\n    var result;\r\n    if (O !== null) {\r\n      EmptyConstructor[PROTOTYPE] = anObject(O);\r\n      result = new EmptyConstructor();\r\n      EmptyConstructor[PROTOTYPE] = null;\r\n      // add \"__proto__\" for Object.getPrototypeOf polyfill\r\n      result[IE_PROTO] = O;\r\n    } else result = NullProtoObject();\r\n    return Properties === undefined ? result : objectDefineProperties(result, Properties);\r\n  };\r\n\r\n  var regexpUnsupportedDotAll = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\r\n    var re = RegExp('.', (typeof '').charAt(0));\r\n    return !(re.dotAll && re.exec('\\n') && re.flags === 's');\r\n  });\r\n\r\n  var regexpUnsupportedNcg = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 'g') -> /./g and it causes SyntaxError\r\n    var re = RegExp('(?<a>b)', (typeof '').charAt(5));\r\n    return re.exec('b').groups.a !== 'b' ||\r\n      'b'.replace(re, '$<a>c') !== 'bc';\r\n  });\r\n\r\n  /* eslint-disable regexp/no-assertion-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\r\n  /* eslint-disable regexp/no-useless-quantifier -- testing */\r\n\r\n\r\n\r\n\r\n\r\n  var getInternalState = internalState.get;\r\n\r\n\r\n\r\n  var nativeExec = RegExp.prototype.exec;\r\n  var nativeReplace = shared('native-string-replace', String.prototype.replace);\r\n\r\n  var patchedExec = nativeExec;\r\n\r\n  var UPDATES_LAST_INDEX_WRONG = (function () {\r\n    var re1 = /a/;\r\n    var re2 = /b*/g;\r\n    nativeExec.call(re1, 'a');\r\n    nativeExec.call(re2, 'a');\r\n    return re1.lastIndex !== 0 || re2.lastIndex !== 0;\r\n  })();\r\n\r\n  var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\r\n\r\n  // nonparticipating capturing group, copied from es5-shim's String#split patch.\r\n  var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\r\n\r\n  var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1 || regexpUnsupportedDotAll || regexpUnsupportedNcg;\r\n\r\n  if (PATCH) {\r\n    // eslint-disable-next-line max-statements -- TODO\r\n    patchedExec = function exec(string) {\r\n      var re = this;\r\n      var state = getInternalState(re);\r\n      var str = toString_1(string);\r\n      var raw = state.raw;\r\n      var result, reCopy, lastIndex, match, i, object, group;\r\n\r\n      if (raw) {\r\n        raw.lastIndex = re.lastIndex;\r\n        result = patchedExec.call(raw, str);\r\n        re.lastIndex = raw.lastIndex;\r\n        return result;\r\n      }\r\n\r\n      var groups = state.groups;\r\n      var sticky = UNSUPPORTED_Y$1 && re.sticky;\r\n      var flags = regexpFlags.call(re);\r\n      var source = re.source;\r\n      var charsAdded = 0;\r\n      var strCopy = str;\r\n\r\n      if (sticky) {\r\n        flags = flags.replace('y', '');\r\n        if (flags.indexOf('g') === -1) {\r\n          flags += 'g';\r\n        }\r\n\r\n        strCopy = str.slice(re.lastIndex);\r\n        // Support anchored sticky behavior.\r\n        if (re.lastIndex > 0 && (!re.multiline || re.multiline && str.charAt(re.lastIndex - 1) !== '\\n')) {\r\n          source = '(?: ' + source + ')';\r\n          strCopy = ' ' + strCopy;\r\n          charsAdded++;\r\n        }\r\n        // ^(? + rx + ) is needed, in combination with some str slicing, to\r\n        // simulate the 'y' flag.\r\n        reCopy = new RegExp('^(?:' + source + ')', flags);\r\n      }\r\n\r\n      if (NPCG_INCLUDED) {\r\n        reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\r\n      }\r\n      if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\r\n\r\n      match = nativeExec.call(sticky ? reCopy : re, strCopy);\r\n\r\n      if (sticky) {\r\n        if (match) {\r\n          match.input = match.input.slice(charsAdded);\r\n          match[0] = match[0].slice(charsAdded);\r\n          match.index = re.lastIndex;\r\n          re.lastIndex += match[0].length;\r\n        } else re.lastIndex = 0;\r\n      } else if (UPDATES_LAST_INDEX_WRONG && match) {\r\n        re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\r\n      }\r\n      if (NPCG_INCLUDED && match && match.length > 1) {\r\n        // Fix browsers whose `exec` methods don't consistently return `undefined`\r\n        // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\r\n        nativeReplace.call(match[0], reCopy, function () {\r\n          for (i = 1; i < arguments.length - 2; i++) {\r\n            if (arguments[i] === undefined) match[i] = undefined;\r\n          }\r\n        });\r\n      }\r\n\r\n      if (match && groups) {\r\n        match.groups = object = objectCreate(null);\r\n        for (i = 0; i < groups.length; i++) {\r\n          group = groups[i];\r\n          object[group[0]] = match[group[1]];\r\n        }\r\n      }\r\n\r\n      return match;\r\n    };\r\n  }\r\n\r\n  var regexpExec = patchedExec;\r\n\r\n  // `RegExp.prototype.exec` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.exec\r\n  _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\r\n    exec: regexpExec\r\n  });\r\n\r\n  // TODO: Remove from `core-js@4` since it's moved to entry points\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var SPECIES$4 = wellKnownSymbol('species');\r\n  var RegExpPrototype$1 = RegExp.prototype;\r\n\r\n  var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {\r\n    var SYMBOL = wellKnownSymbol(KEY);\r\n\r\n    var DELEGATES_TO_SYMBOL = !fails(function () {\r\n      // String methods call symbol-named RegEp methods\r\n      var O = {};\r\n      O[SYMBOL] = function () { return 7; };\r\n      return ''[KEY](O) != 7;\r\n    });\r\n\r\n    var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\r\n      // Symbol-named RegExp methods call .exec\r\n      var execCalled = false;\r\n      var re = /a/;\r\n\r\n      if (KEY === 'split') {\r\n        // We can't use real regex here since it causes deoptimization\r\n        // and serious performance degradation in V8\r\n        // https://github.com/zloirock/core-js/issues/306\r\n        re = {};\r\n        // RegExp[@@split] doesn't call the regex's exec method, but first creates\r\n        // a new one. We need to return the patched regex when creating the new one.\r\n        re.constructor = {};\r\n        re.constructor[SPECIES$4] = function () { return re; };\r\n        re.flags = '';\r\n        re[SYMBOL] = /./[SYMBOL];\r\n      }\r\n\r\n      re.exec = function () { execCalled = true; return null; };\r\n\r\n      re[SYMBOL]('');\r\n      return !execCalled;\r\n    });\r\n\r\n    if (\r\n      !DELEGATES_TO_SYMBOL ||\r\n      !DELEGATES_TO_EXEC ||\r\n      FORCED\r\n    ) {\r\n      var nativeRegExpMethod = /./[SYMBOL];\r\n      var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\r\n        var $exec = regexp.exec;\r\n        if ($exec === regexpExec || $exec === RegExpPrototype$1.exec) {\r\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\r\n            // The native String method already delegates to @@method (this\r\n            // polyfilled function), leasing to infinite recursion.\r\n            // We avoid it by directly calling the native @@method method.\r\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\r\n          }\r\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\r\n        }\r\n        return { done: false };\r\n      });\r\n\r\n      redefine(String.prototype, KEY, methods[0]);\r\n      redefine(RegExpPrototype$1, SYMBOL, methods[1]);\r\n    }\r\n\r\n    if (SHAM) createNonEnumerableProperty(RegExpPrototype$1[SYMBOL], 'sham', true);\r\n  };\r\n\r\n  // `String.prototype.codePointAt` methods implementation\r\n  var createMethod$1 = function (CONVERT_TO_STRING) {\r\n    return function ($this, pos) {\r\n      var S = toString_1(requireObjectCoercible($this));\r\n      var position = toInteger(pos);\r\n      var size = S.length;\r\n      var first, second;\r\n      if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\r\n      first = S.charCodeAt(position);\r\n      return first < 0xD800 || first > 0xDBFF || position + 1 === size\r\n        || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\r\n          ? CONVERT_TO_STRING ? S.charAt(position) : first\r\n          : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\r\n    };\r\n  };\r\n\r\n  var stringMultibyte = {\r\n    // `String.prototype.codePointAt` method\r\n    // https://tc39.es/ecma262/#sec-string.prototype.codepointat\r\n    codeAt: createMethod$1(false),\r\n    // `String.prototype.at` method\r\n    // https://github.com/mathiasbynens/String.prototype.at\r\n    charAt: createMethod$1(true)\r\n  };\r\n\r\n  var charAt = stringMultibyte.charAt;\r\n\r\n  // `AdvanceStringIndex` abstract operation\r\n  // https://tc39.es/ecma262/#sec-advancestringindex\r\n  var advanceStringIndex = function (S, index, unicode) {\r\n    return index + (unicode ? charAt(S, index).length : 1);\r\n  };\r\n\r\n  // `RegExpExec` abstract operation\r\n  // https://tc39.es/ecma262/#sec-regexpexec\r\n  var regexpExecAbstract = function (R, S) {\r\n    var exec = R.exec;\r\n    if (typeof exec === 'function') {\r\n      var result = exec.call(R, S);\r\n      if (typeof result !== 'object') {\r\n        throw TypeError('RegExp exec method returned something other than an Object or null');\r\n      }\r\n      return result;\r\n    }\r\n\r\n    if (classofRaw(R) !== 'RegExp') {\r\n      throw TypeError('RegExp#exec called on incompatible receiver');\r\n    }\r\n\r\n    return regexpExec.call(R, S);\r\n  };\r\n\r\n  // @@match logic\r\n  fixRegexpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\r\n    return [\r\n      // `String.prototype.match` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.match\r\n      function match(regexp) {\r\n        var O = requireObjectCoercible(this);\r\n        var matcher = regexp == undefined ? undefined : regexp[MATCH];\r\n        return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString_1(O));\r\n      },\r\n      // `RegExp.prototype[@@match]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\r\n      function (string) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(nativeMatch, rx, S);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        if (!rx.global) return regexpExecAbstract(rx, S);\r\n\r\n        var fullUnicode = rx.unicode;\r\n        rx.lastIndex = 0;\r\n        var A = [];\r\n        var n = 0;\r\n        var result;\r\n        while ((result = regexpExecAbstract(rx, S)) !== null) {\r\n          var matchStr = toString_1(result[0]);\r\n          A[n] = matchStr;\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n          n++;\r\n        }\r\n        return n === 0 ? null : A;\r\n      }\r\n    ];\r\n  });\r\n\r\n  // `IsArray` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isarray\r\n  // eslint-disable-next-line es/no-array-isarray -- safe\r\n  var isArray = Array.isArray || function isArray(arg) {\r\n    return classofRaw(arg) == 'Array';\r\n  };\r\n\r\n  var createProperty = function (object, key, value) {\r\n    var propertyKey = toPropertyKey(key);\r\n    if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\r\n    else object[propertyKey] = value;\r\n  };\r\n\r\n  var SPECIES$3 = wellKnownSymbol('species');\r\n\r\n  // a part of `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesConstructor = function (originalArray) {\r\n    var C;\r\n    if (isArray(originalArray)) {\r\n      C = originalArray.constructor;\r\n      // cross-realm fallback\r\n      if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\r\n      else if (isObject(C)) {\r\n        C = C[SPECIES$3];\r\n        if (C === null) C = undefined;\r\n      }\r\n    } return C === undefined ? Array : C;\r\n  };\r\n\r\n  // `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesCreate = function (originalArray, length) {\r\n    return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\r\n  };\r\n\r\n  var SPECIES$2 = wellKnownSymbol('species');\r\n\r\n  var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\r\n    // We can't use this feature detection in V8 since it causes\r\n    // deoptimization and serious performance degradation\r\n    // https://github.com/zloirock/core-js/issues/677\r\n    return engineV8Version >= 51 || !fails(function () {\r\n      var array = [];\r\n      var constructor = array.constructor = {};\r\n      constructor[SPECIES$2] = function () {\r\n        return { foo: 1 };\r\n      };\r\n      return array[METHOD_NAME](Boolean).foo !== 1;\r\n    });\r\n  };\r\n\r\n  var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\r\n  var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\r\n\r\n  // We can't use this feature detection in V8 since it causes\r\n  // deoptimization and serious performance degradation\r\n  // https://github.com/zloirock/core-js/issues/679\r\n  var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\r\n    var array = [];\r\n    array[IS_CONCAT_SPREADABLE] = false;\r\n    return array.concat()[0] !== array;\r\n  });\r\n\r\n  var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\r\n\r\n  var isConcatSpreadable = function (O) {\r\n    if (!isObject(O)) return false;\r\n    var spreadable = O[IS_CONCAT_SPREADABLE];\r\n    return spreadable !== undefined ? !!spreadable : isArray(O);\r\n  };\r\n\r\n  var FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\r\n\r\n  // `Array.prototype.concat` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.concat\r\n  // with adding support of @@isConcatSpreadable and @@species\r\n  _export({ target: 'Array', proto: true, forced: FORCED$1 }, {\r\n    // eslint-disable-next-line no-unused-vars -- required for `.length`\r\n    concat: function concat(arg) {\r\n      var O = toObject(this);\r\n      var A = arraySpeciesCreate(O, 0);\r\n      var n = 0;\r\n      var i, k, length, len, E;\r\n      for (i = -1, length = arguments.length; i < length; i++) {\r\n        E = i === -1 ? O : arguments[i];\r\n        if (isConcatSpreadable(E)) {\r\n          len = toLength(E.length);\r\n          if (n + len > MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\r\n        } else {\r\n          if (n >= MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          createProperty(A, n++, E);\r\n        }\r\n      }\r\n      A.length = n;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\r\n  var test$1 = {};\r\n\r\n  test$1[TO_STRING_TAG$1] = 'z';\r\n\r\n  var toStringTagSupport = String(test$1) === '[object z]';\r\n\r\n  var TO_STRING_TAG = wellKnownSymbol('toStringTag');\r\n  // ES3 wrong here\r\n  var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\r\n\r\n  // fallback for IE11 Script Access Denied error\r\n  var tryGet = function (it, key) {\r\n    try {\r\n      return it[key];\r\n    } catch (error) { /* empty */ }\r\n  };\r\n\r\n  // getting tag from ES6+ `Object.prototype.toString`\r\n  var classof = toStringTagSupport ? classofRaw : function (it) {\r\n    var O, tag, result;\r\n    return it === undefined ? 'Undefined' : it === null ? 'Null'\r\n      // @@toStringTag case\r\n      : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\r\n      // builtinTag case\r\n      : CORRECT_ARGUMENTS ? classofRaw(O)\r\n      // ES3 arguments fallback\r\n      : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\r\n  };\r\n\r\n  // `Object.prototype.toString` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  var objectToString = toStringTagSupport ? {}.toString : function toString() {\r\n    return '[object ' + classof(this) + ']';\r\n  };\r\n\r\n  // `Object.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  if (!toStringTagSupport) {\r\n    redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\r\n  }\r\n\r\n  var TO_STRING = 'toString';\r\n  var RegExpPrototype = RegExp.prototype;\r\n  var nativeToString = RegExpPrototype[TO_STRING];\r\n\r\n  var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\r\n  // FF44- RegExp#toString has a wrong name\r\n  var INCORRECT_NAME = nativeToString.name != TO_STRING;\r\n\r\n  // `RegExp.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.tostring\r\n  if (NOT_GENERIC || INCORRECT_NAME) {\r\n    redefine(RegExp.prototype, TO_STRING, function toString() {\r\n      var R = anObject(this);\r\n      var p = toString_1(R.source);\r\n      var rf = R.flags;\r\n      var f = toString_1(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\r\n      return '/' + p + '/' + f;\r\n    }, { unsafe: true });\r\n  }\r\n\r\n  var MATCH$1 = wellKnownSymbol('match');\r\n\r\n  // `IsRegExp` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isregexp\r\n  var isRegexp = function (it) {\r\n    var isRegExp;\r\n    return isObject(it) && ((isRegExp = it[MATCH$1]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\r\n  };\r\n\r\n  var aFunction = function (it) {\r\n    if (typeof it != 'function') {\r\n      throw TypeError(String(it) + ' is not a function');\r\n    } return it;\r\n  };\r\n\r\n  var SPECIES$1 = wellKnownSymbol('species');\r\n\r\n  // `SpeciesConstructor` abstract operation\r\n  // https://tc39.es/ecma262/#sec-speciesconstructor\r\n  var speciesConstructor = function (O, defaultConstructor) {\r\n    var C = anObject(O).constructor;\r\n    var S;\r\n    return C === undefined || (S = anObject(C)[SPECIES$1]) == undefined ? defaultConstructor : aFunction(S);\r\n  };\r\n\r\n  var UNSUPPORTED_Y = regexpStickyHelpers.UNSUPPORTED_Y;\r\n  var arrayPush = [].push;\r\n  var min$2 = Math.min;\r\n  var MAX_UINT32 = 0xFFFFFFFF;\r\n\r\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\r\n  // Weex JS has frozen built-in prototypes, so use try / catch wrapper\r\n  var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\r\n    // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n    var re = /(?:)/;\r\n    var originalExec = re.exec;\r\n    re.exec = function () { return originalExec.apply(this, arguments); };\r\n    var result = 'ab'.split(re);\r\n    return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\r\n  });\r\n\r\n  // @@split logic\r\n  fixRegexpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\r\n    var internalSplit;\r\n    if (\r\n      'abbc'.split(/(b)*/)[1] == 'c' ||\r\n      // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n      'test'.split(/(?:)/, -1).length != 4 ||\r\n      'ab'.split(/(?:ab)*/).length != 2 ||\r\n      '.'.split(/(.?)(.?)/).length != 4 ||\r\n      // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\r\n      '.'.split(/()()/).length > 1 ||\r\n      ''.split(/.?/).length\r\n    ) {\r\n      // based on es5-shim implementation, need to rework it\r\n      internalSplit = function (separator, limit) {\r\n        var string = toString_1(requireObjectCoercible(this));\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (separator === undefined) return [string];\r\n        // If `separator` is not a regex, use native split\r\n        if (!isRegexp(separator)) {\r\n          return nativeSplit.call(string, separator, lim);\r\n        }\r\n        var output = [];\r\n        var flags = (separator.ignoreCase ? 'i' : '') +\r\n                    (separator.multiline ? 'm' : '') +\r\n                    (separator.unicode ? 'u' : '') +\r\n                    (separator.sticky ? 'y' : '');\r\n        var lastLastIndex = 0;\r\n        // Make `global` and avoid `lastIndex` issues by working with a copy\r\n        var separatorCopy = new RegExp(separator.source, flags + 'g');\r\n        var match, lastIndex, lastLength;\r\n        while (match = regexpExec.call(separatorCopy, string)) {\r\n          lastIndex = separatorCopy.lastIndex;\r\n          if (lastIndex > lastLastIndex) {\r\n            output.push(string.slice(lastLastIndex, match.index));\r\n            if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\r\n            lastLength = match[0].length;\r\n            lastLastIndex = lastIndex;\r\n            if (output.length >= lim) break;\r\n          }\r\n          if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\r\n        }\r\n        if (lastLastIndex === string.length) {\r\n          if (lastLength || !separatorCopy.test('')) output.push('');\r\n        } else output.push(string.slice(lastLastIndex));\r\n        return output.length > lim ? output.slice(0, lim) : output;\r\n      };\r\n    // Chakra, V8\r\n    } else if ('0'.split(undefined, 0).length) {\r\n      internalSplit = function (separator, limit) {\r\n        return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\r\n      };\r\n    } else internalSplit = nativeSplit;\r\n\r\n    return [\r\n      // `String.prototype.split` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.split\r\n      function split(separator, limit) {\r\n        var O = requireObjectCoercible(this);\r\n        var splitter = separator == undefined ? undefined : separator[SPLIT];\r\n        return splitter !== undefined\r\n          ? splitter.call(separator, O, limit)\r\n          : internalSplit.call(toString_1(O), separator, limit);\r\n      },\r\n      // `RegExp.prototype[@@split]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\r\n      //\r\n      // NOTE: This cannot be properly polyfilled in engines that don't support\r\n      // the 'y' flag.\r\n      function (string, limit) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        var C = speciesConstructor(rx, RegExp);\r\n\r\n        var unicodeMatching = rx.unicode;\r\n        var flags = (rx.ignoreCase ? 'i' : '') +\r\n                    (rx.multiline ? 'm' : '') +\r\n                    (rx.unicode ? 'u' : '') +\r\n                    (UNSUPPORTED_Y ? 'g' : 'y');\r\n\r\n        // ^(? + rx + ) is needed, in combination with some S slicing, to\r\n        // simulate the 'y' flag.\r\n        var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\r\n        var p = 0;\r\n        var q = 0;\r\n        var A = [];\r\n        while (q < S.length) {\r\n          splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\r\n          var z = regexpExecAbstract(splitter, UNSUPPORTED_Y ? S.slice(q) : S);\r\n          var e;\r\n          if (\r\n            z === null ||\r\n            (e = min$2(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\r\n          ) {\r\n            q = advanceStringIndex(S, q, unicodeMatching);\r\n          } else {\r\n            A.push(S.slice(p, q));\r\n            if (A.length === lim) return A;\r\n            for (var i = 1; i <= z.length - 1; i++) {\r\n              A.push(z[i]);\r\n              if (A.length === lim) return A;\r\n            }\r\n            q = p = e;\r\n          }\r\n        }\r\n        A.push(S.slice(p));\r\n        return A;\r\n      }\r\n    ];\r\n  }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n\r\n  function addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n\r\n      if (!pre.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.setAttribute(\"class\", \"\".concat(pre, \" \").concat(className));\r\n      }\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(\" \");\r\n        forEach(classes, function (cls) {\r\n          element.classList.add(cls);\r\n        });\r\n      } else if (!element.className.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.className += \" \".concat(className);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns string property value\r\n   */\r\n  function getPropValue(element, propName) {\r\n    var propValue = \"\";\r\n\r\n    if (element.currentStyle) {\r\n      //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) {\r\n      //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    } //Prevent exception in IE\r\n\r\n\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function setShowElement(_ref) {\r\n    var element = _ref.element;\r\n    addClass(element, \"introjs-showElement\");\r\n    var currentElementPosition = getPropValue(element, \"position\");\r\n\r\n    if (currentElementPosition !== \"absolute\" && currentElementPosition !== \"relative\" && currentElementPosition !== \"sticky\" && currentElementPosition !== \"fixed\") {\r\n      //change to new intro item\r\n      addClass(element, \"introjs-relativePosition\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Find the nearest scrollable parent\r\n   * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n   *\r\n   * @param Element element\r\n   * @return Element\r\n   */\r\n  function getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = style.position === \"absolute\";\r\n    var overflowRegex = /(auto|scroll)/;\r\n    if (style.position === \"fixed\") return document.body;\r\n\r\n    for (var parent = element; parent = parent.parentElement;) {\r\n      style = window.getComputedStyle(parent);\r\n\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n   * scroll a scrollable element to a child element\r\n   *\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function scrollParentToElement(targetElement) {\r\n    var element = targetElement.element;\r\n    if (!this._options.scrollToElement) return;\r\n    var parent = getScrollParent(element);\r\n    if (parent === document.body) return;\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return {\r\n        width: window.innerWidth,\r\n        height: window.innerHeight\r\n      };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return {\r\n        width: D.clientWidth,\r\n        height: D.clientHeight\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n    return rect.top >= 0 && rect.left >= 0 && rect.bottom + 80 <= window.innerHeight && // add 80 to get the text right\r\n    rect.right <= window.innerWidth;\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n\r\n  function scrollTo(scrollTo, _ref, tooltipLayer) {\r\n    var element = _ref.element;\r\n    if (scrollTo === \"off\") return;\r\n    var rect;\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === \"tooltip\") {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!elementInViewport(element)) {\r\n      var winHeight = getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top); // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n        //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function setAnchorAsButton(anchor) {\r\n    anchor.setAttribute(\"role\", \"button\");\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  // eslint-disable-next-line es/no-object-assign -- safe\r\n  var $assign = Object.assign;\r\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n  var defineProperty = Object.defineProperty;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  var objectAssign = !$assign || fails(function () {\r\n    // should have correct order of operations (Edge bug)\r\n    if (descriptors && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\r\n      enumerable: true,\r\n      get: function () {\r\n        defineProperty(this, 'b', {\r\n          value: 3,\r\n          enumerable: false\r\n        });\r\n      }\r\n    }), { b: 2 })).b !== 1) return true;\r\n    // should work with symbols and should have deterministic property order (V8 bug)\r\n    var A = {};\r\n    var B = {};\r\n    // eslint-disable-next-line es/no-symbol -- safe\r\n    var symbol = Symbol();\r\n    var alphabet = 'abcdefghijklmnopqrst';\r\n    A[symbol] = 7;\r\n    alphabet.split('').forEach(function (chr) { B[chr] = chr; });\r\n    return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\r\n  }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\r\n    var T = toObject(target);\r\n    var argumentsLength = arguments.length;\r\n    var index = 1;\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    var propertyIsEnumerable = objectPropertyIsEnumerable.f;\r\n    while (argumentsLength > index) {\r\n      var S = indexedObject(arguments[index++]);\r\n      var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\r\n      var length = keys.length;\r\n      var j = 0;\r\n      var key;\r\n      while (length > j) {\r\n        key = keys[j++];\r\n        if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\r\n      }\r\n    } return T;\r\n  } : $assign;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  // eslint-disable-next-line es/no-object-assign -- required for testing\r\n  _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\r\n    assign: objectAssign\r\n  });\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n\r\n  function isFixed(element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === \"HTML\") {\r\n      return false;\r\n    }\r\n\r\n    if (getPropValue(element, \"position\") === \"fixed\") {\r\n      return true;\r\n    }\r\n\r\n    return isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page relative to another element (or body)\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method getOffset\r\n   * @param {Object} element\r\n   * @param {Object} relativeEl\r\n   * @returns Element's position info\r\n   */\r\n\r\n  function getOffset(element, relativeEl) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    relativeEl = relativeEl || body;\r\n    var x = element.getBoundingClientRect();\r\n    var xr = relativeEl.getBoundingClientRect();\r\n    var relativeElPosition = getPropValue(relativeEl, \"position\");\r\n    var obj = {\r\n      width: x.width,\r\n      height: x.height\r\n    };\r\n\r\n    if (relativeEl.tagName.toLowerCase() !== \"body\" && relativeElPosition === \"relative\" || relativeElPosition === \"sticky\") {\r\n      // when the container of our target element is _not_ body and has either \"relative\" or \"sticky\" position, we should not\r\n      // consider the scroll position but we need to include the relative x/y of the container element\r\n      return Object.assign(obj, {\r\n        top: x.top - xr.top,\r\n        left: x.left - xr.left\r\n      });\r\n    } else {\r\n      if (isFixed(element)) {\r\n        return Object.assign(obj, {\r\n          top: x.top,\r\n          left: x.left\r\n        });\r\n      } else {\r\n        return Object.assign(obj, {\r\n          top: x.top + scrollTop,\r\n          left: x.left + scrollLeft\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  var floor$1 = Math.floor;\r\n  var replace = ''.replace;\r\n  var SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\r\n  var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\r\n\r\n  // `GetSubstitution` abstract operation\r\n  // https://tc39.es/ecma262/#sec-getsubstitution\r\n  var getSubstitution = function (matched, str, position, captures, namedCaptures, replacement) {\r\n    var tailPos = position + matched.length;\r\n    var m = captures.length;\r\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\r\n    if (namedCaptures !== undefined) {\r\n      namedCaptures = toObject(namedCaptures);\r\n      symbols = SUBSTITUTION_SYMBOLS;\r\n    }\r\n    return replace.call(replacement, symbols, function (match, ch) {\r\n      var capture;\r\n      switch (ch.charAt(0)) {\r\n        case '$': return '$';\r\n        case '&': return matched;\r\n        case '`': return str.slice(0, position);\r\n        case \"'\": return str.slice(tailPos);\r\n        case '<':\r\n          capture = namedCaptures[ch.slice(1, -1)];\r\n          break;\r\n        default: // \\d\\d?\r\n          var n = +ch;\r\n          if (n === 0) return match;\r\n          if (n > m) {\r\n            var f = floor$1(n / 10);\r\n            if (f === 0) return match;\r\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\r\n            return match;\r\n          }\r\n          capture = captures[n - 1];\r\n      }\r\n      return capture === undefined ? '' : capture;\r\n    });\r\n  };\r\n\r\n  var REPLACE = wellKnownSymbol('replace');\r\n  var max$2 = Math.max;\r\n  var min$1 = Math.min;\r\n\r\n  var maybeToString = function (it) {\r\n    return it === undefined ? it : String(it);\r\n  };\r\n\r\n  // IE <= 11 replaces $0 with the whole match, as if it was $&\r\n  // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\r\n  var REPLACE_KEEPS_$0 = (function () {\r\n    // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\r\n    return 'a'.replace(/./, '$0') === '$0';\r\n  })();\r\n\r\n  // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\r\n  var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\r\n    if (/./[REPLACE]) {\r\n      return /./[REPLACE]('a', '$0') === '';\r\n    }\r\n    return false;\r\n  })();\r\n\r\n  var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\r\n    var re = /./;\r\n    re.exec = function () {\r\n      var result = [];\r\n      result.groups = { a: '7' };\r\n      return result;\r\n    };\r\n    return ''.replace(re, '$<a>') !== '7';\r\n  });\r\n\r\n  // @@replace logic\r\n  fixRegexpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\r\n    var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\r\n\r\n    return [\r\n      // `String.prototype.replace` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.replace\r\n      function replace(searchValue, replaceValue) {\r\n        var O = requireObjectCoercible(this);\r\n        var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\r\n        return replacer !== undefined\r\n          ? replacer.call(searchValue, O, replaceValue)\r\n          : nativeReplace.call(toString_1(O), searchValue, replaceValue);\r\n      },\r\n      // `RegExp.prototype[@@replace]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\r\n      function (string, replaceValue) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n\r\n        if (\r\n          typeof replaceValue === 'string' &&\r\n          replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1 &&\r\n          replaceValue.indexOf('$<') === -1\r\n        ) {\r\n          var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\r\n          if (res.done) return res.value;\r\n        }\r\n\r\n        var functionalReplace = typeof replaceValue === 'function';\r\n        if (!functionalReplace) replaceValue = toString_1(replaceValue);\r\n\r\n        var global = rx.global;\r\n        if (global) {\r\n          var fullUnicode = rx.unicode;\r\n          rx.lastIndex = 0;\r\n        }\r\n        var results = [];\r\n        while (true) {\r\n          var result = regexpExecAbstract(rx, S);\r\n          if (result === null) break;\r\n\r\n          results.push(result);\r\n          if (!global) break;\r\n\r\n          var matchStr = toString_1(result[0]);\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n        }\r\n\r\n        var accumulatedResult = '';\r\n        var nextSourcePosition = 0;\r\n        for (var i = 0; i < results.length; i++) {\r\n          result = results[i];\r\n\r\n          var matched = toString_1(result[0]);\r\n          var position = max$2(min$1(toInteger(result.index), S.length), 0);\r\n          var captures = [];\r\n          // NOTE: This is equivalent to\r\n          //   captures = result.slice(1).map(maybeToString)\r\n          // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\r\n          // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\r\n          // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\r\n          for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\r\n          var namedCaptures = result.groups;\r\n          if (functionalReplace) {\r\n            var replacerArgs = [matched].concat(captures, position, S);\r\n            if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\r\n            var replacement = toString_1(replaceValue.apply(undefined, replacerArgs));\r\n          } else {\r\n            replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\r\n          }\r\n          if (position >= nextSourcePosition) {\r\n            accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\r\n            nextSourcePosition = position + matched.length;\r\n          }\r\n        }\r\n        return accumulatedResult + S.slice(nextSourcePosition);\r\n      }\r\n    ];\r\n  }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n      element.setAttribute(\"class\", pre.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\"));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Sets the style of an DOM element\r\n   *\r\n   * @param {Object} element\r\n   * @param {Object|string} style\r\n   * @return null\r\n   */\r\n  function setStyle(element, style) {\r\n    var cssText = \"\";\r\n\r\n    if (element.style.cssText) {\r\n      cssText += element.style.cssText;\r\n    }\r\n\r\n    if (typeof style === \"string\") {\r\n      cssText += style;\r\n    } else {\r\n      for (var rule in style) {\r\n        cssText += \"\".concat(rule, \":\").concat(style[rule], \";\");\r\n      }\r\n    }\r\n\r\n    element.style.cssText = cssText;\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n\r\n  function setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n      var currentElement = this._introItems[this._currentStep];\r\n      var elementPosition = getOffset(currentElement.element, this._targetElement);\r\n      var widthHeightPadding = this._options.helperElementPadding; // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n\r\n      if (isFixed(currentElement.element)) {\r\n        addClass(helperLayer, \"introjs-fixedTooltip\");\r\n      } else {\r\n        removeClass(helperLayer, \"introjs-fixedTooltip\");\r\n      }\r\n\r\n      if (currentElement.position === \"floating\") {\r\n        widthHeightPadding = 0;\r\n      } //set new position to helper layer\r\n\r\n\r\n      setStyle(helperLayer, {\r\n        width: \"\".concat(elementPosition.width + widthHeightPadding, \"px\"),\r\n        height: \"\".concat(elementPosition.height + widthHeightPadding, \"px\"),\r\n        top: \"\".concat(elementPosition.top - widthHeightPadding / 2, \"px\"),\r\n        left: \"\".concat(elementPosition.left - widthHeightPadding / 2, \"px\")\r\n      });\r\n    }\r\n  }\r\n\r\n  var UNSCOPABLES = wellKnownSymbol('unscopables');\r\n  var ArrayPrototype = Array.prototype;\r\n\r\n  // Array.prototype[@@unscopables]\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  if (ArrayPrototype[UNSCOPABLES] == undefined) {\r\n    objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\r\n      configurable: true,\r\n      value: objectCreate(null)\r\n    });\r\n  }\r\n\r\n  // add a key to Array.prototype[@@unscopables]\r\n  var addToUnscopables = function (key) {\r\n    ArrayPrototype[UNSCOPABLES][key] = true;\r\n  };\r\n\r\n  var $includes = arrayIncludes.includes;\r\n\r\n\r\n  // `Array.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n  _export({ target: 'Array', proto: true }, {\r\n    includes: function includes(el /* , fromIndex = 0 */) {\r\n      return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  addToUnscopables('includes');\r\n\r\n  var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('slice');\r\n\r\n  var SPECIES = wellKnownSymbol('species');\r\n  var nativeSlice = [].slice;\r\n  var max$1 = Math.max;\r\n\r\n  // `Array.prototype.slice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.slice\r\n  // fallback for not array-like ES3 strings and DOM objects\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {\r\n    slice: function slice(start, end) {\r\n      var O = toIndexedObject(this);\r\n      var length = toLength(O.length);\r\n      var k = toAbsoluteIndex(start, length);\r\n      var fin = toAbsoluteIndex(end === undefined ? length : end, length);\r\n      // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\r\n      var Constructor, result, n;\r\n      if (isArray(O)) {\r\n        Constructor = O.constructor;\r\n        // cross-realm fallback\r\n        if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\r\n          Constructor = undefined;\r\n        } else if (isObject(Constructor)) {\r\n          Constructor = Constructor[SPECIES];\r\n          if (Constructor === null) Constructor = undefined;\r\n        }\r\n        if (Constructor === Array || Constructor === undefined) {\r\n          return nativeSlice.call(O, k, fin);\r\n        }\r\n      }\r\n      result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\r\n      for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\r\n      result.length = n;\r\n      return result;\r\n    }\r\n  });\r\n\r\n  var notARegexp = function (it) {\r\n    if (isRegexp(it)) {\r\n      throw TypeError(\"The method doesn't accept regular expressions\");\r\n    } return it;\r\n  };\r\n\r\n  var MATCH = wellKnownSymbol('match');\r\n\r\n  var correctIsRegexpLogic = function (METHOD_NAME) {\r\n    var regexp = /./;\r\n    try {\r\n      '/./'[METHOD_NAME](regexp);\r\n    } catch (error1) {\r\n      try {\r\n        regexp[MATCH] = false;\r\n        return '/./'[METHOD_NAME](regexp);\r\n      } catch (error2) { /* empty */ }\r\n    } return false;\r\n  };\r\n\r\n  // `String.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-string.prototype.includes\r\n  _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\r\n    includes: function includes(searchString /* , position = 0 */) {\r\n      return !!~toString_1(requireObjectCoercible(this))\r\n        .indexOf(toString_1(notARegexp(searchString)), arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  var arrayMethodIsStrict = function (METHOD_NAME, argument) {\r\n    var method = [][METHOD_NAME];\r\n    return !!method && fails(function () {\r\n      // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\r\n      method.call(null, argument || function () { throw 1; }, 1);\r\n    });\r\n  };\r\n\r\n  var nativeJoin = [].join;\r\n\r\n  var ES3_STRINGS = indexedObject != Object;\r\n  var STRICT_METHOD$1 = arrayMethodIsStrict('join', ',');\r\n\r\n  // `Array.prototype.join` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.join\r\n  _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$1 }, {\r\n    join: function join(separator) {\r\n      return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\r\n    }\r\n  });\r\n\r\n  // optional / simple context binding\r\n  var functionBindContext = function (fn, that, length) {\r\n    aFunction(fn);\r\n    if (that === undefined) return fn;\r\n    switch (length) {\r\n      case 0: return function () {\r\n        return fn.call(that);\r\n      };\r\n      case 1: return function (a) {\r\n        return fn.call(that, a);\r\n      };\r\n      case 2: return function (a, b) {\r\n        return fn.call(that, a, b);\r\n      };\r\n      case 3: return function (a, b, c) {\r\n        return fn.call(that, a, b, c);\r\n      };\r\n    }\r\n    return function (/* ...args */) {\r\n      return fn.apply(that, arguments);\r\n    };\r\n  };\r\n\r\n  var push = [].push;\r\n\r\n  // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\r\n  var createMethod = function (TYPE) {\r\n    var IS_MAP = TYPE == 1;\r\n    var IS_FILTER = TYPE == 2;\r\n    var IS_SOME = TYPE == 3;\r\n    var IS_EVERY = TYPE == 4;\r\n    var IS_FIND_INDEX = TYPE == 6;\r\n    var IS_FILTER_REJECT = TYPE == 7;\r\n    var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\r\n    return function ($this, callbackfn, that, specificCreate) {\r\n      var O = toObject($this);\r\n      var self = indexedObject(O);\r\n      var boundFunction = functionBindContext(callbackfn, that, 3);\r\n      var length = toLength(self.length);\r\n      var index = 0;\r\n      var create = specificCreate || arraySpeciesCreate;\r\n      var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\r\n      var value, result;\r\n      for (;length > index; index++) if (NO_HOLES || index in self) {\r\n        value = self[index];\r\n        result = boundFunction(value, index, O);\r\n        if (TYPE) {\r\n          if (IS_MAP) target[index] = result; // map\r\n          else if (result) switch (TYPE) {\r\n            case 3: return true;              // some\r\n            case 5: return value;             // find\r\n            case 6: return index;             // findIndex\r\n            case 2: push.call(target, value); // filter\r\n          } else switch (TYPE) {\r\n            case 4: return false;             // every\r\n            case 7: push.call(target, value); // filterReject\r\n          }\r\n        }\r\n      }\r\n      return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\r\n    };\r\n  };\r\n\r\n  var arrayIteration = {\r\n    // `Array.prototype.forEach` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.foreach\r\n    forEach: createMethod(0),\r\n    // `Array.prototype.map` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.map\r\n    map: createMethod(1),\r\n    // `Array.prototype.filter` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n    filter: createMethod(2),\r\n    // `Array.prototype.some` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.some\r\n    some: createMethod(3),\r\n    // `Array.prototype.every` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.every\r\n    every: createMethod(4),\r\n    // `Array.prototype.find` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.find\r\n    find: createMethod(5),\r\n    // `Array.prototype.findIndex` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.findIndex\r\n    findIndex: createMethod(6),\r\n    // `Array.prototype.filterReject` method\r\n    // https://github.com/tc39/proposal-array-filtering\r\n    filterReject: createMethod(7)\r\n  };\r\n\r\n  var $filter = arrayIteration.filter;\r\n\r\n\r\n  var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\r\n\r\n  // `Array.prototype.filter` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {\r\n    filter: function filter(callbackfn /* , thisArg */) {\r\n      return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = \"\".concat(windowSize.width - tooltipOffset.width - targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.left = \"\".concat(tooltipLayerStyleLeft, \"px\");\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = \"\".concat(-targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.right = \"\".concat(tooltipLayerStyleRight, \"px\");\r\n    return true;\r\n  }\r\n\r\n  var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\r\n\r\n  var max = Math.max;\r\n  var min = Math.min;\r\n  var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\r\n\r\n  // `Array.prototype.splice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.splice\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\r\n    splice: function splice(start, deleteCount /* , ...items */) {\r\n      var O = toObject(this);\r\n      var len = toLength(O.length);\r\n      var actualStart = toAbsoluteIndex(start, len);\r\n      var argumentsLength = arguments.length;\r\n      var insertCount, actualDeleteCount, A, k, from, to;\r\n      if (argumentsLength === 0) {\r\n        insertCount = actualDeleteCount = 0;\r\n      } else if (argumentsLength === 1) {\r\n        insertCount = 0;\r\n        actualDeleteCount = len - actualStart;\r\n      } else {\r\n        insertCount = argumentsLength - 2;\r\n        actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\r\n      }\r\n      if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\r\n        throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\r\n      }\r\n      A = arraySpeciesCreate(O, actualDeleteCount);\r\n      for (k = 0; k < actualDeleteCount; k++) {\r\n        from = actualStart + k;\r\n        if (from in O) createProperty(A, k, O[from]);\r\n      }\r\n      A.length = actualDeleteCount;\r\n      if (insertCount < actualDeleteCount) {\r\n        for (k = actualStart; k < len - actualDeleteCount; k++) {\r\n          from = k + actualDeleteCount;\r\n          to = k + insertCount;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n        for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\r\n      } else if (insertCount > actualDeleteCount) {\r\n        for (k = len - actualDeleteCount; k > actualStart; k--) {\r\n          from = k + actualDeleteCount - 1;\r\n          to = k + insertCount - 1;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n      }\r\n      for (k = 0; k < insertCount; k++) {\r\n        O[k + actualStart] = arguments[k + 2];\r\n      }\r\n      O.length = len - actualDeleteCount + insertCount;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.includes(stringToRemove)) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * auto-determine alignment\r\n   * @param {Integer}  offsetLeft\r\n   * @param {Integer}  tooltipWidth\r\n   * @param {Object}   windowSize\r\n   * @param {String}   desiredAlignment\r\n   * @return {String}  calculatedAlignment\r\n   */\r\n\r\n  function _determineAutoAlignment(offsetLeft, tooltipWidth, _ref, desiredAlignment) {\r\n    var width = _ref.width;\r\n    var halfTooltipWidth = tooltipWidth / 2;\r\n    var winWidth = Math.min(width, window.screen.width);\r\n    var possibleAlignments = [\"-left-aligned\", \"-middle-aligned\", \"-right-aligned\"];\r\n    var calculatedAlignment = \"\"; // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-left-aligned\");\r\n    } // valid middle must be at least half\r\n    // width away from both sides\r\n\r\n\r\n    if (offsetLeft < halfTooltipWidth || winWidth - offsetLeft < halfTooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-middle-aligned\");\r\n    } // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n\r\n\r\n    if (offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-right-aligned\");\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.includes(desiredAlignment)) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small\r\n      // for ANY alignment, middle is\r\n      // probably the best for visibility\r\n      calculatedAlignment = \"-middle-aligned\";\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n\r\n\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = getWinSize();\r\n    var tooltipHeight = getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect(); // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n\r\n    var calculatedPosition = \"floating\";\r\n    /*\r\n     * auto determine position\r\n     */\r\n    // Check for space below\r\n\r\n    if (targetElementRect.bottom + tooltipHeight > windowSize.height) {\r\n      removeEntry(possiblePositions, \"bottom\");\r\n    } // Check for space above\r\n\r\n\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      removeEntry(possiblePositions, \"top\");\r\n    } // Check for space to the right\r\n\r\n\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      removeEntry(possiblePositions, \"right\");\r\n    } // Check for space to the left\r\n\r\n\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      removeEntry(possiblePositions, \"left\");\r\n    } // @var {String}  ex: 'right-aligned'\r\n\r\n\r\n    var desiredAlignment = function (pos) {\r\n      var hyphenIndex = pos.indexOf(\"-\");\r\n\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n\r\n      return \"\";\r\n    }(desiredTooltipPosition || \"\"); // strip alignment from position\r\n\r\n\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split(\"-\")[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (possiblePositions.includes(desiredTooltipPosition)) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    } // only top and bottom positions have optional alignments\r\n\r\n\r\n    if ([\"top\", \"bottom\"].includes(calculatedPosition)) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n\r\n\r\n  function placeTooltip(targetElement, tooltipLayer, arrowLayer, hintMode) {\r\n    var tooltipCssClass = \"\";\r\n    var currentStepObj;\r\n    var tooltipOffset;\r\n    var targetOffset;\r\n    var windowSize;\r\n    var currentTooltipPosition;\r\n    hintMode = hintMode || false; //reset the old style\r\n\r\n    tooltipLayer.style.top = null;\r\n    tooltipLayer.style.right = null;\r\n    tooltipLayer.style.bottom = null;\r\n    tooltipLayer.style.left = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop = null;\r\n    arrowLayer.style.display = \"inherit\"; //prevent error when `this._currentStep` is undefined\r\n\r\n    if (!this._introItems[this._currentStep]) return; //if we have a custom css class for each step\r\n\r\n    currentStepObj = this._introItems[this._currentStep];\r\n\r\n    if (typeof currentStepObj.tooltipClass === \"string\") {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = [\"introjs-tooltip\", tooltipCssClass].filter(Boolean).join(\" \");\r\n    tooltipLayer.setAttribute(\"role\", \"dialog\");\r\n    currentTooltipPosition = this._introItems[this._currentStep].position; // Floating is always valid, no point in calculating\r\n\r\n    if (currentTooltipPosition !== \"floating\" && this._options.autoPosition) {\r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset = getOffset(targetElement);\r\n    tooltipOffset = getOffset(tooltipLayer);\r\n    windowSize = getWinSize();\r\n    addClass(tooltipLayer, \"introjs-\".concat(currentTooltipPosition));\r\n\r\n    switch (currentTooltipPosition) {\r\n      case \"top-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-right\";\r\n        var tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-middle\";\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-left-aligned\": // top-left-aligned is the same as the default top\r\n\r\n      case \"top\":\r\n        arrowLayer.className = \"introjs-arrow bottom\";\r\n        tooltipLayerStyleLeft = hintMode ? 0 : 15;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"right\":\r\n        tooltipLayer.style.left = \"\".concat(targetOffset.width + 20, \"px\");\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow left\";\r\n        }\r\n\r\n        break;\r\n\r\n      case \"left\":\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = \"15px\";\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n          arrowLayer.className = \"introjs-arrow right-bottom\";\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow right\";\r\n        }\r\n\r\n        tooltipLayer.style.right = \"\".concat(targetOffset.width + 20, \"px\");\r\n        break;\r\n\r\n      case \"floating\":\r\n        arrowLayer.style.display = \"none\"; //we have to adjust the top and left of layer manually for intro items without element\r\n\r\n        tooltipLayer.style.left = \"50%\";\r\n        tooltipLayer.style.top = \"50%\";\r\n        tooltipLayer.style.marginLeft = \"-\".concat(tooltipOffset.width / 2, \"px\");\r\n        tooltipLayer.style.marginTop = \"-\".concat(tooltipOffset.height / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-right\";\r\n        tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-middle\";\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n\r\n      default:\r\n        arrowLayer.className = \"introjs-arrow top\";\r\n        tooltipLayerStyleLeft = 0;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n\r\n  function removeShowElement() {\r\n    var elms = document.querySelectorAll(\".introjs-showElement\");\r\n    forEach(elms, function (elm) {\r\n      removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  function _createElement(tagname, attrs) {\r\n    var element = document.createElement(tagname);\r\n    attrs = attrs || {}; // regex for matching attributes that need to be set with setAttribute\r\n\r\n    var setAttRegex = /^(?:role|data-|aria-)/;\r\n\r\n    for (var k in attrs) {\r\n      var v = attrs[k];\r\n\r\n      if (k === \"style\") {\r\n        setStyle(element, v);\r\n      } else if (k.match(setAttRegex)) {\r\n        element.setAttribute(k, v);\r\n      } else {\r\n        element[k] = v;\r\n      }\r\n    }\r\n\r\n    return element;\r\n  }\r\n\r\n  /**\r\n   * Appends `element` to `parentElement`\r\n   *\r\n   * @param {Element} parentElement\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function appendChild(parentElement, element, animate) {\r\n    if (animate) {\r\n      var existingOpacity = element.style.opacity || \"1\";\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        setStyle(element, {\r\n          opacity: existingOpacity\r\n        });\r\n      }, 10);\r\n    }\r\n\r\n    parentElement.appendChild(element);\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt(this._currentStep + 1, 10);\r\n    return currentStep / this._introItems.length * 100;\r\n  }\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n\r\n\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = _createElement(\"div\", {\r\n        className: \"introjs-disableInteraction\"\r\n      });\r\n\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n  /**\r\n   * Creates the bullets layer\r\n   * @returns HTMLElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createBullets(targetElement) {\r\n    var self = this;\r\n    var bulletsLayer = _createElement(\"div\", {\r\n      className: \"introjs-bullets\"\r\n    });\r\n\r\n    if (this._options.showBullets === false) {\r\n      bulletsLayer.style.display = \"none\";\r\n    }\r\n\r\n    var ulContainer = _createElement(\"ul\");\r\n    ulContainer.setAttribute(\"role\", \"tablist\");\r\n\r\n    var anchorClick = function anchorClick() {\r\n      self.goToStep(this.getAttribute(\"data-stepnumber\"));\r\n    };\r\n\r\n    forEach(this._introItems, function (_ref, i) {\r\n      var step = _ref.step;\r\n      var innerLi = _createElement(\"li\");\r\n      var anchorLink = _createElement(\"a\");\r\n      innerLi.setAttribute(\"role\", \"presentation\");\r\n      anchorLink.setAttribute(\"role\", \"tab\");\r\n      anchorLink.onclick = anchorClick;\r\n\r\n      if (i === targetElement.step - 1) {\r\n        anchorLink.className = \"active\";\r\n      }\r\n\r\n      setAnchorAsButton(anchorLink);\r\n      anchorLink.innerHTML = \"&nbsp;\";\r\n      anchorLink.setAttribute(\"data-stepnumber\", step);\r\n      innerLi.appendChild(anchorLink);\r\n      ulContainer.appendChild(innerLi);\r\n    });\r\n    bulletsLayer.appendChild(ulContainer);\r\n    return bulletsLayer;\r\n  }\r\n  /**\r\n   * Deletes and recreates the bullets layer\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _recreateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      var existing = document.querySelector(\".introjs-bullets\");\r\n      existing.parentNode.replaceChild(_createBullets.call(this, targetElement), existing);\r\n    }\r\n  }\r\n  /**\r\n   * Updates the bullets\r\n   *\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   */\r\n\r\n  function _updateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a.active\").className = \"\";\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a[data-stepnumber=\\\"\".concat(targetElement.step, \"\\\"]\")).className = \"active\";\r\n    }\r\n  }\r\n  /**\r\n   * Creates the progress-bar layer and elements\r\n   * @returns {*}\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createProgressBar() {\r\n    var progressLayer = _createElement(\"div\");\r\n    progressLayer.className = \"introjs-progress\";\r\n\r\n    if (this._options.showProgress === false) {\r\n      progressLayer.style.display = \"none\";\r\n    }\r\n\r\n    var progressBar = _createElement(\"div\", {\r\n      className: \"introjs-progressbar\"\r\n    });\r\n\r\n    if (this._options.progressBarAdditionalClass) {\r\n      progressBar.className += \" \" + this._options.progressBarAdditionalClass;\r\n    }\r\n\r\n    progressBar.setAttribute(\"role\", \"progress\");\r\n    progressBar.setAttribute(\"aria-valuemin\", 0);\r\n    progressBar.setAttribute(\"aria-valuemax\", 100);\r\n    progressBar.setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n    progressBar.style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    progressLayer.appendChild(progressBar);\r\n    return progressLayer;\r\n  }\r\n  /**\r\n   * Updates an existing progress bar variables\r\n   * @param oldReferenceLayer\r\n   * @private\r\n   */\r\n\r\n\r\n  function _updateProgressBar(oldReferenceLayer) {\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n  }\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function _showElement(targetElement) {\r\n    var _this = this;\r\n\r\n    if (typeof this._introChangeCallback !== \"undefined\") {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this;\r\n    var oldHelperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var oldReferenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var highlightClass = \"introjs-helperLayer\";\r\n    var nextTooltipButton;\r\n    var prevTooltipButton;\r\n    var skipTooltipButton; //check for a current step highlight class\r\n\r\n    if (typeof targetElement.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(targetElement.highlightClass);\r\n    } //check for options highlight class\r\n\r\n\r\n    if (typeof this._options.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null && oldReferenceLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector(\".introjs-helperNumberLayer\");\r\n      var oldtooltipLayer = oldReferenceLayer.querySelector(\".introjs-tooltiptext\");\r\n      var oldTooltipTitleLayer = oldReferenceLayer.querySelector(\".introjs-tooltip-title\");\r\n      var oldArrowLayer = oldReferenceLayer.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = oldReferenceLayer.querySelector(\".introjs-tooltip\");\r\n      skipTooltipButton = oldReferenceLayer.querySelector(\".introjs-skipbutton\");\r\n      prevTooltipButton = oldReferenceLayer.querySelector(\".introjs-prevbutton\");\r\n      nextTooltipButton = oldReferenceLayer.querySelector(\".introjs-nextbutton\"); //update or reset the helper highlight class\r\n\r\n      oldHelperLayer.className = highlightClass; //hide the tooltip\r\n\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\"; // if the target element is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); // set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, oldHelperLayer);\r\n      setHelperLayerPosition.call(self, oldReferenceLayer); //remove old classes if the element still exist\r\n\r\n      removeShowElement(); //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function () {\r\n        // set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(_this._introItems.length);\r\n        } // set current tooltip text\r\n\r\n\r\n        oldtooltipLayer.innerHTML = targetElement.intro; // set current tooltip title\r\n\r\n        oldTooltipTitleLayer.innerHTML = targetElement.title; //set the tooltip position\r\n\r\n        oldtooltipContainer.style.display = \"block\";\r\n        placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer); //change active bullet\r\n\r\n        _updateBullets.call(self, oldReferenceLayer, targetElement);\r\n\r\n        _updateProgressBar.call(self, oldReferenceLayer); //show the tooltip\r\n\r\n\r\n        oldtooltipContainer.style.opacity = 1; //reset button focus\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null && /introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          nextTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        } // change the scroll of the window, if needed\r\n\r\n\r\n        scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350); // end of old element if-else condition\r\n    } else {\r\n      var helperLayer = _createElement(\"div\", {\r\n        className: highlightClass\r\n      });\r\n      var referenceLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltipReferenceLayer\"\r\n      });\r\n      var arrowLayer = _createElement(\"div\", {\r\n        className: \"introjs-arrow\"\r\n      });\r\n      var tooltipLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip\"\r\n      });\r\n      var tooltipTextLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltiptext\"\r\n      });\r\n      var tooltipHeaderLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip-header\"\r\n      });\r\n      var tooltipTitleLayer = _createElement(\"h1\", {\r\n        className: \"introjs-tooltip-title\"\r\n      });\r\n      var buttonsLayer = _createElement(\"div\");\r\n      setStyle(helperLayer, {\r\n        \"box-shadow\": \"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, \".concat(self._options.overlayOpacity.toString(), \") 0 0 0 5000px\")\r\n      }); // target is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); //set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, helperLayer);\r\n      setHelperLayerPosition.call(self, referenceLayer); //add helper layer to target element\r\n\r\n      appendChild(this._targetElement, helperLayer, true);\r\n      appendChild(this._targetElement, referenceLayer);\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n      tooltipTitleLayer.innerHTML = targetElement.title;\r\n      buttonsLayer.className = \"introjs-tooltipbuttons\";\r\n\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = \"none\";\r\n      }\r\n\r\n      tooltipHeaderLayer.appendChild(tooltipTitleLayer);\r\n      tooltipLayer.appendChild(tooltipHeaderLayer);\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(_createBullets.call(this, targetElement));\r\n      tooltipLayer.appendChild(_createProgressBar.call(this)); // add helper layer number\r\n\r\n      var helperNumberLayer = _createElement(\"div\");\r\n\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = \"introjs-helperNumberLayer\";\r\n        helperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(this._introItems.length);\r\n        tooltipLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer); //next button\r\n\r\n      nextTooltipButton = _createElement(\"a\");\r\n\r\n      nextTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          nextStep.call(self);\r\n        } else if (/introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          if (typeof self._introCompleteCallback === \"function\") {\r\n            self._introCompleteCallback.call(self);\r\n          }\r\n\r\n          exitIntro.call(self, self._targetElement);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel; //previous button\r\n\r\n      prevTooltipButton = _createElement(\"a\");\r\n\r\n      prevTooltipButton.onclick = function () {\r\n        if (self._currentStep !== 0) {\r\n          previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel; //skip button\r\n\r\n      skipTooltipButton = _createElement(\"a\", {\r\n        className: \"introjs-skipbutton\"\r\n      });\r\n      setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof self._introCompleteCallback === \"function\") {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (typeof self._introSkipCallback === \"function\") {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      tooltipHeaderLayer.appendChild(skipTooltipButton); //in order to prevent displaying previous button always\r\n\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n      } // we always need the next button because this\r\n      // button changes to \"Done\" in the last step of the tour\r\n\r\n\r\n      buttonsLayer.appendChild(nextTooltipButton);\r\n      tooltipLayer.appendChild(buttonsLayer); //set proper position\r\n\r\n      placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer); // change the scroll of the window, if needed\r\n\r\n      scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer); //end of new element if-else condition\r\n    } // removing previous disable interaction layer\r\n\r\n\r\n    var disableInteractionLayer = self._targetElement.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    } //disable interaction\r\n\r\n\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    } // when it's the first step of tour\r\n\r\n\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          addClass(nextTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-disabled\");\r\n        }\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          addClass(prevTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          if (this._options.nextToDone === true) {\r\n            nextTooltipButton.innerHTML = this._options.doneLabel;\r\n            addClass(nextTooltipButton, \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-donebutton\"));\r\n          } else {\r\n            nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-disabled\");\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n    }\r\n\r\n    if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n      prevTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n      skipTooltipButton.setAttribute(\"role\", \"button\");\r\n    } //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    setShowElement(targetElement);\r\n\r\n    if (typeof this._introAfterChangeCallback !== \"undefined\") {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n\r\n  function goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n\r\n  function goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n\r\n  function nextStep() {\r\n    var _this = this;\r\n\r\n    this._direction = \"forward\";\r\n\r\n    if (typeof this._currentStepNumber !== \"undefined\") {\r\n      forEach(this._introItems, function (_ref, i) {\r\n        var step = _ref.step;\r\n\r\n        if (step === _this._currentStepNumber) {\r\n          _this._currentStep = i - 1;\r\n          _this._currentStepNumber = undefined;\r\n        }\r\n      });\r\n    }\r\n\r\n    if (typeof this._currentStep === \"undefined\") {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if (this._introItems.length <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof this._introCompleteCallback === \"function\") {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n\r\n      exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n\r\n  function previousStep() {\r\n    this._direction = \"backward\";\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Returns the current step of the intro\r\n   *\r\n   * @returns {number | boolean}\r\n   */\r\n\r\n  function currentStep() {\r\n    return this._currentStep;\r\n  }\r\n\r\n  /**\r\n   * on keyCode:\r\n   * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n   * This feature has been removed from the Web standards.\r\n   * Though some browsers may still support it, it is in\r\n   * the process of being dropped.\r\n   * Instead, you should use KeyboardEvent.code,\r\n   * if it's implemented.\r\n   *\r\n   * jQuery's approach is to test for\r\n   *   (1) e.which, then\r\n   *   (2) e.charCode, then\r\n   *   (3) e.keyCode\r\n   * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n   *\r\n   * @param type var\r\n   * @return type\r\n   */\r\n\r\n  function onKeyDown(e) {\r\n    var code = e.code === undefined ? e.which : e.code; // if e.which is null\r\n\r\n    if (code === null) {\r\n      code = e.charCode === null ? e.keyCode : e.charCode;\r\n    }\r\n\r\n    if ((code === \"Escape\" || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      exitIntro.call(this, this._targetElement);\r\n    } else if (code === \"ArrowLeft\" || code === 37) {\r\n      //left arrow\r\n      previousStep.call(this);\r\n    } else if (code === \"ArrowRight\" || code === 39) {\r\n      //right arrow\r\n      nextStep.call(this);\r\n    } else if (code === \"Enter\" || code === \"NumpadEnter\" || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n\r\n      if (target && target.className.match(\"introjs-prevbutton\")) {\r\n        //user hit enter while focusing on previous button\r\n        previousStep.call(this);\r\n      } else if (target && target.className.match(\"introjs-skipbutton\")) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof this._introCompleteCallback === \"function\") {\r\n          this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute(\"data-stepnumber\")) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        nextStep.call(this);\r\n      } //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n\r\n\r\n      if (e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n   */\r\n  function cloneObject(object) {\r\n    if (object === null || _typeof(object) !== \"object\" || typeof object.nodeType !== \"undefined\") {\r\n      return object;\r\n    }\r\n\r\n    var temp = {};\r\n\r\n    for (var key in object) {\r\n      if (typeof window.jQuery !== \"undefined\" && object[key] instanceof window.jQuery) {\r\n        temp[key] = object[key];\r\n      } else {\r\n        temp[key] = cloneObject(object[key]);\r\n      }\r\n    }\r\n\r\n    return temp;\r\n  }\r\n\r\n  /**\r\n   * Get a queryselector within the hint wrapper\r\n   *\r\n   * @param {String} selector\r\n   * @return {NodeList|Array}\r\n   */\r\n\r\n  function hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n    return hintsWrapper ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method hideHint\r\n   */\r\n\r\n  function hideHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n    removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      addClass(hint, \"introjs-hidehint\");\r\n    } // call the callback function (if any)\r\n\r\n\r\n    if (typeof this._hintCloseCallback !== \"undefined\") {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method hideHints\r\n   */\r\n\r\n  function hideHints() {\r\n    var _this = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      hideHint.call(_this, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n\r\n  function showHints() {\r\n    var _this2 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n\r\n    if (hints && hints.length) {\r\n      forEach(hints, function (hint) {\r\n        showHint.call(_this2, hint.getAttribute(\"data-step\"));\r\n      });\r\n    } else {\r\n      populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method showHint\r\n   */\r\n\r\n  function showHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method removeHints\r\n   */\r\n\r\n  function removeHints() {\r\n    var _this3 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      removeHint.call(_this3, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method removeHint\r\n   */\r\n\r\n  function removeHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method addHints\r\n   */\r\n\r\n  function addHints() {\r\n    var _this4 = this;\r\n\r\n    var self = this;\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = _createElement(\"div\", {\r\n        className: \"introjs-hints\"\r\n      });\r\n    }\r\n    /**\r\n     * Returns an event handler unique to the hint iteration\r\n     *\r\n     * @param {Integer} i\r\n     * @return {Function}\r\n     */\r\n\r\n\r\n    var getHintClick = function getHintClick(i) {\r\n      return function (e) {\r\n        var evt = e ? e : window.event;\r\n\r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    forEach(this._introItems, function (item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector(\".introjs-hint[data-step=\\\"\".concat(i, \"\\\"]\"))) {\r\n        return;\r\n      }\r\n\r\n      var hint = _createElement(\"a\", {\r\n        className: \"introjs-hint\"\r\n      });\r\n      setAnchorAsButton(hint);\r\n      hint.onclick = getHintClick(i);\r\n\r\n      if (!item.hintAnimation) {\r\n        addClass(hint, \"introjs-hint-no-anim\");\r\n      } // hint's position should be fixed if the target element's position is fixed\r\n\r\n\r\n      if (isFixed(item.element)) {\r\n        addClass(hint, \"introjs-fixedhint\");\r\n      }\r\n\r\n      var hintDot = _createElement(\"div\", {\r\n        className: \"introjs-hint-dot\"\r\n      });\r\n      var hintPulse = _createElement(\"div\", {\r\n        className: \"introjs-hint-pulse\"\r\n      });\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute(\"data-step\", i); // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n\r\n      item.targetElement = item.element;\r\n      item.element = hint; // align the hint position\r\n\r\n      alignHintPosition.call(_this4, item.hintPosition, hint, item.targetElement);\r\n      hintsWrapper.appendChild(hint);\r\n    }); // adding the hints wrapper\r\n\r\n    document.body.appendChild(hintsWrapper); // call the callback function (if any)\r\n\r\n    if (typeof this._hintsAddedCallback !== \"undefined\") {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n\r\n  function alignHintPosition(position, _ref, element) {\r\n    var style = _ref.style;\r\n    // get/calculate offset of target element\r\n    var offset = getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20; // align the hint element\r\n\r\n    switch (position) {\r\n      default:\r\n      case \"top-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"top-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"bottom-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"middle-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"top-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n    }\r\n  }\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n\r\n  function showHintDialog(stepId) {\r\n    var hintElement = document.querySelector(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"));\r\n    var item = this._introItems[stepId]; // call the callback function (if any)\r\n\r\n    if (typeof this._hintClickCallback !== \"undefined\") {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    } // remove all open tooltips\r\n\r\n\r\n    var removedStep = removeHintTooltip.call(this); // to toggle the tooltip\r\n\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = _createElement(\"div\", {\r\n      className: \"introjs-tooltip\"\r\n    });\r\n    var tooltipTextLayer = _createElement(\"div\");\r\n    var arrowLayer = _createElement(\"div\");\r\n    var referenceLayer = _createElement(\"div\");\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      } //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = \"introjs-tooltiptext\";\r\n    var tooltipWrapper = _createElement(\"p\");\r\n    tooltipWrapper.innerHTML = item.hint;\r\n    var closeButton = _createElement(\"a\");\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute(\"role\", \"button\");\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = hideHint.bind(this, stepId);\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n    arrowLayer.className = \"introjs-arrow\";\r\n    tooltipLayer.appendChild(arrowLayer);\r\n    tooltipLayer.appendChild(tooltipTextLayer); // set current step for _placeTooltip function\r\n\r\n    this._currentStep = hintElement.getAttribute(\"data-step\"); // align reference layer position\r\n\r\n    referenceLayer.className = \"introjs-tooltipReferenceLayer introjs-hintReference\";\r\n    referenceLayer.setAttribute(\"data-step\", hintElement.getAttribute(\"data-step\"));\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer); //set proper position\r\n\r\n    placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, true);\r\n  }\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n\r\n  function removeHintTooltip() {\r\n    var tooltip = document.querySelector(\".introjs-hintReference\");\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute(\"data-step\");\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n\r\n  function populateHints(targetElm) {\r\n    var _this5 = this;\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      forEach(this._options.hints, function (hint) {\r\n        var currentItem = cloneObject(hint);\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || _this5._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || _this5._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          _this5._introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      var hints = targetElm.querySelectorAll(\"*[data-hint]\");\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      } //first add intro items with data-step\r\n\r\n\r\n      forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute(\"data-hintanimation\");\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = hintAnimation === \"true\";\r\n        } else {\r\n          hintAnimation = _this5._options.hintAnimation;\r\n        }\r\n\r\n        _this5._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute(\"data-hint\"),\r\n          hintPosition: currentElement.getAttribute(\"data-hintposition\") || _this5._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n          position: currentElement.getAttribute(\"data-position\") || _this5._options.tooltipPosition\r\n        });\r\n      });\r\n    }\r\n\r\n    addHints.call(this);\r\n    /*\r\n    todo:\r\n    these events should be removed at some point\r\n    */\r\n\r\n    DOMEvent.on(document, \"click\", removeHintTooltip, this, false);\r\n    DOMEvent.on(window, \"resize\", reAlignHints, this, true);\r\n  }\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n\r\n  function reAlignHints() {\r\n    var _this6 = this;\r\n\r\n    forEach(this._introItems, function (_ref2) {\r\n      var targetElement = _ref2.targetElement,\r\n          hintPosition = _ref2.hintPosition,\r\n          element = _ref2.element;\r\n\r\n      if (typeof targetElement === \"undefined\") {\r\n        return;\r\n      }\r\n\r\n      alignHintPosition.call(_this6, hintPosition, element, targetElement);\r\n    });\r\n  }\r\n\r\n  // TODO: use something more complex like timsort?\r\n  var floor = Math.floor;\r\n\r\n  var mergeSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var middle = floor(length / 2);\r\n    return length < 8 ? insertionSort(array, comparefn) : merge(\r\n      mergeSort(array.slice(0, middle), comparefn),\r\n      mergeSort(array.slice(middle), comparefn),\r\n      comparefn\r\n    );\r\n  };\r\n\r\n  var insertionSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var i = 1;\r\n    var element, j;\r\n\r\n    while (i < length) {\r\n      j = i;\r\n      element = array[i];\r\n      while (j && comparefn(array[j - 1], element) > 0) {\r\n        array[j] = array[--j];\r\n      }\r\n      if (j !== i++) array[j] = element;\r\n    } return array;\r\n  };\r\n\r\n  var merge = function (left, right, comparefn) {\r\n    var llength = left.length;\r\n    var rlength = right.length;\r\n    var lindex = 0;\r\n    var rindex = 0;\r\n    var result = [];\r\n\r\n    while (lindex < llength || rindex < rlength) {\r\n      if (lindex < llength && rindex < rlength) {\r\n        result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);\r\n      } else {\r\n        result.push(lindex < llength ? left[lindex++] : right[rindex++]);\r\n      }\r\n    } return result;\r\n  };\r\n\r\n  var arraySort = mergeSort;\r\n\r\n  var firefox = engineUserAgent.match(/firefox\\/(\\d+)/i);\r\n\r\n  var engineFfVersion = !!firefox && +firefox[1];\r\n\r\n  var engineIsIeOrEdge = /MSIE|Trident/.test(engineUserAgent);\r\n\r\n  var webkit = engineUserAgent.match(/AppleWebKit\\/(\\d+)\\./);\r\n\r\n  var engineWebkitVersion = !!webkit && +webkit[1];\r\n\r\n  var test = [];\r\n  var nativeSort = test.sort;\r\n\r\n  // IE8-\r\n  var FAILS_ON_UNDEFINED = fails(function () {\r\n    test.sort(undefined);\r\n  });\r\n  // V8 bug\r\n  var FAILS_ON_NULL = fails(function () {\r\n    test.sort(null);\r\n  });\r\n  // Old WebKit\r\n  var STRICT_METHOD = arrayMethodIsStrict('sort');\r\n\r\n  var STABLE_SORT = !fails(function () {\r\n    // feature detection can be too slow, so check engines versions\r\n    if (engineV8Version) return engineV8Version < 70;\r\n    if (engineFfVersion && engineFfVersion > 3) return;\r\n    if (engineIsIeOrEdge) return true;\r\n    if (engineWebkitVersion) return engineWebkitVersion < 603;\r\n\r\n    var result = '';\r\n    var code, chr, value, index;\r\n\r\n    // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\r\n    for (code = 65; code < 76; code++) {\r\n      chr = String.fromCharCode(code);\r\n\r\n      switch (code) {\r\n        case 66: case 69: case 70: case 72: value = 3; break;\r\n        case 68: case 71: value = 4; break;\r\n        default: value = 2;\r\n      }\r\n\r\n      for (index = 0; index < 47; index++) {\r\n        test.push({ k: chr + index, v: value });\r\n      }\r\n    }\r\n\r\n    test.sort(function (a, b) { return b.v - a.v; });\r\n\r\n    for (index = 0; index < test.length; index++) {\r\n      chr = test[index].k.charAt(0);\r\n      if (result.charAt(result.length - 1) !== chr) result += chr;\r\n    }\r\n\r\n    return result !== 'DGBEFHACIJK';\r\n  });\r\n\r\n  var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\r\n\r\n  var getSortCompare = function (comparefn) {\r\n    return function (x, y) {\r\n      if (y === undefined) return -1;\r\n      if (x === undefined) return 1;\r\n      if (comparefn !== undefined) return +comparefn(x, y) || 0;\r\n      return toString_1(x) > toString_1(y) ? 1 : -1;\r\n    };\r\n  };\r\n\r\n  // `Array.prototype.sort` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.sort\r\n  _export({ target: 'Array', proto: true, forced: FORCED }, {\r\n    sort: function sort(comparefn) {\r\n      if (comparefn !== undefined) aFunction(comparefn);\r\n\r\n      var array = toObject(this);\r\n\r\n      if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);\r\n\r\n      var items = [];\r\n      var arrayLength = toLength(array.length);\r\n      var itemsLength, index;\r\n\r\n      for (index = 0; index < arrayLength; index++) {\r\n        if (index in array) items.push(array[index]);\r\n      }\r\n\r\n      items = arraySort(items, getSortCompare(comparefn));\r\n      itemsLength = items.length;\r\n      index = 0;\r\n\r\n      while (index < itemsLength) array[index] = items[index++];\r\n      while (index < arrayLength) delete array[index++];\r\n\r\n      return array;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Finds all Intro steps from the data-* attributes and the options.steps array\r\n   *\r\n   * @api private\r\n   * @param targetElm\r\n   * @returns {[]}\r\n   */\r\n\r\n  function fetchIntroSteps(targetElm) {\r\n    var _this = this;\r\n\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\");\r\n    var introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      forEach(this._options.steps, function (step) {\r\n        var currentItem = cloneObject(step); //set the step\r\n\r\n        currentItem.step = introItems.length + 1;\r\n        currentItem.title = currentItem.title || \"\"; //use querySelector function only when developer used CSS selector\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        } //intro without element\r\n\r\n\r\n        if (typeof currentItem.element === \"undefined\" || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = _createElement(\"div\", {\r\n              className: \"introjsFloatingElement\"\r\n            });\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element = floatingElementQuery;\r\n          currentItem.position = \"floating\";\r\n        }\r\n\r\n        currentItem.position = currentItem.position || _this._options.tooltipPosition;\r\n        currentItem.scrollTo = currentItem.scrollTo || _this._options.scrollTo;\r\n\r\n        if (typeof currentItem.disableInteraction === \"undefined\") {\r\n          currentItem.disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction; //if there's no element to intro\r\n\r\n      if (elmsLength < 1) {\r\n        return [];\r\n      }\r\n\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        } // skip hidden elements\r\n\r\n\r\n        if (currentElement.style.display === \"none\") {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute(\"data-step\"), 10);\r\n\r\n        if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n          disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n        } else {\r\n          disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: parseInt(currentElement.getAttribute(\"data-step\"), 10),\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }); //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n\r\n      var nextStep = 0;\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        }\r\n\r\n        if (currentElement.getAttribute(\"data-step\") === null) {\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === \"undefined\") {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          }\r\n\r\n          if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n            disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n          } else {\r\n            disableInteraction = _this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      });\r\n    } //removing undefined/null elements\r\n\r\n\r\n    var tempIntroItems = [];\r\n\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);\r\n      }\r\n    }\r\n\r\n    introItems = tempIntroItems; //Ok, sort all items with given steps\r\n\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n    return introItems;\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   * @param {boolean} refreshSteps to refresh the intro steps as well\r\n   */\r\n\r\n  function refresh(refreshSteps) {\r\n    var referenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var helperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\"); // re-align intros\r\n\r\n    setHelperLayerPosition.call(this, helperLayer);\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n\r\n    if (refreshSteps) {\r\n      this._introItems = fetchIntroSteps.call(this, this._targetElement);\r\n\r\n      _recreateBullets.call(this, referenceLayer, this._introItems[this._currentStep]);\r\n\r\n      _updateProgressBar.call(this, referenceLayer);\r\n    } // re-align tooltip\r\n\r\n\r\n    if (this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldArrowLayer = document.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = document.querySelector(\".introjs-tooltip\");\r\n      placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer);\r\n    } //re-align hints\r\n\r\n\r\n    reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  function onResize() {\r\n    refresh.call(this);\r\n  }\r\n\r\n  /**\r\n   * Removes `element` from `parentElement`\r\n   *\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function removeChild(element, animate) {\r\n    if (!element || !element.parentElement) return;\r\n    var parentElement = element.parentElement;\r\n\r\n    if (animate) {\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        try {\r\n          // removeChild(..) throws an exception if the child has already been removed (https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild)\r\n          // this try-catch is added to make sure this function doesn't throw an exception if the child has been removed\r\n          // this scenario can happen when start()/exit() is called multiple times and the helperLayer is removed by the\r\n          // previous exit() call (note: this is a timeout)\r\n          parentElement.removeChild(element);\r\n        } catch (e) {}\r\n      }, 500);\r\n    } else {\r\n      parentElement.removeChild(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n\r\n  function exitIntro(targetElement, force) {\r\n    var continueExit = true; // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    } // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n\r\n\r\n    if (!force && continueExit === false) return; // remove overlay layers from the page\r\n\r\n    var overlayLayers = targetElement.querySelectorAll(\".introjs-overlay\");\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      forEach(overlayLayers, function (overlayLayer) {\r\n        return removeChild(overlayLayer);\r\n      });\r\n    } //remove all helper layers\r\n\r\n\r\n    var helperLayer = targetElement.querySelector(\".introjs-helperLayer\");\r\n    removeChild(helperLayer, true);\r\n    var referenceLayer = targetElement.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    removeChild(referenceLayer); //remove disableInteractionLayer\r\n\r\n    var disableInteractionLayer = targetElement.querySelector(\".introjs-disableInteraction\");\r\n    removeChild(disableInteractionLayer); //remove intro floating element\r\n\r\n    var floatingElement = document.querySelector(\".introjsFloatingElement\");\r\n    removeChild(floatingElement);\r\n    removeShowElement(); //clean listeners\r\n\r\n    DOMEvent.off(window, \"keydown\", onKeyDown, this, true);\r\n    DOMEvent.off(window, \"resize\", onResize, this, true); //check if any callback is defined\r\n\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    } //set the step to zero\r\n\r\n\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n\r\n  function addOverlayLayer(targetElm) {\r\n    var _this = this;\r\n\r\n    var overlayLayer = _createElement(\"div\", {\r\n      className: \"introjs-overlay\"\r\n    });\r\n    setStyle(overlayLayer, {\r\n      top: 0,\r\n      bottom: 0,\r\n      left: 0,\r\n      right: 0,\r\n      position: \"fixed\"\r\n    });\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    if (this._options.exitOnOverlayClick === true) {\r\n      setStyle(overlayLayer, {\r\n        cursor: \"pointer\"\r\n      });\r\n\r\n      overlayLayer.onclick = function () {\r\n        exitIntro.call(_this, targetElm);\r\n      };\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method introForElement\r\n   * @param {Object} targetElm\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n\r\n  function introForElement(targetElm) {\r\n    //set it to the introJs object\r\n    var steps = fetchIntroSteps.call(this, targetElm);\r\n\r\n    if (steps.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    this._introItems = steps; //add overlay layer to the page\r\n\r\n    if (addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, \"keydown\", onKeyDown, this, true);\r\n      } //for window resize\r\n\r\n\r\n      DOMEvent.on(window, \"resize\", onResize, this, true);\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  var version = \"4.2.2\";\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: \"Next\",\r\n\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: \"Back\",\r\n\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: \"×\",\r\n\r\n      /* Done button label in tooltip box */\r\n      doneLabel: \"Done\",\r\n\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button (note: this will also hide the \"Done\" button) */\r\n      hideNext: false,\r\n\r\n      /* Change the Next button to Done in the last step of the intro? otherwise, it will render a disabled button */\r\n      nextToDone: true,\r\n\r\n      /* Default tooltip box position */\r\n      tooltipPosition: \"bottom\",\r\n\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: \"\",\r\n\r\n      /* Start intro for a group of elements */\r\n      group: \"\",\r\n\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: \"\",\r\n\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: false,\r\n\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: \"element\",\r\n\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.5,\r\n\r\n      /* To determine the tooltip position automatically based on the window.width/height */\r\n      autoPosition: true,\r\n\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n\r\n      /* Default hint position */\r\n      hintPosition: \"top-middle\",\r\n\r\n      /* Hint button label */\r\n      hintButtonLabel: \"Got it\",\r\n\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\",\r\n\r\n      /* additional classes to put on progress bar */\r\n      progressBarAdditionalClass: false\r\n    };\r\n  }\r\n\r\n  var introJs = function introJs(targetElm) {\r\n    var instance;\r\n\r\n    if (_typeof(targetElm) === \"object\") {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n    } else if (typeof targetElm === \"string\") {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error(\"There is no element with given selector.\");\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    } // add instance to list of _instances\r\n    // passing group to stamp to increment\r\n    // from 0 onward somewhat reliably\r\n\r\n\r\n    introJs.instances[stamp(instance, \"introjs-instance\")] = instance;\r\n    return instance;\r\n  };\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n\r\n\r\n  introJs.version = version;\r\n  /**\r\n   * key-val object helper for introJs instances\r\n   *\r\n   * @property instances\r\n   * @type Object\r\n   */\r\n\r\n  introJs.instances = {}; //Prototype\r\n\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function clone() {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function setOption(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function setOptions(options) {\r\n      this._options = mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function start() {\r\n      introForElement.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    goToStep: function goToStep$1(step) {\r\n      goToStep.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    addStep: function addStep(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function addSteps(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for (var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function goToStepNumber$1(step) {\r\n      goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function nextStep$1() {\r\n      nextStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    previousStep: function previousStep$1() {\r\n      previousStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    currentStep: function currentStep$1() {\r\n      return currentStep.call(this);\r\n    },\r\n    exit: function exit(force) {\r\n      exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function refresh$1(refreshSteps) {\r\n      refresh.call(this, refreshSteps);\r\n\r\n      return this;\r\n    },\r\n    onbeforechange: function onbeforechange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforechange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onchange: function onchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onchange was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onafterchange: function onafterchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onafterchange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    oncomplete: function oncomplete(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for oncomplete was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintsadded: function onhintsadded(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintsadded was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclick: function onhintclick(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclick was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclose: function onhintclose(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclose was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onexit: function onexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onskip: function onskip(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onskip was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onbeforeexit: function onbeforeexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforeexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    addHints: function addHints() {\r\n      populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function hideHint$1(stepId) {\r\n      hideHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    hideHints: function hideHints$1() {\r\n      hideHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    showHint: function showHint$1(stepId) {\r\n      showHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHints: function showHints$1() {\r\n      showHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHints: function removeHints$1() {\r\n      removeHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHint: function removeHint$1(stepId) {\r\n      removeHint().call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHintDialog: function showHintDialog$1(stepId) {\r\n      showHintDialog.call(this, stepId);\r\n\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n\r\n})));\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep and done\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welcti = loc.TOUR_welcti || \"<span class='tgreeting'> Welcome to our guided tour! </span>\";\r\n  loc.TOUR_welc = loc.TOUR_welc || \"This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example.\";\r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";\r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";\r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.5,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,  \r\n      'tooltipClass': 'customTooltip',\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {  \r\n          element: '#link-guided-tour',\r\n          title: loc.TOUR_welcti,\r\n          intro: loc.TOUR_welc,\r\n          position: 'right',\r\n        },\r\n        {\r\n          title: loc.TOUR_sear1ti,\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_searAnnotti,\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_annotAssti,\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          },\r\n        {\r\n          title:loc.TOUR_vccho1ti,\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vccho2ti,\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_vcStat1ti,\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vcStat2ti,\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_qlfieldti,\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          title: loc.TOUR_glimpseti,\r\n          element: doe.querySelector('#glimpse').parentNode,\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_helpti,\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_seargoti,\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions().add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (values) {\r\n      return Object.create(this)._init(values);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a default value.\r\n     * This will only be set, if no other value is set yet.\r\n     */\r\n    setIfNotYet : function (value) {\r\n      if (this.value == undefined) {\r\n        this.set(value);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      if (this.value == undefined) {\r\n        this.value = this.values[0];\r\n      };\r\n\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.get() == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions().add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to a plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          if (onClick[\"default\"] !== undefined) {\r\n            state.setIfNotYet(onClick[\"default\"]);\r\n          };\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions().addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\r\n      \r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from form\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"search\"] = window.location.search; // readonly\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        }\r\n\r\n        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\r\n        };\r\n\r\n        // data needs to be mirrored\r\n        if (d._id) {\r\n          service.sendMsg(d);\r\n        };\r\n\r\n        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    console.log(arguments);\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onload = function () {\r\n      console.log(req.responseText); //TODO this needs to be done also\r\n    }\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText +\" - \"+ JSON.parse(this.responseText).errors[0].message\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      console.log(\"JSON: \\n\",JSON.stringify(jsObj));\r\n      console.log(req);\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * CAUTION: Currently not supported by the QueryReference Plugin.\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'panel/pagination',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             paginationPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (e._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    });\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n   \r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions().element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Add pagination panel\r\n     */\r\n    const paginationPanel = paginationPanelClass.create();\r\n\r\n    if (paginationPanel) {\r\n      paginationPanel.addRandomPage();\r\n      KorAP.Panel['pagination'] = paginationPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}
\ No newline at end of file
diff --git a/public/js/korap-plugin-0.2.2.js b/public/js/korap-plugin-0.2.2.js
new file mode 100644
index 0000000..422d3f0
--- /dev/null
+++ b/public/js/korap-plugin-0.2.2.js
@@ -0,0 +1 @@
+"use strict";const cs=document.currentScript;!function(){let t={},e={create:function(){return Object.create(this)._init()},_init:function(){return this.widgetID=window.name,this.server=cs.getAttribute("data-server")||"*",this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this},sendMsg:function(t){t.originID=this.widgetID,window.parent.postMessage(t,this.server)},requestMsg:function(e,i){let n=function(){let t="";for(let e=0;e<16;e++)t+=Math.floor(16*Math.random()%16).toString(16);return"_"+t}();e._id=n,t[n]=i,this.sendMsg(e)},_receiveMsg:function(e){let i=e.data;if(i)if(i._id){let e=i._id;t[e]&&(t[e](i),delete t[e])}else this.onMessage&&this.onMessage(i)},log:function(t,e){this.sendMsg({action:"log",code:t,msg:e})},resize:function(){var t=document.documentElement,e=t.scrollHeight;t.scrollWidth>t.clientWidth&&(e+=14),this.sendMsg({action:"resize",height:e})}};window.onload=function(){window.KorAPlugin=window.KorAPlugin||e.create(),window.KorAPlugin.resize(),window.pluginit&&window.pluginit(window.KorAPlugin)}}();
\ No newline at end of file
diff --git a/public/js/korap-plugin-0.2.2.js.map b/public/js/korap-plugin-0.2.2.js.map
new file mode 100644
index 0000000..eb69a3a
--- /dev/null
+++ b/public/js/korap-plugin-0.2.2.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["dev/js/src/plugin/client.js"],"names":["cs","document","currentScript","response","obj","create","Object","this","_init","widgetID","window","name","server","getAttribute","_listener","_receiveMsg","bind","addEventListener","sendMsg","data","parent","postMessage","requestMsg","cb","id","s","i","Math","floor","random","toString","randomID","e","d","onMessage","log","code","msg","action","resize","de","documentElement","height","scrollHeight","scrollWidth","clientWidth","onload","KorAPlugin","pluginit"],"mappings":"AAyBA,aAEA,MAAMA,GAAKC,SAASC,eAEpB,WAWE,IAAIC,EAAW,GAEXC,EAAM,CAKRC,OAAS,WACP,OAAOC,OAAOD,OAAOE,MAAMC,SAM7BA,MAAQ,WAON,OANAD,KAAKE,SAAWC,OAAOC,KACvBJ,KAAKK,OAASZ,GAAGa,aAAa,gBAAkB,IAGhDN,KAAKO,UAAYP,KAAKQ,YAAYC,KAAKT,MACvCG,OAAOO,iBAAiB,UAAWV,KAAKO,WACjCP,MAITW,QAAU,SAAUC,GAClBA,EAAe,SAAIZ,KAAKE,SACxBC,OAAOU,OAAOC,YAAYF,EAAMZ,KAAKK,SAIvCU,WAAa,SAAUH,EAAMI,GAC3B,IAAIC,EAxCR,WACE,IAAIC,EAAI,GACR,IAAK,IAAIC,EAAI,EAAGA,EAAI,GAAIA,IACtBD,GAAKE,KAAKC,MAAqB,GAAdD,KAAKE,SAAa,IAAIC,SAAS,IAElD,MAAO,IAAML,EAmCFM,GACTZ,EAAU,IAAIK,EACdrB,EAASqB,GAAMD,EACfhB,KAAKW,QAAQC,IAIfJ,YAAc,SAAUiB,GAEtB,IAAIC,EAAID,EAAEb,KAIV,GAAKc,EASL,GAAIA,EAAO,IAAX,CACE,IAAIT,EAAKS,EAAO,IACZ9B,EAASqB,KACXrB,EAASqB,GAAIS,UACN9B,EAASqB,SAKhBjB,KAAK2B,WACP3B,KAAK2B,UAAUD,IAMnBE,IAAM,SAAUC,EAAMC,GACpB9B,KAAKW,QAAQ,CACXoB,OAAS,MACTF,KAAOA,EACPC,IAAMA,KAQVE,OAAS,WACP,IAAIC,EAAKvC,SAASwC,gBACdC,EAASF,EAAGG,aAGZH,EAAGI,YAAcJ,EAAGK,cACtBH,GAAU,IAEZnC,KAAKW,QAAQ,CACXoB,OAAW,SACXI,OAAWA,MAMjBhC,OAAOoC,OAAS,WACdpC,OAAOqC,WAAarC,OAAOqC,YAAc3C,EAAIC,SAK7CK,OAAOqC,WAAWR,SAEd7B,OAAOsC,UACTtC,OAAOsC,SAAStC,OAAOqC,aAtH7B","sourcesContent":["/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from foreign services.\r\n * The client component is loaded independently\r\n * in a plugin and communicates with the embedding\r\n * KorAP service.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n/*\r\n* TODO:\r\n*   Some methods require bidirectional\r\n*   calling, like\r\n*   - getKoralQuery()\r\n*   this probably should be done using a callback,\r\n*   like fetch({data}, function () {}, '*'), that will\r\n*   add a unique ID to the message and will call on the cb\r\n*   once the answer to that message arrives.\r\n*/\r\n/*\r\n * When loading the script from a remote KorAP instance,\r\n * demand using integrity check:\r\n * https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity\r\n */\r\n\"use strict\";\r\n\r\nconst cs = document.currentScript;\r\n\r\n(function () {\r\n\r\n  // Similar to randomID in server, but a bit cheaper\r\n  function randomID () {\r\n    let s = '';\r\n    for (let i = 0; i < 16; i++) {\r\n      s += Math.floor((Math.random()*16)%16).toString(16);\r\n    };\r\n    return '_' + s;\r\n  };\r\n\r\n  let response = {};\r\n  \r\n  let obj = {\r\n\r\n    /**\r\n     * Create new plugin\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize plugin\r\n     */\r\n    _init : function () {\r\n      this.widgetID = window.name;\r\n      this.server = cs.getAttribute('data-server') || '*';\r\n\r\n      // Establish the 'message' hook.\r\n      this._listener = this._receiveMsg.bind(this);\r\n      window.addEventListener(\"message\", this._listener);\r\n      return this;\r\n    },\r\n\r\n    // Send a message\r\n    sendMsg : function (data) {\r\n      data[\"originID\"] = this.widgetID;\r\n      window.parent.postMessage(data, this.server);\r\n    },\r\n\r\n    // Request data\r\n    requestMsg : function (data, cb) {\r\n      let id = randomID();\r\n      data[\"_id\"] = id;\r\n      response[id] = cb;\r\n      this.sendMsg(data);\r\n    },\r\n    \r\n    // Receive a call from the embedding platform.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      let d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // TODO:\r\n      //   check e.origin and d[\"originID\"]!!!\r\n      //   probably against window.parent!\r\n\r\n      // There is an associated callback registered:\r\n      // call and remove the function\r\n      if (d[\"_id\"]) {\r\n        let id = d[\"_id\"];\r\n        if (response[id]) {\r\n          response[id](d);\r\n          delete response[id];\r\n        };\r\n        return;\r\n      };\r\n      \r\n      if (this.onMessage)\r\n        this.onMessage(d)\r\n    },\r\n    \r\n    /**\r\n     * Send a log message to the embedding KorAP\r\n     */\r\n    log : function (code, msg) {\r\n      this.sendMsg({\r\n        action : 'log',\r\n        code : code,\r\n        msg : msg\r\n      });\r\n    },\r\n\r\n    /**\r\n     * Send a resize command to the\r\n     * embedding KorAP\r\n     */\r\n    resize : function () {\r\n      var de = document.documentElement;\r\n      var height = de.scrollHeight;\r\n\r\n      // Add assumed scrollbar height\r\n      if (de.scrollWidth > de.clientWidth) {\r\n        height += 14;\r\n      };\r\n      this.sendMsg({\r\n        'action' : 'resize',\r\n        'height' : height\r\n      });\r\n    }\r\n  };\r\n\r\n  // Create plugin on windows load\r\n  window.onload = function () {\r\n    window.KorAPlugin = window.KorAPlugin || obj.create();\r\n\r\n    // TODO:\r\n    //   Only do this in case of the client being opened\r\n    //   as a widget!\r\n    window.KorAPlugin.resize();\r\n\r\n    if (window.pluginit)\r\n      window.pluginit(window.KorAPlugin);\r\n  };\r\n\r\n})();\r\n\r\n"]}
\ No newline at end of file
diff --git a/public/js/korap-plugin-latest.js b/public/js/korap-plugin-latest.js
new file mode 100644
index 0000000..422d3f0
--- /dev/null
+++ b/public/js/korap-plugin-latest.js
@@ -0,0 +1 @@
+"use strict";const cs=document.currentScript;!function(){let t={},e={create:function(){return Object.create(this)._init()},_init:function(){return this.widgetID=window.name,this.server=cs.getAttribute("data-server")||"*",this._listener=this._receiveMsg.bind(this),window.addEventListener("message",this._listener),this},sendMsg:function(t){t.originID=this.widgetID,window.parent.postMessage(t,this.server)},requestMsg:function(e,i){let n=function(){let t="";for(let e=0;e<16;e++)t+=Math.floor(16*Math.random()%16).toString(16);return"_"+t}();e._id=n,t[n]=i,this.sendMsg(e)},_receiveMsg:function(e){let i=e.data;if(i)if(i._id){let e=i._id;t[e]&&(t[e](i),delete t[e])}else this.onMessage&&this.onMessage(i)},log:function(t,e){this.sendMsg({action:"log",code:t,msg:e})},resize:function(){var t=document.documentElement,e=t.scrollHeight;t.scrollWidth>t.clientWidth&&(e+=14),this.sendMsg({action:"resize",height:e})}};window.onload=function(){window.KorAPlugin=window.KorAPlugin||e.create(),window.KorAPlugin.resize(),window.pluginit&&window.pluginit(window.KorAPlugin)}}();
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..88e4d02
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,10 @@
+# robots.txt only applies, when KorAP is accessible
+# from the domain root.
+
+User-agent: *
+Disallow: /api/
+Disallow: /css/
+Disallow: /font/
+Disallow: /js/
+Disallow: /settings/
+Disallow: /corpus/
